Форум: "Компоненты";
Текущий архив: 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.038 c