Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.042 c
2-1250843104
alshtam
2009-08-21 12:25
2009.10.25
подключение dll


15-1250886604
Юрий
2009-08-22 00:30
2009.10.25
С днем рождения ! 22 августа 2009 суббота


2-1251020827
EXEcER
2009-08-23 13:47
2009.10.25
Рэндом в Label


2-1251446645
TarenoKostanay
2009-08-28 12:04
2009.10.25
Дескриптор окна


15-1250966987
Kerk
2009-08-22 22:49
2009.10.25
Мучает вопрос





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский