尝试将string
分配给AnsiString
:
错误'隐含字符串转换,可能会导致数据丢失来自'字符串'至 ' AnsiString类型'在Delphi XE2'
中
代码:
String1 := IntToStr(instance.CurrentSpeed);
UDPSocket1.Sendln(String1);
答案 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
组件。
当Borland试图实施自己的跨平台套接字代码(放弃努力并采用Indy之前)时,Web.Win.Sockets
单元被写回Kylix时代。本单元中的组件编写得不是很好。它们迎合了跨平台的套接字API的最低通用分母方法,因此它们没有多少功能。他们没有很好地处理错误(如果有的话)。它们一般难以使用。等
最终在XE6中删除了Web.Win.Sockets
单位。 Embarcadero不再支持它(并且有充分的理由)。
你真的应该完全远离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);