TStream 未转换为 TString
TStream not converted to TStrings
我已经检查了流的大小,它在服务器和客户端上的大小相同,所以我认为那里没有任何数据丢失。我应该使用不同的过程从流中加载字符串吗?
客户代码:
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;
您需要创建 TStringList
对象 ConvertStreamToStrings()
returns。添加:
Result := TStringList.Create;
在调用 LoadFromStream()
之前。
当然,你也需要Free()
在你不再需要的时候返回TStringList
。
评论后编辑
此外,您需要将流的 Position
重置为 0,然后才能将其加载到 TStringList
,因此转换函数如下所示:
function ConvertStreamToStrings(ntfStream: TStream): TStringList;
begin
ntfStream.Position := 0;
Result := TStringList.Create;
Result.LoadFromStream(ntfStream, TEncoding.Default);
end;
除了 Tom 所说的之外,如果您要 willing/able 更改协议,那么 Indy 的 TIdIOHandler
class 有 sending/reading TStrings
数据的方法直接这样你就不必使用 TStream
,例如
...IOHandler.Write(NotificationStrings, True);
NotificationStrings := TStringList.Create;
...IOHandler.ReadStrings(NotificationStrings);
我已经检查了流的大小,它在服务器和客户端上的大小相同,所以我认为那里没有任何数据丢失。我应该使用不同的过程从流中加载字符串吗?
客户代码:
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;
您需要创建 TStringList
对象 ConvertStreamToStrings()
returns。添加:
Result := TStringList.Create;
在调用 LoadFromStream()
之前。
当然,你也需要Free()
在你不再需要的时候返回TStringList
。
评论后编辑
此外,您需要将流的 Position
重置为 0,然后才能将其加载到 TStringList
,因此转换函数如下所示:
function ConvertStreamToStrings(ntfStream: TStream): TStringList;
begin
ntfStream.Position := 0;
Result := TStringList.Create;
Result.LoadFromStream(ntfStream, TEncoding.Default);
end;
除了 Tom 所说的之外,如果您要 willing/able 更改协议,那么 Indy 的 TIdIOHandler
class 有 sending/reading TStrings
数据的方法直接这样你就不必使用 TStream
,例如
...IOHandler.Write(NotificationStrings, True);
NotificationStrings := TStringList.Create;
...IOHandler.ReadStrings(NotificationStrings);