在Delphi XE2中抛出异常错误

时间:2016-03-02 07:16:51

标签: delphi delphi-xe2

尝试将string分配给AnsiString

时获取以下错误
  

错误'隐含字符串转换,可能会导致数据丢失来自'字符串'至   ' AnsiString类型'在Delphi XE2'

代码:

String1 := IntToStr(instance.CurrentSpeed);
UDPSocket1.Sendln(String1);

1 个答案:

答案 0 :(得分:1)

IntToStr()返回String。在Delphi 2009+中,String映射到UnicodeString。但是,TUdpSocket.Sendln()方法需要AnsiString。由于您要将UnicodeString传递给Sendln(),因此必须执行运行时转换,并且将Unicode数据转换为Ansi对于Unicode字符而言可能是有损的> $ 007F。这就是编译器警告你的内容。编译器无法在编译时验证此类转换的结果。

要消除警告,您需要使用显式类型转换,以便编译器知道您了解风险并已接受它(在这种情况下可以,因为IntToStr()仅返回ASCII字符转换为Ansi时没有损失):

UDPSocket1.Sendln(AnsiString(String1));

更好的解决方案是首先停止使用TUdpSocket组件。

  1. 当Borland试图实施自己的跨平台套接字代码(放弃努力并采用Indy之前)时,Web.Win.Sockets单元被写回Kylix时代。本单元中的组件编写得不是很好。它们迎合了跨平台的套接字API的最低通用分母方法,因此它们没有多少功能。他们没有很好地处理错误(如果有的话)。它们一般难以使用。等

  2. 最终在XE6中删除了Web.Win.Sockets单位。 Embarcadero不再支持它(并且有充分的理由)。

  3. 你真的应该完全远离Web.Win.Sockets单元中的组件。

    例如,Indy 10与Delphi一起发货。它有一个TIdUDPClient组件,您可以使用它,它完全支持Unicode字符串。例如:

    String1 := IntToStr(instance.CurrentSpeed);
    // Send() supports an optional byte encoding when converting the string data to bytes
    IdUDPClient1.Send('host', port, String1+EOL);
    

    或者:

    IdUDPClient1.Host := 'host';
    IdUDPClient1.Port := port;
    ...
    String1 := IntToStr(instance.CurrentSpeed);
    // Send() supports an optional byte encoding when
    // converting the string data to bytes for transmission
    IdUDPClient1.Send(String1+EOL);