Главная страница
    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.47 MB
Время: 0.035 c
15-1137615030
DillerXX
2006-01-18 23:10
2006.02.12
Подскажите названия песен...


15-1137510339
oldman
2006-01-17 18:05
2006.02.12
Да здравствует английский язык, самый английский в мире!!! :)


15-1138097700
iamdanil000
2006-01-24 13:15
2006.02.12
ListBox


1-1137227153
мух
2006-01-14 11:25
2006.02.12
Скорость выполнения операций


5-1124441578
Priest
2005-08-19 12:52
2006.02.12
Нет свойства при выделении нескольких компонентов





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский