【发布时间】:2014-10-07 13:31:37
【问题描述】:
我正在将旧代码从 Delphi 5 转换为 XE5。 它有这段代码:
Boolean(RecBuf[0]) := False;
RecBuf 是 PChar。 这在 Delphi 7 中有效,但在 XE5 中无效。 在 XE5 中,它给出“左侧无法分配”错误。 如何在 XE5 中实现这段代码?
【问题讨论】:
标签: delphi
我正在将旧代码从 Delphi 5 转换为 XE5。 它有这段代码:
Boolean(RecBuf[0]) := False;
RecBuf 是 PChar。 这在 Delphi 7 中有效,但在 XE5 中无效。 在 XE5 中,它给出“左侧无法分配”错误。 如何在 XE5 中实现这段代码?
【问题讨论】:
标签: delphi
在 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。
最重要的是,虽然我们可以解释编译器抱怨您的代码的原因,但我们无法为您提供明确的解决方案。
【讨论】:
从 RecBuf 名称来看,它们不是用作指向字符串的指针,而是用作指向在内存中分配的缓冲区的指针。
如果我的假设正确,您可能需要将 RecBuf 重新声明为 PByte 类型的变量。
【讨论】:
你不能在左边分配施法的东西,你需要施法到右边。
代替
Newtype(Whatever) := NewtypeConstant;
你应该使用
Whatever := TUnknown(constant)
在你的情况下,recbuf 是一个字节数组,然后它会在其中放入 false (0),所以它应该是
Recbuf[0] := Byte(False);
或者你可以,你知道的,把零放在那里。
【讨论】: