Почему некоторые компоненты Delphi требуют "AOwner: TComponent" для их создания?

Кажется совершенно неуместным требовать от TComponent как владельца создавать экземпляр какого-либо объекта. Почему так много компонентов Delphi требуют этого?

Например, для TXMLDocument требуется экземпляр объекта TComponent.

Почему это и если есть веская причина, что я должен использовать там, чтобы "делать правильные вещи"?

Ответ 1

Компонент владельца должен управлять всеми принадлежащими ему компонентами. Собственные компоненты автоматически уничтожаются при уничтожении владельца.

Это помогает разработчику, который просто перетаскивает компоненты из палитры инструментов, бросает их в форму и просто подключает события, чтобы выполнить свою работу, не беспокоясь об управлении временем жизни компонентов.

Форма является владельцем всех компонентов, упавших на нее. Объект Application является владельцем формы. Когда приложение закрыто, объект Application уничтожается, что в свою очередь уничтожает формы и все компоненты.

Но владелец не нужен, когда создаются компоненты. Если вы передадите параметр Nil в параметр, компонент будет создан без владельца, и в этом случае вы будете нести ответственность за управление временем жизни компонента.

Ответ 2

Все потомки TComponent требуют владельца, он определен в конструкторе TComponent. Компонент Owner отвечает за уничтожение всех Собственных компонентов.

если вы хотите контролировать время жизни, вы можете передать nil как параметр.

Ответ 3

Просто добавьте дополнительную информацию.

Каждый элемент управления также имеет родительский элемент. (A TWinControl). Если владелец позаботится о жизни, родитель позаботится о показе объекта.

Например, форма имеет панель и панель имеет кнопку. В этом случае форма принадлежит панели и кнопке. Но форма является родительским элементом панели, а панель является родительским элементом кнопки.

Ответ 4

Есть еще кое-что, о чем нужно знать. Я использовал больше, чем несколько сторонних компонентов, которые полагаются на компонент Owner, передаваемый в конструкторе Create, и если вы пройдете в Nil, вы получите исключение /AV.

Конечным результатом является то, что эти компоненты будут работать нормально, когда вы будете визуально использоваться внутри среды IDE, но создавайте проблемы, когда они создаются во время выполнения.

Причиной этих проблем является, в некотором смысле, плохой дизайн. Ничто в правилах не означает, что вы не можете/не должны передавать NIL в качестве параметра aOwner.

Ответ 5

Объект не REQUIRE передается tComponent как AOwner. Вы можете легко пройти мимо этого и справиться с разрушением самостоятельно. Чаще всего я склонен использовать этот метод для локализованных подпрограмм, где используемый компонент не будет использоваться за пределами текущего метода. например:

Procedure TForm1.Foo;
var
  XmlDoc : tXmlDocument;
begin
  XmlDoc := tXmlDocument.Create(nil);
  try
    // do processing of the XMLDoc here
  finally
    FreeAndNil(XmlDoc); 
  end;
end;

Ответ 6

Вы можете использовать это по двум причинам: - механизм собственности также является своеобразной системой сбора мусора - механизм владения важен в процессе сериализации Delphi (Stream.ReadComponent/WriteComponent и т.д.).

Ответ 7

Параметр Owner необходим только для потомков TComponent, так как он является параметром конструктора TComponent. Все компоненты, доступные во время разработки для отбрасывания классов TForm, TFrame и TDataModule, являются TComponent потомками (включая TXMLDocument).