Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.10.25;
Скачать: CL | DM;

Вниз

Чем отличается закрытие по «крестику» и по 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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.02 c
15-1250873584
blackman
2009-08-21 20:53
2009.10.25
Российский программист: ничего особенного


15-1250858767
macrodens
2009-08-21 16:46
2009.10.25
Вопрос по RAID


3-1228733026
patrick1968
2008-12-08 13:43
2009.10.25
Изменения в ADOQuery


4-1220621752
Demo_nik
2008-09-05 17:35
2009.10.25
Как определить путь к каталогу в котором нахожусь?


2-1251206612
Дмитрий_
2009-08-25 17:23
2009.10.25
TStrngList.AddObject..?