Готовиться к Delphi 2009 и выше при разработке с Delphi 7? - PullRequest
5 голосов
/ 12 января 2010

Я разрабатываю надстройку Word в Delphi 7, но вскоре, как вы знаете, я обновлю ее до Delphi 2010, так как в версии 2009 Delphi вводит новый тип строки UnicodeString , который соответствует ключевому слову строка . С другой стороны, согласно этой теме нам необходимо использовать WideString для связи с COM.

У меня вопрос: что мне делать, чтобы подготовиться к Delphi 2010 в будущем, в то время как в настоящее время разрабатывается в Delphi 7? В настоящее время в моем коде я использую пользовательский тип UnicodeString, идея состоит в том, что при компиляции с D7 моя строка будет WideString, при компиляции с D2009 и выше UnicodeString я вижу, что Virtual TreeView использует такую ​​технику, как следующий код:

{$ifndef COMPILER_12_UP}
type
  UnicodeString = WideString;
  PByte = PAnsiChar;
{$endif COMPILER_12_UP}

Ответы [ 4 ]

6 голосов
/ 12 января 2010

Шаг 1
Обычно вы должны придерживаться «обычных» типов, насколько это возможно: то есть String и Char
Таким образом, ваш код будет «автоматически» преобразован при обновлении.
ПРИМЕЧАНИЕ : есть несколько исключений для конкретного приложения.

Если вы этого не сделаете, вы, вероятно, столкнетесь с проблемой, с которой я столкнулся при обновлении библиотеки кода, которая в некоторых местах использовала AnsiString. Это не было проблемой в старом Delphi, когда AnsiString = String. Но, очевидно, это было проблематично, когда типы уже не были одинаковыми.

Шаг 2
Прочтите рекомендации по переходу на Unicode Delphi 2009. В нем упоминаются функции, которые обычно используются при работе со строками, поскольку предполагается, что каждый символ составляет 1 байт. Запишите их и закодируйте в соответствии с этими рекомендациями.

Шаги 3, 4 и 5
Избегайте использования условной компиляции. Ты только больше будешь себя мучить.

Шаги 6, 7, 8, 9 и 10
Не пытайтесь угадать компилятор, переопределив его внутренние типы. Вы подвергаете себя многим головным болям. Дело в том, что VCL, библиотеки времени выполнения и сторонние компоненты «понимают», что такое String . «Новое понимание» по-прежнему будет доступно при обновлении до Delphi 2009.

Если вы измените это определение, то вещи могут все еще работать в старой версии из-за неявной совместимости; однако, вероятно, что в Delphi 2009 ситуация внезапно изменится.

Помните! Тип используемой строки является важным фактором при вызовах Windows API. Windows обычно поддерживает как Ansi, так и Wide версии большинства функций. В старых Delphi версии Ansi используются по умолчанию; и из Delphi 2009 широкие версии используются по умолчанию.

Примечания
Что касается вашей озабоченности по поводу WideString в разработке COM:
Более старые версии Delphi обеспечивают автоматическое приведение типов между String и WideString - пусть ваш компилятор работает для вас, где это возможно. Очевидно, что ваши COM-интерфейсы должны быть объявлены с помощью WideString, но старайтесь избегать чего-либо еще.

EDIT
Взгляните на ссылку, предоставленную Хьюзом: Готовитесь к Delphi 2009 и выше при разработке с Delphi 7?

Также хочу подчеркнуть: каждая новая версия Delphi пытается поддерживать определенный уровень обратной совместимости (включая Delphi 2009). Если вы просто кодируете «как обычно», это вряд ли повлияет на вас в большой степени . На самом деле обратное в целом верно; чем больше вы получите фантазий , тем больше вероятность возникновения проблем.

Единственные серьезные проблемы, с которыми я когда-либо сталкивался при переходе на новые версии Delphi:

  • Сторонний код / ​​библиотеки без исходного кода.
  • Не поддерживаемый сторонний код, где их разработчики прибегали к различным «хитростям» кодирования.
  • Код Midas в Delphi 3 был особенно трудным обновлением. (Но опять же, разработчики, обходящие рекомендованные методы, были большим виновником.)
3 голосов
/ 12 января 2010
1 голос
/ 12 января 2010

Вы можете следовать одному простому правилу, которое заставит код, написанный в Delphi 7, очень легко мигрировать в мир Unicode:

Не предполагайте в любом месте , что размер Char равен 1.

Другими словами, всегда используйте

SizeOf(Char) вместо 1 в вашем коде.

Если вы пишете с этим простым правилом, ваш путь должен быть довольно гладким. Вполне возможно написать код, который будет компилироваться без изменений в обеих средах.

0 голосов
/ 12 января 2010

(Объявление нечетного пбайта VST, вероятно, является более обходным решением для того факта, что {$ pointermath on} - это D2009, и вы не можете переиндексировать pbyte в более низких версиях. Вероятно, это не связано с юникодом)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...