我将旧代码从Delphi 5转换为XE5。 它有这段代码:
Boolean(RecBuf[0]) := False;
RecBuf是PChar。 这适用于Delphi 7,但不适用于XE5。 在XE5中,它给出了#34;左侧不能指定"错误。 如何在XE5中实现此代码?
答案 0 :(得分:13)
在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
。
最重要的是,虽然我们可以解释为什么编译器会抱怨您的代码,但我们无法为您提供明确的解决方案。
答案 1 :(得分:-1)
从RecBuf名称判断,它们不是用作指向字符串的指针,而是用作指向内存中分配的缓冲区的指针。
如果我的假设正确,您可能希望将RecBuf重新声明为PByte类型的变量。
答案 2 :(得分:-1)
你不能在左边分配施法材料,你需要施放右侧。
而不是
Newtype(Whatever) := NewtypeConstant;
你应该使用
Whatever := TUnknown(constant)
在你的案例中,recbuf是一个say,byte的数组,然后在其中放入false(0),所以它应该是
Recbuf[0] := Byte(False);
或者,你知道,你可以把零放在那里。