Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Компоненты";
Текущий архив: 2006.02.12;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.042 c
2-1138213657
Glex
2006-01-25 21:27
2006.02.12
FormStyle:= fsStayOnTop - работает только для MainForm(((


15-1138006476
Nic
2006-01-23 11:54
2006.02.12
Меня перевели с учебного мастера на инженера :)


2-1138359939
dabreezy
2006-01-27 14:05
2006.02.12
Вопрос о гипер ссылке


1-1135438529
Yegorchic
2005-12-24 18:35
2006.02.12
Завершение процесса в ring0


2-1138054556
Змей
2006-01-24 01:15
2006.02.12
hide &amp; свернуть





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский