![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Почему нет глюка?
TStas © (2005-08-23 20:31:00)У Фаронова написано, что именно такой деструктор неверен, поскольку я уничтожаю таймер, а в конструкторе написано FTimer:=TTimer.Create(self); то есть таймер заносится с список Components моей строчки, а при вызове унаследованного деструктора его уже нет. Тогда почему не глючит?
destructor TRunningText.Destroy;
begin
FTimer.Free;
inherited Destroy;
end;
TStas (2005-08-24 00:36:00) [1]>Джо
Спасибо
Джо (2005-08-23 23:55:00) [2]
> [7] TStas © (23.08.05 23:44)
> >Джо
> Вопрос был теоретический.
Ответы были тоже "теоретические".
TStas (2005-08-23 23:44:00) [3]>Джо
Вопрос был теоретический. Удивило именно столь явно противоречие. ИМХО не стоит писать такие деструкторы больше, но и стирать его тоже не стоит.
Джо (2005-08-23 23:31:00) [4]
> [5] TStas © (23.08.05 23:25)
Ты прочитал [1] и [2]? Делай выводы - что правильно, а что нет. В данном случае ни один, ни второй вариант не приведет к AV. Так что вообще некорректно говорить "об ошибке". Дело тут, скорее, в стиле. Целесообразно ли руками удалять компонент, если он удалится автоматически? Вопрос только в этом.
Советую пройти всю цепочку по F7 с включенным Use debug DCU's. По-моему, все вопросы должны снятся.
TStas (2005-08-23 23:25:00) [5]Именно разбираясь с Notifitation этот вопрос и возник. У Фаронова насано это, как пример ошибочного кода, а у Фленова - как правильного. А что деструктор не нужен, если объект содержит только поля TComponent или простые я понял. Смутило прочиворечие у двух авторов.
Турист (2005-08-23 21:32:00) [6]С Notification конечно стоит разобраться для общего развития :-)
destructor TComponent.Destroy;
begin
....
if FOwner <> nil then FOwner.RemoveComponent(Self);
inherited Destroy;
end;
Джо (2005-08-23 20:51:00) [7]
> [1] Юрий Зотов © (23.08.05 20:47)
Опс.
Джо (2005-08-23 20:49:00) [8]Потому что при выполнении строки
FTimer.Free;
Экземпляр вызовет метод Notification своего создателя с параметром opRemove и он обнулит свою ссылку на внутренний компонент. После этого при выполнении
inherited Destroy;
таймер уже не будет находиться в списке Components.
Вообще, разберись с механизмом Notification - я уверен, пригодится. А также внимательно пройдись с отладчиком по коду TComponent.Destroy с разными вариантами.
---
Но, как бы то ни было, делать так, как ты - дурной тон, ибо вводит в заблуждение и заставляет выполнять бессмысленные телодвижения ;)
Юрий Зотов (2005-08-23 20:47:00) [9]Здесь нет ошибки. При уничтожении таймера тот сообщает об этом своему владельцу (TRunningText) и владелец удаляет таймер из своего списка Components. Поэтому при вызове унаследованного деструктора в этом списке таймера уже нет и ошибки не возникает.
Другое дело, что такой деструктор просто не нужен, потому что владелец таймера и без него уничтожит таймер.