![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Уничтожение TWinControl.Controls[] [D7]
StriderMan © (2009-03-24 13:18:00)Возник такой теоретический вопрос: зачем TWinControl обходит список своих контролов Controls и вызывает им деструкторы? Ведь эти же контролы должные быть разрушены своими Owner'ами, которые в общем случае не совпадают с Parent'ами.
Собственно наступил на грабли, что контрол уже разрушен мною а его Parent пытается это сделать еще раз и получает AV.
Как решается эта проблема в самом VCL пока не нашел
Palladin (2009-03-24 14:28:00) [21]Взять посмотреть на это со стороны IDE, ты накидал на панель контролов, потом взял и удалил панель, контролы должны остаться? Во времени исполнения тоже самое, не устанешь реализовывать слежку за контролами?
StriderMan (2009-03-24 14:26:00) [22]
> Ну мое мнение - это экономия на системных объектах
Мне кажется это защита от тех, кому лень отслеживать время жизни своих объектов. Своеобразная перестраховка от утечки памяти
StriderMan (2009-03-24 14:20:00) [23]собственно хэлп не проливает свет на вопрос почему именно так:
The Parent property declared in TControl is similar to the Owner property declared in TComponent, in that the Parent of a control frees the control just as the Owner of a component frees that Component. However, the Parent of a control is always a windowed control that visually contains the control, and is responsible for writing the control to a stream when the form is saved. The Owner of a component is the component that was passed as a parameter in the constructor and, if assigned, initiates the process of saving all objects (including the control and its parent) when the form is saved.
Palladin (2009-03-24 14:19:00) [24]Ну мое мнение - это экономия на системных объектах.
StriderMan (2009-03-24 14:18:00) [25]Чтобы не быть голословным:
destructor TWinControl.Destroy;
var
I: Integer;
Instance: TControl;
begin
......
I := ControlCount;
while I <> 0 do
begin
Instance := Controls[I - 1];
Remove(Instance);
Instance.Destroy;
I := ControlCount;
end;
....
end;
StriderMan (2009-03-24 14:14:00) [26]
> Года три назад я тоже так считал
Я никак не считаю, мне интересно почему сделано именно так
Palladin (2009-03-24 13:33:00) [27]
> Как решается эта проблема в самом VCL пока не нашел
Не ищи решения того чего нет )
Palladin (2009-03-24 13:31:00) [28]
> StriderMan (24.03.09 13:18)
Года три назад я тоже так считал. Пока меня LVT носом не ткнул в справку по Parent.