Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Чем отличается закрытие по «крестику» и по 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]

> по крестику — как повезет

что, и в отладчике не поймать?


Наверх

Титульная страница Поиск, карта сайта Написать письмо