Как отключить юникод в Delphi xe2 - PullRequest
11 голосов
/ 20 марта 2012

Есть ли способ сделать это?

В настоящее время я использую 2007 и ищу обновление, но очень неприятно пытаться заставить эту новую версию сделать что-нибудь.

Новое поведение char, strings и Pchar в xe2 убивает практически все приложения и сторонние компоненты, которые я на нем пробовал.

Есть ли опция компилятора, обеспечивающая совместимость с D2007. ?

Ответы [ 3 ]

14 голосов
/ 20 марта 2012

Нет способа отключить UNICODE в Delphi XE2 (или любой версии, более поздней, чем 2009), однако есть много ресурсов, которые могут помочь вам перенести ваше приложение:

5 голосов
/ 21 марта 2012

Если бы для Delphi 2009/2010 / XE / XE2 («Unicode-версия») был «Ansi switch», вы бы просто заменили проблему, которая у вас сейчас есть, на гораздо худшие проблемы.

По этой причине не может быть переключателя. Эта идея была тщательно обсуждена, я узнал об этом из первых рук с людьми, которые приняли решение, и решение о нарушении вашего кода не было принято без должной осмотрительности. Другого пути просто не было. Чтобы сделать Delphi по-настоящему Unicode, необходимо было указать псевдоним String = UnicodeString.

Таким образом, вы должны изменить все свои String объявления на AnsiString и Char на AnsiChar, если вы хотите, чтобы в коде приложения были однобайтовые символы не-юникода и строковые типы. В большинстве вашего кода и в большинстве мест это не обязательно. Но там, где вам явно требуется обработка в байтовом размере, например, двоичные протоколы через RS232 и RS485 или двоичные форматы файлов (EDA и т. Д.), Вам необходимо изменить код.

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

Когда вы доберетесь до границы XE / XE2, вы можете столкнуться с еще большей болью, связанной с предположениями вашего кода о том, что типы указателей имеют тот же размер, что и Integer или Cardinal, что больше не соответствует действительности в Win64. Опять же, ребята из Delphi не хотят ломать ваш код, они просто следуют нормальным инженерным практикам, в этом случае Win64 диктует определенные вещи.

Почему они не изменили каждое свойство элемента управления VCL на USTRING вместо String? Почему они не заставляют каждую функцию RTL принимать и USTRING, и STRING и обеспечивать перегрузки?

Потому что нормативная разработка Delphi теперь является чисто Unicode. USTRING есть и будет частным случаем. String является нативным (нормативным) строковым типом, и на самом деле он теперь также известен как UnicodeString.

Так получилось, что вы уже использовали псевдоним типа. Строки в Delphi 1.0 были ограничены 255 символами в длину. Когда они представили Delphi 2.0 и тип длинной строки, внутренне называемый AnsiString, они назвали существующий общий тип String как String=AnsiString. Когда мы добрались до Unicode, каждый компонент VCL и каждый метод VCL, который принимает строку, все еще принимает строку. Однако String теперь String=UnicodeString.

Delphi 7 уже имеет WideString например. Нам не нужно переходить на полпути к юникоду. Понимаете ли вы это или нет, весь мир разработки программного обеспечения теперь ожидает, что строковые типы будут в юникоде. Delphi является частью глобального явления. Интернет - это юникод. Ваша операционная система Windows 7 является чистым родным Unicode.

0 голосов
/ 09 апреля 2015

Существует неофициальный взлом , но он принесет больше проблем, которые решают.

...