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

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

Почему нет глюка?


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. Поэтому при вызове унаследованного деструктора в этом списке таймера уже нет и ошибки не возникает.

Другое дело, что такой деструктор просто не нужен, потому что владелец таймера и без него уничтожит таймер.


Наверх

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