сегодня у меня есть вопрос о потоковой передаче части формы в файл. В этом примере я использую Tmemo вместо файла, чтобы увидеть поток.Delphi панель потока в файл
здесь моя форма:
панель на правой верхней части формы имеет некоторые элементы управления, как метки, редактировать и так далее. с "Сохранить панель" переключатом я сохранить панель на 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;
но это не работает и на рисунке вы можете увидеть результат:
Что плохого в моей обычной, и как могу ли я прочитать весь элемент, присутствующий в потоке, а не только первый?
Может кто-нибудь помочь мне в этой головной боли?
Насколько я вижу, список, который у вас есть, это список компонентов на исходной панели, но вы пытаетесь прочитать свойства целевой панели. Свойства отсутствуют, поскольку целевая панель не определена в вашем источнике. Что вам нужно сделать, так это прочитать свойства целевой панели и поместить их в оболочку вокруг свойств встроенных компонентов, которые вы читаете, т.е. помещать данные, показанные на правой панели, непосредственно перед конечным утверждением того, что вы читаете из если это имеет смысл. – Dsm