Форум: "Основная";
Текущий архив: 2003.06.12;
Скачать: [xml.tar.bz2];
ВнизОтношения наследования и владения. Найти похожие ветки
← →
Maks Realov (2003-05-30 12:23) [0]Вопрос: если уничтожаем владельца, то все компоненты, которыми он владеет уничтожаются и ресурсы освобождаются. А если уничтожить родителя, то что? Объект разрушается, а ссылка остаётся? Или тоже ресурсы освобождаются? Пример: на форме есть Panel1 на ней Button1, на форме ещё Button2 и Button3, имеем:
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(Button1.Owner.Name);
ShowMessage(Button1.Parent.Name);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Panel1.Free; // ресурсы из-под Button1 "чистятся"?
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
if Assigned(Button1) then // False после нажатия на Button2
begin
FreeAndNil(Button1);
ShowMessage("656");
end;
end;
← →
MBo (2003-05-30 12:49) [1]> Panel1.Free; // ресурсы из-под Button1 "чистятся"?
Нет, если Owner кнопки - не панель.
← →
reonid (2003-05-30 13:11) [2]>А если уничтожить родителя, то что? Объект разрушается, а >ссылка остаётся?
То же самое.
Компонент уничтожается при уничтожении как Owner"a, так
и Parent"a. При этом компонент удаляется из списков
Parent.Controls и Owner.Components.
При этом published поле формы, в котором хранится ссылка на
соответствующий компонент (Button1 в данном случае)
обнуляется с помощью механизма RTTI (TComponent.SetReference).
← →
MBo (2003-05-30 13:21) [3]>Компонент уничтожается при уничтожении как Owner"a, так
и Parent"a
И правда ;)
Практика, конечно, не вполне тривиальная ;)
← →
Anatoly Podgoretsky (2003-05-30 13:47) [4]Такое поведение никак не документировано
← →
reonid (2003-05-30 14:06) [5]MBo © (30.05.03 13:21)
>Практика, конечно, не вполне тривиальная ;)
Вероятно, это требуется главным образом для корректного автоматического удаления компонентов в дизайн-тайме,
что является задачей более чем нетривиальной.
← →
MBo (2003-05-30 14:18) [6]>reonid
То, что такая ситуация предусмотрена в TWinСontrol.Destroy - разумно, или даже мудро.
Но закладывать в свою программу структурные решения, при которых динамический контрол имеет динамического Parent, но Owner - другой, ИМХО, не стоит -это я имел в виду под нетрив. практикой
← →
icWasya (2003-05-30 14:21) [7]При удалении Parenta сама компонента не уничтожится.(Можно пройтись по списку Components и найти свою компоненту)
НО! Многие визуальные компоненты потеряряют часть своей функциональности, если у них нет Parenta.
Например - TComboBox хранит Items внутри Windows выбирает/помещает их используя API. И для того, что бы работать с Items необходимо, что бы существовало окно Windows, на котором лежал бы этот ComboBox
← →
Anatoly Podgoretsky (2003-05-30 15:05) [8]icWasya © (30.05.03 14:21)
Это не так в одних случаях уничтожается, в других случаях нет, но сие не документировано.
Другое дело, что допускать этого не стоит, надо просто назначить правильного владельца, например тот же самый что и родитель.
← →
MalkoLinge (2003-05-30 15:52) [9]При уничтожении родителя - все ЕГО ( с точки зрения отношения компонент и его родитель) также уничтожаються
destructor TWinControl.Destroy;
var
I: Integer;
Instance: TControl;
begin
Destroying;
if FDockSite then
begin
FDockSite := False;
RegisterDockSite(Self, False);
end;
FDockManager := nil;
FDockClients.Free;
if Parent <> nil then RemoveFocus(True);
if FHandle <> 0 then DestroyWindowHandle;
I := ControlCount;
while I <> 0 do
begin
Instance := Controls[I - 1];
Remove(Instance);
Instance.Destroy;
I := ControlCount;
end;
FBrush.Free;
if FObjectInstance <> nil then Classes.FreeObjectInstance(FObjectInstance);
inherited Destroy;
end;
Правда не совсем понятно, что значит удаление родителя...Если вызов деструктора Родителя, тогда см. код выше, если просто присваивание свойсвту Парент контрола нил, тогда ничего плохого не случаеться, просто контрол теряет возможность отображать себя и реагировать на события, хотя Perform по идее должен всерано нормально работать
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.06.12;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.008 c