Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-34998
DiamondShark
2003-05-26 16:44
2003.06.12
Чего-то многовато тем из спец. разделов


14-34990
diokant
2003-05-26 10:52
2003.06.12
Подскажите как оптимизировать запрос...


14-35028
zx
2003-05-26 16:13
2003.06.12
Компьютерные очки


14-34987
Style
2003-05-26 08:03
2003.06.12
Вчера смотрел новую маму и чипсет i7205


1-34875
Nucl
2003-05-30 09:11
2003.06.12
Слежение за изменениями файла





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский