2016-01-27 6 views
-2

Я взял перерыв с портированием кода, и теперь я снова трачу на него больше времени.Преобразование OPerand несовместимо с D6 на RS10

Проблема в том, что я до сих пор застрял в голове (все отлично работает на D6: D).

Может ли кто-нибудь сказать мне, почему этот простой код не работает?

if NewSig <> NewCompressionSignature then 

E2015 Оператор не применяется к этому типу операнда

Вот определения выше:

NewCompressionSignature: TCompressionSignature = 'DRM$IG01'; 
NewSig: array[0..SizeOf(NewCompressionSignature)-1] of Char; 
+0

Какой продукт RS10? –

+0

@RobKennedy: текущая версия, RAD Studio 10 Seattle. –

+0

Пожалуйста, укажите тип 'TCompressionSignature'! – ventiseis

ответ

0

Я просто предполагаю здесь, потому что тип TCompressionSignature является не предоставляется, но я могу воспроизвести ERROR2015, если TCompressionSignature объявлен как некий ShortString, как

type 
    TCompressionSignature = String[8] 

Как вы знаете, Delphi в настоящее время использует Unicode в качестве стандартной внутренней строковой кодировки. Для причин обратной совместимости тип ShortString и другие короткие строковые типы (например, String[8]) остались без изменений. Эти строки имеют одинаковую кодировку, такую ​​как AnsiString и состоят из стандартных простых старых 1-байтовых символов (AnsiChar).

NewSig, с другой стороны, состоит из двухбайтовых символов Юникода и не может сравниваться напрямую с ShortString.

Одно решение вашей проблемы было бы заявить:

NewSig: array[0..SizeOf(NewCompressionSignature)-1] of AnsiChar; 

Другим решением было бы быть приведение к строке:

if NewSig <> String(NewCompressionSignature) then ... 

Но я бы предпочел, чтобы изменить объявление массива, если это возможно.

Ознакомьтесь с документацией short strings и about unicode - особенно если вы выполняете операции io, чтобы убедиться, что ваш вход и выход считываются и записываются с правильной кодовой страницей.

 Смежные вопросы

  • Нет связанных вопросов^_^