加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

TBytes和TidBytes之间的Delphi XE4 Indy兼容性问题

发布时间:2020-12-15 04:09:44 所属栏目:大数据 来源:网络整理
导读:今天我尝试在XE4中编译我的XE3项目.我面临的第一个问题是使用Indy的FTCPClient.Socket.ReadBytes()方法. 在它接受TBytes类型之前,现在它坚持使用TidBytes. 定义: TIdBytes =字节数组; TBytes,我不确定我猜它是泛型类似于TArray的字节数组. 问题1: 为什么编
今天我尝试在XE4中编译我的XE3项目.我面临的第一个问题是使用Indy的FTCPClient.Socket.ReadBytes()方法.

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

定义:
TIdBytes =字节数组;
TBytes,我不确定我猜它是泛型类似于TArray的字节数组.

问题1:
为什么编译器抱怨说'[dcc32 Error] HistoricalStockData.pas(298):E2033实际和正式var参数的类型必须相同’.我认为它们已经相同了.

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

谢谢.

解决方法

TIdBytes是早期Indy 10版本中TBytes的简单别名的原因主要是为了与使用TBytes的SysUtils.TEncoding兼容. Indy的TIdTextEncoding类型曾经是D2009中SysUtils.TEncoding的简单别名,因此TIdBytes必须是TBytes匹配的简单别名.

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

另一方面,你传递的是TBytes,其中TIdBytes是预期的,所以这是因为你首先没有遵循Indy定义的接口而编程错误.所有Indy 10的基于字节的操作(包括ReadBytes())始终仅在TIdBytes上运行. TIdBytes静默映射到TBytes的事实是一个实现细节,您不应该依赖于您的代码. Indy 10需要TIdBytes,所以使用TIdBytes,那么就不会有关于不兼容类型的编译器错误.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读