![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Отловить закрытие приложения
Gu © (2011-09-13 02:07:00)Есть вот такой 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; завершена?
Anatoly Podgoretsky (2011-09-13 08:50:00) [1]> Gu (13.09.2011 02:51:04) [4]
Ну тогда смотри и InitProc
Gu (2011-09-13 02:51:00) [2]Во! нашел: в ProcBegin пишем
AddTerminateProc(@ProcEnd);
Gu (2011-09-13 02:44:00) [3]т.е. фактически ProcEnd отрабатывает, как если бы в ProcBegin было прописано ExitProcessProc:=@ProcEnd; нет ли еще чегото подобного но с более ранним этапом?
Gu (2011-09-13 02:25:00) [4]... это работает, но надо в myUnit все делать, чтобы файл проекта не трогать. Т.е. мне нужно что то типа Form.onClose только для Application.
ProcEnd нормально отрабатывает и в юните, но к моменту начала ее работы Application уже частично разрушен (но Application еще <> nil) и при освобождении некоторых объектов, которые созданы (в procbegin) как My:=TMy.create(application) вылазят ошибки. Неужели нет способа узнать что Application.run отработал, не прописываю что-то после него?
Юрий Зотов (2011-09-13 02:18:00) [5]> надо в юните отловить момент, после Application.Run, как если бы
> там сразу было написано ProcEnd
А почему бы именно там и не написать ProcEnd? Да и ProcBegin можно вызвать оттуда же, прямо из DPR.
begin
ProcBegin;
try
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
finally
ProcEnd;
end;
end.