从D6转换为RS10的OPerand不匹配

时间:2016-01-27 22:19:20

标签: delphi porting mismatch delphi-6 delphi-10-seattle

我从移植代码中休息了一段时间,现在我又花了一些时间在它上面。

问题是,我想我仍然倒在脑后(D6上的一切正常:D)。

有谁能告诉我为什么这个简单的代码不起作用?

if NewSig <> NewCompressionSignature then
  

E2015运算符不适用于此操作数类型

以下是上述定义:

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

1 个答案:

答案 0 :(得分:0)

我只是在猜这里,因为没有给出TCompressionSignature的类型,但如果ERROR2015被声明为某种TCompressionSignature,那么我可以重现ShortString < / p>

type
  TCompressionSignature = String[8]

您可能知道,Delphi目前使用Unicode作为其标准内部字符串编码。出于向后兼容性原因,类型ShortString和其他短字符串类型(如String[8])保持不变。这些字符串具有与AnsiString相同的编码,并由标准的普通旧1字节字符(AnsiChar)组成。

另一方面,

NewSig由双字节Unicode字符组成,无法直接与ShortString进行比较。

您的问题的一个解决方案是声明:

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

另一个解决方案是强制转换为字符串:

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

但我希望尽可能改变数组声明。

请查看文档short stringsabout unicode - 特别是如果您正在执行操作以确保使用正确的代码页读取和写入输入和输出。