TStream未转换为TStrings

时间:2015-03-16 09:50:22

标签: delphi indy10

我已经检查了流的大小,并且服务器和客户端的大小都相同,所以我认为没有任何数据丢失。我应该使用不同的过程从流中加载字符串吗?

客户代码:

StreamSize:= TCPClient.IOHandler.ReadInt64;  //<Size of TStream

TCPClient.IOHandler.ReadStream(TStream(NotificationStream), StreamSize);

NotificationStrings := ConvertStreamToStrings(NotificationStream);
Notifications := ConvertStringsToNotifications(NotificationStrings);

Synchronize(procedure begin PutNotifications(Notifications); end);
StreamSize:= 0;

转换流功能:

function ConvertStreamToStrings(ntfStream : TStream) : TStringList;
begin
  Result := TStringList.Create;
  Result.LoadFromStream(ntfStream, TEncoding.Default);
end;

2 个答案:

答案 0 :(得分:4)

您需要创建TStringList返回的ConvertStreamToStrings()对象。加上这个:

Result := TStringList.Create;
在致电LoadFromStream()之前

当然,当您不再需要时,还需要{{1>} 返回 Free()

评论后修改

此外,您需要将流的TStringList重置为0,然后才能将其加载到Position,因此转换功能如下所示:

TStringList

答案 1 :(得分:0)

除了汤姆所说的,如果你愿意/能够改变你的协议,那么Indy的TIdIOHandler课程有直接发送/阅读TStrings数据的方法,所以你不要; t必须使用TStream,例如

...IOHandler.Write(NotificationStrings, True);

NotificationStrings := TStringList.Create;
...IOHandler.ReadStrings(NotificationStrings);