Главная страница
    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.49 MB
Время: 1.245 c
2-1251444270
Grant
2009-08-28 11:24
2009.10.25
Создать класс похожий на TStringList


1-1221906440
Дмитрий С
2008-09-20 14:27
2009.10.25
Как узнать поддерживает ли шрифт кириллицу?


15-1250873584
blackman
2009-08-21 20:53
2009.10.25
Российский программист: ничего особенного


4-1219915857
sniknik
2008-08-28 13:30
2009.10.25
Как узнать кем стартуется сервис...


2-1250066321
kostyl_kostyl
2009-08-12 12:38
2009.10.25
TspClient и TspServever





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский