我正在将旧代码从Delphi 5转换为XE5。
它具有这段代码:

Boolean(RecBuf[0]) := False;


RecBuf是PChar。
这在Delphi 7中有效,但在XE5中无效。
在XE5中,它给出“左侧无法分配”错误。
如何在XE5中实现此代码?

最佳答案

在Delphi 7中,PCharPAnsiChar的别名。即,指向8位ANSI字符的指针。这意味着RecBuf[0]具有类型AnsiChar。由于AnsiCharBoolean具有相同的大小,因此强制转换有效。

在Delphi XE5中,PCharPWideChar的别名,是指向16位宽字符的指针。因此RecBuf[0]的类型为WideChar。因此,强制转换无效,因为WideCharBoolean具有不同的大小。

从此处显示的代码中无法分辨出解决问题的最佳方法。您很有可能需要重新声明RecBuf。也许需要将其声明为PAnsiChar。尽管确实想知道为什么将字符强制转换为Boolean

另一种可能性是将RecBuf声明为PChar的原因是允许您使用索引运算符[],这在较早版本的Delphi中是指向字符类型的指针的特殊功能。在现代的Delphi中,可以使用{$POINTERMATH ON}为所有类型的指针启用该功能。因此,如果您这样做了,那么RecBuf应该是PBoolean

最重要的是,尽管我们可以解释为什么编译器抱怨您的代码,但我们无法为您提供确定的解决方案。

08-06 17:36