Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Уничтожение TWinControl.Controls[] [D7]


Страницы:   1 2

StriderMan ©   (2009-03-24 13:18:00) 

Возник такой теоретический вопрос: зачем TWinControl обходит список своих контролов Controls и вызывает им деструкторы? Ведь эти же контролы должные быть разрушены своими Owner'ами, которые в общем случае не совпадают с Parent'ами.

Собственно наступил на грабли, что контрол уже разрушен мною а его Parent пытается это сделать еще раз и получает AV.

Как решается эта проблема в самом VCL пока не нашел


Игорь Шевченко   (2009-03-27 12:19:00) [1]


> зачем отлседить - читай выше. Зачем убивает - не знаю, вот
> и интересуюсь, нафига задублирован механизм убивания компонентов
> механизмом убивания контролов.


Он незадублирован. Читай выше :)


StriderMan   (2009-03-27 11:18:00) [2]


> А зачем?

зачем отлседить - читай выше. Зачем убивает - не знаю, вот и интересуюсь, нафига задублирован механизм убивания компонентов механизмом убивания контролов.


StriderMan   (2009-03-27 11:16:00) [3]


> TObject.BeforeDestruction - в смысле надписываешь панель, перекрываешь этот метод, и вперед, меняешь парент у wincontrol-ов на ней.

знать бы еще у на какой панели мой контрол окажется в данный момент времени... :))))


> Но сдается мне, ты странного хочешь - иметь контрол, который  при уничтожении родительского окна остается висеть в воздухе. В древнем Китае желающим странного отрубали голову - очень полезная, надо сказать, практика.

почему в воздухе? в светлой памяти :)

А потом в военное время живем, господа мастера, даже значение синуса четырех-пяти порой достигает :)

Ясное дело, такая проблема возникла из-за некоторых архитектурных просчетов, допущенных в прошлом. Осталось решить, что дешевле - рефакторинг или попытка обмануть vcl малой кровью.


Игорь Шевченко   (2009-03-27 01:49:00) [4]

StriderMan   (26.03.09 23:23) [23]


> Как вот только отследить что эту панельку сейчас кто-то
> прихлопнет?


TObject.BeforeDestruction - в смысле надписываешь панель, перекрываешь этот метод, и вперед, меняешь парент у wincontrol-ов на ней.

Но сдается мне, ты странного хочешь - иметь контрол, который при уничтожении родительского окна остается висеть в воздухе.
В древнем Китае желающим странного отрубали голову - очень полезная, надо сказать, практика.


Германн   (2009-03-27 00:39:00) [5]


> StriderMan   (26.03.09 23:23) [23]
>
> Как вот только отследить что эту панельку сейчас кто-то
> прихлопнет? к моменту Notification она все свои контролы
> уже убила :(

А зачем?


StriderMan   (2009-03-26 23:23:00) [6]


> если перед уничтожением панели сменить парент у контрола,
>  то вполне себе останется жить.
>
> Только разве ж это жизнь - без панели-то ?

Так а мы ему другую панельку подсунем :)

Как вот только отследить что эту панельку сейчас кто-то прихлопнет? к моменту Notification она все свои контролы уже убила :(


Игорь Шевченко   (2009-03-26 19:53:00) [7]


> Он имеет ввиду, что если подцепить этот контрол к панели,
>  а потом уничтожить эту панель - контрол должен остаться
> жить :)


если перед уничтожением панели сменить парент у контрола, то вполне себе останется жить.

Только разве ж это жизнь - без панели-то ?


Palladin   (2009-03-26 19:29:00) [8]


> Игорь Шевченко ©   (26.03.09 19:25) [20]

Он имеет ввиду, что если подцепить этот контрол к панели, а потом уничтожить эту панель - контрол должен остаться жить :)


Игорь Шевченко   (2009-03-26 19:25:00) [9]


> имеется ввиду существует как объект а не как виндовая форма.


вполне может существовать:

unit Unit1;

interface
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 TForm1 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 private
   FControl: TWinControl;
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
 FControl := TWinControl.Create(Self);
end;

end.


Только нафиг он нужен ?


StriderMan   (2009-03-26 18:59:00) [10]


> WinControl отдельно не может существовать - у него в style  WS_CHILD по умолчанию.

имеется ввиду существует как объект а не как виндовая форма.


Игорь Шевченко   (2009-03-26 18:45:00) [11]


> Ну вот нужен мне ВинКонтрол который и отдельно и на форме
> может существовать.


WinControl отдельно не может существовать - у него в style WS_CHILD по умолчанию.


StriderMan   (2009-03-26 18:19:00) [12]

Все, придумал.
вместо .Parent использовал .ParentWindow


StriderMan   (2009-03-26 18:14:00) [13]


> Так для этого и существует Notification.

Да, только в нем уже нас ставят перед фактом, дескать все, хана вашему контрольчику. Как избавиться от этого произвола ума не приложу.

Ну вот нужен мне ВинКонтрол который и отдельно и на форме может существовать.


Юрий Зотов   (2009-03-24 14:53:00) [14]

> StriderMan   (24.03.09 14:44) [14]

> вопрос спорный вобщем-то.

Вряд ли. Если контрол не имеет парента, то  возникают проблемы с его видимостью, перерисовкой, да и вообще с обработкой его сообщений.

> Кто-то может иметь на него ссылки, даже не зная что он TControl.

Так для этого и существует Notification.


StriderMan   (2009-03-24 14:44:00) [15]


> Контрол без парента бесполезен и потому на фиг никому не нужен

вопрос спорный вобщем-то. Кто-то может иметь на него ссылки, даже не зная что он TControl.


StriderMan   (2009-03-24 14:43:00) [16]


> Что-то Вы не так делаете, похоже

да я уж понял что неправильно. Про Notification забыл.


Юрий Зотов   (2009-03-24 14:37:00) [17]

> StriderMan   (24.03.09 13:18)  

Контрол без парента бесполезен и потому на фиг никому не нужен - поэтому при уничтожении парента нет никакого смысла сохранять его дочерние контролы. Только ресурсы зазря гробятся.

Поэтому дочерние контролы уничтожаются автоматически. При этом их Owner'ы получают уведомление (см. Notification) и удаляют уничтожаемые контролы их своих списков Components - то есть, Owner'ами быть перестают.

> контрол уже разрушен мною а его Parent пытается это сделать еще раз и
> получает AV.

Что-то Вы не так делаете, похоже. При правильном уничтожении контрола он автоматически исключается из списка Parent.Controls - то есть, Parent его теряет из виду (перестает быть парентом) и повторно уничтожать не должен.

Кидаем на форму панель, а на панель - кнопку. В обработчике Form.OnClick пишем Кнопка.Free. Запускаем программу, щелкаем по форме - кнопка исчезает. Закрываем программу - и панель не пытается удалить уже удаленную кнопку. Никаких AV.


StriderMan   (2009-03-24 14:35:00) [18]


> Взять посмотреть на это со стороны IDE, ты накидал на панель
> контролов, потом взял и удалил панель, контролы должны остаться?
>

так передавай им в конструктор Owner'ом эту же панель. нафига дублировать механизмы? для надежности?


Palladin   (2009-03-24 14:30:00) [19]


> кому лень отслеживать время жизни своих объектов.

Хренасе лень, действительно, нафиг нужно было TStringList создавать, разве что для тех кому лень свой написать...


StriderMan   (2009-03-24 14:29:00) [20]


> Как решается эта проблема в самом VCL пока не нашел

все, нашел. В деструкторе TControl "отвязывается" от Parent'а

destructor TControl.Destroy;
begin
...
   SetParent(nil);
...
end;


где-то видимо в иерархии у меня потерялся inherited destructor....


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо