![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Чем отличается закрытие по «крестику» и по Alt+F4?
Kolan © (2009-08-25 14:03:00)Здравствуйте!
Пытаюсь найти противное AV. Заметил, что закрытие по Alt+F4 не приводит к ошибке, а по крестику — как повезет.
Вот и стало интересно в чем разница может быть?
Leonid Troyanovsky (2009-08-25 19:01:00) [1]
> Kolan © (25.08.09 15:33) [10]
> Почему помогло, в чем дело?
Хз. Видимо, в дебрях интерфейсов ссылка на форму, все же, присутствует.
А, в отличии от прошлых успехов, в D2009 финализацию как-то изменили.
В любом случае, если есть возможность самостоятельно управлять
разрушительным ордунгом, то есть, IMHO, смысл это делать.
Особенно же опасно хранить ссылки, и это не только для интерфейсов.
Поэтому, TComponent & Notification forever! :)
--
Regards, LVT.
Kolan (2009-08-25 16:49:00) [2]Ну конечно, иначе бы даже не скомпилировалось.
GetSystemController.TestI := Self;не прошел бы.
clickmaker (2009-08-25 16:48:00) [3]> [13] Kolan © (25.08.09 16:02)
> Интересно, что если вместо ITestI использовать IUnkown,
> то все нормально.
а форма реализует procedure Test?
Kolan (2009-08-25 16:02:00) [4]Интересно, что если вместо ITestI использовать IUnkown, то все нормально.
Kolan (2009-08-25 15:53:00) [5]По идее такого не должно быть.
Во-первых, это не нужно по логике программы.
Во-вторых, я этого не нашел. Отключал деструктор контроллера — ошибка была.
А в-третьих, что самое интересно, я провел эксперимент.
Объявил тестовый интерфейс.
ITestI = interface
procedure Test;
end;
И повторил схему.
GetSystemController.TestI := Self;
Его точно никто нигде не использует. А ошбика есть. Тут, имхо, какой-то механизм работает.
Ухарь (2009-08-25 15:39:00) [6]
> Почему помогло, в чем дело?
Скорее всего, кто-то пытался считать ссылки для формы, а она уже грохнулась
Kolan (2009-08-25 15:33:00) [7]Да, Леонид, действительно помогло.
procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
GetSystemController.TerminalView := nil;
GetSystemController.CalibrationsView := nil;
GetSystemController.DeviceExchangeView := nil;
GetSystemController.ConnectionStateView := nil;
end;
Почему помогло, в чем дело?
Я такой механизм (а это MVP) использовал множество раз и с главными и с второстепенными формами. Никаких проблем не было. Единственная разница — первый раз делаю проект в D2009.
Leonid Troyanovsky (2009-08-25 15:30:00) [8]
> Kolan © (25.08.09 15:17) [8]
> Ошибка явно связана с этими интерфейсами.
Ну, а если обнилить ссылки в OnCloseQuery формы?
--
Regards, LVT.
Kolan (2009-08-25 15:17:00) [9]
> Leonid Troyanovsky
Контроллер наследник TObject.
TSystemController = class
private
...
Соответственно владельца и нотификейшэна у него нет.
Объявление формы выглядит так:
TMainForm = class(TForm, ITerminalView, ICalibrationsView,
IDeviceExchangeView, IConnectionStateView)
...
clickmaker, проверил. В деструкторе контроллера ничего подозрительного не нашел.
---
Ошибка явно связана с этими интерфейсами. Повесил их подключение на кнопку. Если кнопку нажимать, ошибка есть, иначе — нет.
Leonid Troyanovsky (2009-08-25 15:12:00) [10]
> Kolan © (25.08.09 14:59) [5]
> GetSystemController.ConnectionStateView := Self;
>
> Тут контроллеру назначаются интерфейсы для вывода. Self
> — это главная форма
Показывай Notification для GetSystemController.
И кто его Owner?
--
Regards, LVT.
clickmaker (2009-08-25 15:12:00) [11]а при закрытии не может быть обращения к какому-то из view?
и не цепляется ли GetSystemController к каким-то событиям формы?
Kolan (2009-08-25 14:59:00) [12]DrPass, проверял, он вреде не причем.
clickmaker, мышиные события в форме не назначены. В этом направлении идей нет.
Закрытие по меню в менеджере задач тоже приводит к AV.
AV почти стабильное.
Кроме способа закрытия ошибку устраняет комментирования таких строк:
GetSystemController.TerminalView := Self;
GetSystemController.CalibrationsView := Self;
GetSystemController.DeviceExchangeView := Self;
GetSystemController.ConnectionStateView := Self;
Тут контроллеру назначаются интерфейсы для вывода. Self — это главная форма. Интересно, что ошибка исчезает только если всеназначения закомментить.
При в деструкторе контроллера интерфейсы не трогаются. Может како-то скрытый механизм в VCL о котором я не знаю срабатывает?
clickmaker (2009-08-25 14:22:00) [13]> закрытие по Alt+F4 не приводит к ошибке, а по крестику —
> как повезет
ну напрашивается только что-то связанное с мышинными событиями
DrPass (2009-08-25 14:19:00) [14]Я бы сперва удалил из проекта EurekaLog :)
Kolan (2009-08-25 14:06:00) [15]Суть ошибки в
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1249896536&n=18
в [0].
В отладчике ловится (и EurikaLog ловит), но это мало информативно. Где-то в другом месте я видимо напортачил.
clickmaker (2009-08-25 14:05:00) [16]> по крестику — как повезет
что, и в отладчике не поймать?