CAD-страница НП | Статьи | English | Download
А.Н.Ривилис. Рекомендация для миграции - тип данных AcString
Продолжим разговор о переводе ARX-приложений под AutoCAD 2007.
Для строковых объектов в ObjectARX версий 2006 и 2007 имеется специальный класс
(тип данных) - AcString, который объявлен в файле AcString.h
(в версии 2005 и более ранних такого типа нет). Описание текстовой строки с использованием упомянутого класса выглядит
следующим образом:
AcString str;
Этот тип данных очень похож на типы CString (из библиотеки MFC) и std::string (из стандартной библиотеки - STL), но, в отличие от них, позволяет оперировать как строками, содержащими char, так и строками, содержащими wchar_t. Класс AcString имеет конструкторы, позволяющие создавать строки как типа char, так и типа wchar_t, например:
AcString sa("Строка символов char");
AcString sw(_T("Строка символов wchar_t"));
С помощью соответствующего конструктора можно создать пустую строку или строку,
инициализируемую одним символом типа char или wchar_t.
Тип AcString облегчает преобразования между типами char и wchar_t, например:
const char *pStrA1 = sa.kszPtr();
или
const char *pStrA2 = sa; // неявно вызывается (const char *)sa;
const wchar_t *pStrW1 = sa.kwszPtr();
const wchar_t *pStrW2 = sa; // неявно вызывается (const wchar_t *)sa;
Кроме того, этот класс содержит операторы/функции
конкатенации строк, поиска и выделения подстрок, получения длины строки,
форматирования, преобразования в число и т. д. и т. п. Использование
типа AcString в подавляющем большинстве случаев позволяет писать код, который будет
работать как в AutoCAD 2006, так и в AutoCAD 2007, и последующих.
Например, такая запись правильно сработает в обоих
версиях AutoCAD:
acedPrompt (AcString("\nПечатаем строку"));
Следует быть осторожным только при вызове функций с переменным число аргументов ≈ например, acutPrintf с числом аргументов больше одного, а также acedCommand, acutBuildList, т.к. компилятор не в состоянии однозначно понять, какой тип следует передать. В этом случае предпочтительнее использовать методы AcString::kszPtr() или AcString::kwszPtr() для явной идентификации типа данных. На основе этого класса очень удобно делать макросы для передачи нужного типа в функции, например:
#ifndef INC_UNI_H
#include <AcString.h>
#define INC_UNI_H
#if defined(ACADR17)
// Конвертация из UNICODE в ANSI
#define W2C(x) ((const char *)AcString(x))
// Конвертация из ANSI в UNICODE
#define C2W(x) ((const wchar_t *)AcString(x))
#else
#define W2C(x) (x)
#define C2W(x) (x)
#endif
#endif
Если при компиляции проекта с помощью ObjectARX 2006 установлен идентификатор препроцессора ACADR16, а при компиляции с помощью ObjectARX 2007 - ACADR17, то строки
char *str1 = "\nПечатаю строку <%s>";
char *str2 = "---моя строка---";
acutPrintf(C2W(str1), C2W(str2));
будут скомпилированы и отработают правильно в обеих версиях AutoCAD.
Аналогично скомпилируется без ошибок и нормально выполнится следующее выражение:
acedCommand (RTSTR, C2W("_.LINE"), RTSTR, C2W("0,0"), RTSTR, C2W("10,10"), RTNONE);
CAD-страница НП | Статьи | English | Download