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