C ++ Builder> TControl.Parent свойство> родитель освобождает детей? - PullRequest
0 голосов
/ 11 декабря 2018

Мое окружение:

C++ Builder 10.2 Tokyo on Windows 10 v1809

У меня есть вопрос о свойстве TControl.Parent.

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    TPanel *pnlptr = new TPanel(/*AOwner=*/this);
    TLabel *lblptr = new TLabel(/*AOwner=*/this);
    lblptr->Parent = pnlptr;

    // some processing

    //delete lblptr;
    delete pnlptr;
}

Освобождает ли приведенный выше код lblptr?

Вдокумент (хотя за 2009 год) Свойство TControl.Parent

Примечание. Свойство Parent, объявленное в TControl, аналогично свойству Owner, объявленному в TComponent, в том смысле, что Parent элемента управленияОсвобождает контроль так же, как Владелец компонента освобождает этот Компонент.

С примечанием я думаю, что когда pnlptr освобожден, lblptr также освобождается без delete lblptr.

Это правильно?

1 Ответ

0 голосов
/ 11 декабря 2018

Приведенный выше код освобождает lblptr?

Да, это так.После освобождения TPanel его базовый деструктор TWinControl освобождает все компоненты, которые все еще находятся в свойстве Controls[] (элементы управления, для которых Parent установлено как *1009*):

destructor TWinControl.Destroy;
var
  I: Integer;
  Instance: TControl;
begin
  ...
  I := ControlCount;
  while I <> 0 do
  begin
    Instance := Controls[I - 1];
    Remove(Instance);
    Instance.Destroy; // <-- FREED HERE
    I := ControlCount;
  end;
  ...
end;
...