Форум: "Начинающим";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2011.12.18;
Скачать: [xml.tar.bz2];




Вниз

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


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




Форум: "Начинающим";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2011.12.18;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.73 MB
Время: 0.022 c
1-1277700449      George                2010-06-28 08:47  2011.12.18  
Создание службы - отказывается запускаться


15-1314945552     ClawClaw              2011-09-02 10:39  2011.12.18  
Составление расписание в ВУЗе


2-1315514369      Германн               2011-09-09 00:39  2011.12.18  
Компонент для вывода текста.


15-1314390597     Юрий                  2011-08-27 00:29  2011.12.18  
С днем рождения ! 27 августа 2011 суббота


2-1315866669      WorkWork              2011-09-13 02:31  2011.12.18  
SQL-запрос в Access