我正在与xe6中的代码共享一个项目,我正在使用xe2版本16.我收到此错误
There is no overloaded version of 'write' that can be called with these arguments
此代码。
{$IF CompilerVersion >= 19}
// Modified code for Delphi XE5 & later
tcpConnection.IOHandler.Write(TheMsg, IndyTextEncoding.Default );
{$ELSE}
// Original XE2 code
tcpConnection.IOHandler.Write(TheMsg, TIdTextEncoding.Default);
{$IFEND}
我还在使用中添加了idGlobal
。这会导致错误的任何其他原因吗?
答案 0 :(得分:7)
IndyTextEncoding()
是一系列重载函数,都采用输入参数,都返回IIdTextEncoding
接口:
function IndyTextEncoding(AType: IdTextEncodingType): IIdTextEncoding; overload;
function IndyTextEncoding(ACodepage: Word): IIdTextEncoding; overload;
function IndyTextEncoding(const ACharset: String): IIdTextEncoding; overload;
{$IFDEF DOTNET}
function IndyTextEncoding(AEncoding: System.Text.Encoding): IIdTextEncoding; overload;
{$ENDIF}
{$IFDEF HAS_TEncoding}
function IndyTextEncoding(AEncoding: TEncoding): IIdTextEncoding; overload;
{$ENDIF}
IIdTextEncoding
没有Default
属性(或任何其他编码类型属性)。引入IIdTextEncoding
是为了摆脱Embarcadero的TEncoding
课程,并简化Indy对代码页/字符集处理程序的内存管理。
在早期版本的Indy中,TIdTextEncoding.Default
属性表示操作系统默认编码。在最新版本的Indy中获取操作系统默认编码的正确方法是使用IndyTextEncoding_OSDefault()
函数:
function IndyTextEncoding_OSDefault: IIdTextEncoding;
或IndyTextEncoding(IdTextEncodingType)
函数,其中encOSDefault
作为输入参数。
{$IF CompilerVersion >= 19}
// Modified code for Delphi XE5 & later
tcpConnection.IOHandler.Write(TheMsg, IndyTextEncoding_OSDefault);
// or: tcpConnection.IOHandler.Write(TheMsg, IndyTextEncoding(encOSDefault));
{$ELSE}
// Original XE2 code
tcpConnection.IOHandler.Write(TheMsg, TIdTextEncoding.Default);
{$IFEND}
相比之下,IndyTextEncoding_Default()
函数返回一个IIdTextEncoding
,表示Indy的默认编码,该编码在IdGlobal.GIdDefaultTextEncoding
变量中指定(默认为7位ASCII)。
如果您想在不使用{$IFDEF}
的情况下使用适用于两种Indy版本的内容,请使用已弃用的IndyOSDefaultEncoding()
函数:
function IndyOSDefaultEncoding{$IFNDEF DOTNET}(const AOwnedByIndy: Boolean = True){$ENDIF}: IIdTextEncoding;
tcpConnection.IOHandler.Write(TheMsg, IndyOSDefaultEncoding);
话虽如此,请注意,操作系统默认编码因机器而异,从一个平台到另一个平台。您不应该将它用作通信协议中的字节编码。请使用标准化编码,例如UTF-8。
最后,如果您要使用{$IFDEF}
或{$IF}
,Indy在{$DEFINE}
中有自己的IdCompilerDefines.inc
语句,在IdGlobal.pas
中有全局版本常量,您可以用来检测Indy版本。您可以考虑使用它们而不是CompilerVersion
常量。例如,如果您要在XE2中升级Indy,那么您的代码就会中断。您应该检查Indy版本,而不是编译器/ RTL版本,例如:
// Indy version constants were added in 10.5.9.4850
// TIdTextEncoding was replaced with IIdTextEncoding in 10.6.0.0
{$IF (gsIdVersionMajor > 10) OR ((gsIdVersionMajor = 10) AND (gsIdVersionMinor >= 6))}
tcpConnection.IOHandler.Write(TheMsg, IndyTextEncoding_OSDefault);
{$ELSE}
tcpConnection.IOHandler.Write(TheMsg, TIdTextEncoding.Default);
{$IFEND}