Я всегда думал, что владелец несет ответственность за уничтожение визуальных элементов управления и что я могу вручную управлять уничтожением, если я передаю 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
установлен сам контроль).
Я не ожидал, что родительский элемент управления уничтожит элемент управления. Может ли кто-нибудь объяснить, почему это происходит? И кто разрушает объект, если я передаю владельцу?