Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.02.12;
Скачать: CL | DM;

Вниз

Почему нет глюка?   Найти похожие ветки 

 
TStas ©   (2005-08-23 20:31) [0]

У Фаронова написано, что именно такой деструктор неверен, поскольку я уничтожаю таймер, а в конструкторе написано FTimer:=TTimer.Create(self); то есть таймер заносится с список Components моей строчки, а при вызове унаследованного деструктора его уже нет. Тогда почему не глючит?

destructor TRunningText.Destroy;
begin
FTimer.Free;
inherited Destroy;
end;


 
Юрий Зотов ©   (2005-08-23 20:47) [1]

Здесь нет ошибки. При уничтожении таймера тот сообщает об этом своему владельцу (TRunningText) и владелец удаляет таймер из своего списка Components. Поэтому при вызове унаследованного деструктора в этом списке таймера уже нет и ошибки не возникает.

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


 
Джо ©   (2005-08-23 20:49) [2]

Потому что при выполнении строки
FTimer.Free;
Экземпляр вызовет метод Notification своего создателя с параметром opRemove и он обнулит свою ссылку на внутренний компонент. После этого при выполнении
inherited Destroy;
таймер уже не будет находиться в списке Components.
Вообще, разберись с механизмом Notification - я уверен, пригодится. А также внимательно пройдись с отладчиком по коду TComponent.Destroy с разными вариантами.
---
Но, как бы то ни было, делать так, как ты - дурной тон, ибо вводит в заблуждение и заставляет выполнять бессмысленные телодвижения ;)


 
Джо ©   (2005-08-23 20:51) [3]


> [1] Юрий Зотов ©   (23.08.05 20:47)

Опс.


 
Турист   (2005-08-23 21:32) [4]

С Notification конечно стоит разобраться для общего развития :-)


destructor TComponent.Destroy;
begin
 ....
 if FOwner <> nil then FOwner.RemoveComponent(Self);
 inherited Destroy;
end;


 
TStas ©   (2005-08-23 23:25) [5]

Именно разбираясь с Notifitation этот вопрос и возник. У Фаронова насано это, как пример ошибочного кода, а у Фленова - как правильного. А что деструктор не нужен, если объект  содержит только поля TComponent или простые я понял. Смутило прочиворечие у двух авторов.


 
Джо ©   (2005-08-23 23:31) [6]


>  [5] TStas ©   (23.08.05 23:25)

Ты прочитал [1] и [2]? Делай выводы - что правильно, а что нет. В данном случае ни один, ни второй вариант не приведет к AV. Так что вообще некорректно говорить "об ошибке". Дело тут, скорее, в стиле. Целесообразно ли руками удалять компонент, если он удалится автоматически? Вопрос только в этом.
Советую пройти всю цепочку по F7 с включенным Use debug DCU"s. По-моему, все вопросы должны снятся.


 
TStas ©   (2005-08-23 23:44) [7]

>Джо
Вопрос был теоретический. Удивило именно столь явно противоречие. ИМХО не стоит писать такие деструкторы больше, но и стирать его тоже не стоит.


 
Джо ©   (2005-08-23 23:55) [8]


>  [7] TStas ©   (23.08.05 23:44)
> >Джо
> Вопрос был теоретический.

Ответы были тоже "теоретические".


 
TStas ©   (2005-08-24 00:36) [9]

>Джо
Спасибо



Страницы: 1 вся ветка

Текущий архив: 2006.02.12;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.052 c
6-1122921929
SPACE
2005-08-01 22:45
2006.02.12
Помогите подсчитать контрольную сумму TCP-заголовка


8-1125641317
palgen
2005-09-02 10:08
2006.02.12
Как поменять разрешение ?


1-1137292304
--zaazoo--
2006-01-15 05:31
2006.02.12
Непонятно криво грузятся логи аси в моей программе и в винде.


2-1138023621
K_Lock
2006-01-23 16:40
2006.02.12
Новая запись в базу. Помогите разобраться.


2-1138346791
pavel_guzhanov
2006-01-27 10:26
2006.02.12
Удаление файлов