7

今天我尝试在 XE4 中编译我的 XE3 项目。我面临的第一个问题是 Indy 的 FTCPClient.Socket.ReadBytes() 方法。

之前它接受 TBytes 类型,现在它坚持使用 TidBytes。

定义: TIdBytes = 字节数组;TBytes,我不确定我猜它是泛型的东西,比如 TArray,它是字节数组。

问题 1:为什么编译器会抱怨说'[dcc32 Error] HistoricalStockData.pas(298): E2033 Types of actual and form var 参数必须相同'。正如我所见,它们已经相同。

问题 2:我应该用每个新的 delphi 版本修改我的源代码吗?

谢谢。

4

3 回答 3

8

原因TIdBytes是早期 Indy 10 版本中的一个简单别名TBytes主要是为了兼容SysUtils.TEncoding,它使用TBytes. Indy 的TIdTextEncodingtype 曾经是SysUtils.TEncodingD2009+ 中的简单别名,所以TIdBytes需要是简单别名TBytes才能匹配。

然而,TBytes在 XE3 中给 Indy 带来了相当多的麻烦,主要是因为泛型的 RTTI 问题(在最近的 Delphi 版本中TBytes是一个简单的别名)。TArray<Byte>因此,Indy 10.6 重新设计TIdTextEncoding为完全不再依赖SysUtils.TEncoding(这样做还有其他原因),然后允许TIdBytes更改为自己的数组类型以避免 XE3 问题向前发展。

另一方面,您传递了TBytesaTIdBytes预期的位置,因此您的编程很糟糕,因为您一开始就没有遵循 Indy 定义的接口。Indy 10 的所有基于字节的操作,包括ReadBytes(),始终TIdBytes只对。TIdBytes静默映射到的事实是TBytes您不应该在代码中依赖的实现细节。Indy 10 期望TIdBytes, 所以使用TIdBytes, 那么你不会有关于不兼容类型的编译器错误。

于 2013-05-02T16:24:59.930 回答
3

以下两个声明并不相同,尽管它们看起来是一样的。它们不是赋值兼容的,即使它们都基于array of string.

type
  TStringArrayOne = array of string;
  TStringArrayTwo = array of string;

var
  AVar1, AVar2: TStringArrayOne;
  AVar3, AVar4: TStringArrayTwo;
begin
  AVar1 := TStringArrayOne.Create('a', 'b', 'c');   // Compiles
  AVar2 := TStringArrayTwo.Create('a', 'b', 'c');   // Won't compile

  AVar3 := TStringArrayTwo.Create('a', 'b', 'c');   // Compiles
  AVar4 := TStringArrayOne.Create('a', 'b', 'c');   // Won't compile
end;

所以TBytesandTIdBytes不是同一种类型,即使它们都被定义为 being array of Byte

关于您的问题2:这是一些第三方代码的常见问题。Indy 尤其以做​​出破坏向后兼容性的更改而闻名,因为他们决定在版本之间重新组织或重写事物。Indy 10 是对 Indy 9、IIRC 的重大更改,如果您更新到 Indy 的更高版本(即使没有同时更新 Delphi),几乎需要重写大多数使用它的代码。如果您不想处理这些更改,您可能需要考虑使用更稳定的 IP 通信包。有几个可用的也是免费的开源软件包。

于 2013-05-02T15:17:40.390 回答
2

在 Indy 10.5.9 中,类型 TIdBytes 的定义不同,具体取决于现有 TBytes 类型的存在 - 参见单元 IdGlobal:

  {$IFDEF HAS_TBytes}
  TIdBytes = TBytes;
  {$ELSE}
  TIdBytes = array of Byte;
  {$ENDIF}

在 Indy 10.6(包含在 XE4 中)中,声明更改为无条件

  TIdBytes = array of Byte;

这意味着从 Indy 10.6 开始,IdGlobal.TIdBytes 与 SysUtils.TBytes 不同。

第二个问题很难回答,它更多的是关于您的优先事项的问题——其他库也不能免于更改,例如提高性能或类型安全性。此外,Delphi 语言的更改总是会影响现有代码。

于 2013-05-02T15:38:15.263 回答