我正在将旧代码从Delphi 5转换为XE5。
它具有这段代码:
Boolean(RecBuf[0]) := False;
RecBuf是PChar。
这在Delphi 7中有效,但在XE5中无效。
在XE5中,它给出“左侧无法分配”错误。
如何在XE5中实现此代码?
最佳答案
在Delphi 7中,PChar
是PAnsiChar
的别名。即,指向8位ANSI字符的指针。这意味着RecBuf[0]
具有类型AnsiChar
。由于AnsiChar
和Boolean
具有相同的大小,因此强制转换有效。
在Delphi XE5中,PChar
是PWideChar
的别名,是指向16位宽字符的指针。因此RecBuf[0]
的类型为WideChar
。因此,强制转换无效,因为WideChar
和Boolean
具有不同的大小。
从此处显示的代码中无法分辨出解决问题的最佳方法。您很有可能需要重新声明RecBuf
。也许需要将其声明为PAnsiChar
。尽管确实想知道为什么将字符强制转换为Boolean
。
另一种可能性是将RecBuf
声明为PChar
的原因是允许您使用索引运算符[]
,这在较早版本的Delphi中是指向字符类型的指针的特殊功能。在现代的Delphi中,可以使用{$POINTERMATH ON}
为所有类型的指针启用该功能。因此,如果您这样做了,那么RecBuf
应该是PBoolean
。
最重要的是,尽管我们可以解释为什么编译器抱怨您的代码,但我们无法为您提供确定的解决方案。