![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Уничтожение TWinControl.Controls[] [D7]
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....