今天我的问题涉及到将表单的一部分流式传输到文件中。 在此示例中,我使用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;
但它没起作用,你可以在下面的图片中看到结果:
我的程序有什么问题,我怎样才能读取流中的所有元素而不是仅仅第一个元素?
有人能帮我解决这个头疼的问题吗?