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

Вниз

Отловить закрытие приложения   Найти похожие ветки 

 
Gu   (2011-09-13 02:07) [0]

Есть вот такой dpr

Program My;

uses
MyUnit,
Forms,
Unit1 in "Unit1.pas" {Form1};

begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
// !!!
end.


и юнит, который первым инициализируется

Unit MyUnit; Interface

Uses Forms,Windows,Sysutils,...

...

Procedure ProcBegin;
Procedure ProcEnd;

Implementation

...

Procedure ProcBegin;
begin
...
end;

Procedure ProcEnd;
begin
...
end;

Initialization

ProcBegin;

Finalization

ProcEnd;

end.


Вопрос: как в юните myunit отловить для application событие разрушения или выхода? Т.е. он инициализируется первым и выполняет процедуру ProcBegin, затем инициализируется Application в dpr, после того как приложение закрывают я так понимаю что происходит Application.terminate (в месте //!!!), затем происходит финализация MyUnit (ProcEnd). Т.е. мне надо в юните отловить момент, после Application.Run, как если бы там сразу было написано ProcEnd;
Я пробовал в юните создавать класс
type
TMyAppOnMessage=Class Procedure MyOnMessage(var Msg:TMsg; var Handled: Boolean);End;
var
MyAppOnMessage:TMyAppOnMessage;

<тут процедура MyOnMessage>

и при иницализации (в ProcBegin) присваивать Application.OnMessage:=MyOnMessage;

и пробовать в новой процедуре отлавливать wm_quit, но почемуто такое сообщение там не ловится (а вот для форм норм). Как можно еще отловить в myunit, что процедура Application.Run; завершена?


 
Юрий Зотов ©   (2011-09-13 02:18) [1]

> надо в юните отловить момент, после Application.Run, как если бы
> там сразу было написано ProcEnd

А почему бы именно там и не написать ProcEnd? Да и ProcBegin можно вызвать оттуда же, прямо из DPR.

begin
 ProcBegin;
 try
   Application.Initialize;
   Application.CreateForm(TForm1, Form1);
   Application.Run;
 finally
   ProcEnd;
 end;
end.


 
Gu   (2011-09-13 02:25) [2]

... это работает, но надо в myUnit все делать, чтобы файл проекта не трогать. Т.е. мне нужно что то типа Form.onClose только для Application.
ProcEnd нормально отрабатывает и в юните, но к моменту начала ее работы Application уже частично разрушен (но Application еще <> nil) и при освобождении некоторых объектов, которые созданы (в procbegin) как My:=TMy.create(application) вылазят ошибки. Неужели нет способа узнать что Application.run отработал, не прописываю что-то после него?


 
Gu   (2011-09-13 02:44) [3]

т.е. фактически ProcEnd отрабатывает, как если бы в ProcBegin было прописано ExitProcessProc:=@ProcEnd; нет ли еще чегото подобного но с более ранним этапом?


 
Gu   (2011-09-13 02:51) [4]

Во! нашел: в ProcBegin пишем
AddTerminateProc(@ProcEnd);


 
Anatoly Podgoretsky ©   (2011-09-13 08:50) [5]

> Gu  (13.09.2011 02:51:04)  [4]

Ну тогда смотри и InitProc



Страницы: 1 вся ветка

Текущий архив: 2011.12.18;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.012 c
15-1314943782
Дмитрий С
2011-09-02 10:09
2011.12.18
"Любую точку выпуклой функции можно назвать экстремумом."


2-1315570446
Евгений07
2011-09-09 16:14
2011.12.18
WSAWaitForMultipleEvents для однонитевого сервера


2-1315383105
Pushok
2011-09-07 12:11
2011.12.18
На форме исчезает TreeView


2-1315307915
alexx777
2011-09-06 15:18
2011.12.18
сменить пользователя


2-1315226772
rammic
2011-09-05 16:46
2011.12.18
Получение данных из 3ds Max