Компонент записи Delphi не передает потоковые дочерние элементы или несколько компонентов

#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, пожалуйста, добавьте свой комментарий в качестве ответа, и я приму его.