没有重载版本的写入

时间:2014-10-31 07:06:33

标签: delphi delphi-xe2 indy delphi-xe6

我正在与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。这会导致错误的任何其他原因吗?

1 个答案:

答案 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}
相关问题