今天我有一个关于将表单的一部分流式传输到文件的问题。
在此示例中,我使用 Tmemo 而不是文件来查看流。
这是我的表格:
表单右上角的面板有一些控件,如标签、编辑等。
使用“保存面板”按钮将面板保存在 TStream 上:
这里是代码:
procedure TfrmMain.btnSaveClick(Sender: TObject);
var
idx: Integer;
MemStr: TStream;
begin
MemStr := TMemoryStream.Create;
PanelStr := TMemoryStream.Create;
try
for idx := 0 to pnlSource.ControlCount - 1 do begin
MemStr.Position := 0;
MemStr.WriteComponent(pnlSource.Controls[idx]);
StreamConvert(MemStr);
end;
PanelStr.Position := 0;
mmoStream.Lines.LoadFromStream(PanelStr);
finally
MemStr.Free;
end;
end;
这里是 StreamConvert:
{ Conversione stream in formato testo }
procedure TfrmMain.StreamConvert(aStream: TStream);
var
ConvStream: TStream;
begin
aStream.Position := 0;
ConvStream := TMemoryStream.Create;
try
ObjectBinaryToText(aStream, ConvStream);
ConvStream.Position := 0;
PanelStr.CopyFrom(ConvStream, ConvStream.Size);
lblStreamSize.Caption := IntToStr(ConvStream.Size);
finally
ConvStream.Free;
end;
end;
PanelStr 是在表单的私有部分中声明并在表单创建期间创建的 TStream 对象。
这部分效果很好,正如您在图像的右侧部分看到的那样,表单上出现的元素已正确注册。
现在我的问题是将此元素恢复到表单左下角的面板中。
我尝试过这个例程:
{ Carica i controlli presenti nel pannello pnlSource in uno stream }
procedure TfrmMain.btnLoadClick(Sender: TObject);
var
idx: Integer;
MemStr: TStream;
begin
pnlSource.Free;
MemStr := TMemoryStream.Create;
try
PanelStr.Position := 0;
ObjectTextToBinary(PanelStr, MemStr);
MemStr.Position := 0;
MemStr.ReadComponent(pnlTarget);
finally
MemStr.Free;
end;
end;
但它不起作用,在下图中您可以看到结果:
我的例程出了什么问题,如何读取流中存在的所有元素而不仅仅是第一个元素?
有人可以帮助我解决这个头痛问题吗?