Почему для некоторых компонентов Delphi требуется “AOwner:TComponent” Для Их построения?

StackOverflow https://stackoverflow.com/questions/474448

  •  19-08-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

Предполагается, что компонент-владелец управляет всеми принадлежащими ему компонентами.Принадлежащие компоненты уничтожаются автоматически, когда уничтожается владелец.

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

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

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

Другие советы

Для всех потомков TComponent требуется Владелец, он определен в конструкторе TComponent.Компонент-Владелец несет ответственность за уничтожение всех принадлежащих компонентов.

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

Просто чтобы добавить немного дополнительной информации.

У каждого элемента управления также есть родительский элемент.(Двойной контроллер).Там, где владелец заботится о времени жизни, родитель заботится о показе объекта.

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

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

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

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

Объект не ТРЕБОВАТЬ TComponent должен быть передан как владелец.Вы можете легко передать этому значение nil и справиться с уничтожением самостоятельно.Чаще всего я склонен использовать этот метод для локализованных подпрограмм, где используемый компонент не будет использоваться вне текущего метода.например:

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top