#delphi
#delphi
Вопрос:
Я пытался передать содержимое TTabSheet в потоковом режиме, но WriteComponent передает только объект TTabSheet, но не элементы управления на нем.
Чтобы обойти это, я подумал, что мог бы передавать потоком все элементы управления на tabsheet, используя следующий код, но это передает только первый элемент управления.
procedure TfrmMain.SaveComponentToFile(Component: TComponent; const FileName: TFileName);
var
FileStream : TFileStream;
MemStream : TMemoryStream;
i: integer;
begin
MemStream := nil;
if not Assigned(Component) then raise Exception.Create('Component is not assigned');
FileStream := TFileStream.Create(FileName,fmCreate);
try
MemStream := TMemoryStream.Create;
//ShowMessage(IntToStr(TTabSheet(Component).ControlCount));
for i := 0 to TTabSheet(Component).ControlCount - 1 do begin
Memstream.WriteComponent(TTabSheet(Component).Controls[i]);
end;
MemStream.Position := 0;
ObjectBinaryToText(MemStream, FileStream);
finally
MemStream.Free;
FileStream.Free;
end;
end;
Закомментированное ShowMessage действительно показывает правильное количество элементов управления на таблице tabsheet, так почему цикл не передает потоковую передачу всех 35 компонентов?
Комментарии:
1. WriteComponent работает по принадлежности, поэтому он в основном использует свойство Components таблицы tabsheet и оттуда работает по иерархии. Элементы управления — это отношения родитель / потомок, компоненты — это отношения владения. Самым простым решением было бы, если бы вы могли сделать таблицу tabsheet владельцем этих компонентов.
2. ObjectBinaryToText также считывает такую иерархию. Он начнется с первого объекта, и когда это закончится, он не будет ожидать ничего другого в потоке.
3. Чтобы прояснить мой первый комментарий: обычно форма владеет компонентами, даже если таблица вкладок является их родительской.
4. Спасибо @GolezTrol, пожалуйста, добавьте свой комментарий в качестве ответа, и я приму его.