Delphi Ownership Confusion

Я всегда думал, что владелец несет ответственность за уничтожение визуальных элементов управления и что я могу вручную управлять разрушением, если я передаю nil как владелец.

] Рассмотрим следующий пример:

TMyForm = class (TForm)
private
  FButton : TButton;
end;

...
FButton := TButton.Create(nil);   // no owner!!
FButton.Parent := Self;

Я ожидал, что эта кнопка вызовет утечку памяти, но этого не произошло, и фактически вызывается деструктор TButton .

Дальнейшее исследование показало, что ] Деструктор TWinControl содержит следующий фрагмент кода:

I := ControlCount;
while I <> 0 do
begin
  Instance := Controls[I - 1];
  Remove(Instance);
  Instance.Destroy;
  I := ControlCount;
end;

, который выглядит так, как будто он уничтожает дочерние компоненты (те, у которых Parent установлен для самого элемента управления).

Я не ожидал родительский элемент управления, чтобы уничтожить элемент управления. Кто-нибудь может объяснить, почему это происходит? И кто уничтожит объект, если я передам владельца?

24
задан jpfollenius 16 August 2011 в 08:43
поделиться