Como saber se o sistema está finalizando?

Delphi

15/05/2007

Olá amigos, preciso gravar numa tabela no meu banco quando o sistema é fechado, mas pra isso preciso saber quando ele está finalizando, antes da conexão ser destruída, ir no banco e gravar que o sistema foi fechado.


Como faço isso?

[]s


Titanius

Titanius

Curtidas 0

Respostas

Paullsoftware

Paullsoftware

15/05/2007

não fiz esse teste mais será que no evento OnDestroy do Form Principal você não consegue isso?


GOSTEI 0
Nightshade

Nightshade

15/05/2007

tenta o onCloseQuery
esse evento á acionado antes do formulario fechar..
se tu utiliza application.terminate;
não funcionará.
mas clicanco no [X] para finalizar ela sim.
tu ainda pode fzr assim

procedure TFMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
   try
    salva;
    except
      canclose := false;
      showmessage(´ocorreu um erro ao salvar..´);
   end;
end;


breckando a aplicação de ser fechada caso de algo errado


GOSTEI 0
Titanius

Titanius

15/05/2007

Eu já utilizo no OnCloseQuery... mas de vez em quando não grava... me parece que já foi fechado a conexão de dados..

E Utilizo o Application.Terminate;


Qual seria melhor usar sem ser ele? Visto que meu Form Principal é um DM depois vem o Form principal da aplicação...

[]s


GOSTEI 0
Ipc$

Ipc$

15/05/2007

procedure WndProc(var Msg: TMessage); override;
Aí vc pega todas as msgs antes que ela feche.


GOSTEI 0
Titanius

Titanius

15/05/2007

valeu ipc, mas qual é a mensagem de fechar, não consegui ver no debug...


[]s


GOSTEI 0
Ipc$

Ipc$

15/05/2007

Não tenho certeza mas acho que uma delas é o WM_Close.
Vc pode gerar um txt nessa procedure, gravar e verificar as últimas msgs
que o Windows enviou para sua aplicação antes de fechar.


GOSTEI 0
Ipc$

Ipc$

15/05/2007

Oops, não esqueça de colocar [b:18b97192dc]inherited[/b:18b97192dc] nesta procedure pq ela é override.


GOSTEI 0
Titanius

Titanius

15/05/2007

valeu ipc.. vou tentar aki...

[]s


GOSTEI 0
Rvano

Rvano

15/05/2007

Colocar uma linha antes do ´Application.Terminate;´ com a rotina de gravação não resolve o problema?


GOSTEI 0
Rvano

Rvano

15/05/2007

Colocar uma linha antes do ´Application.Terminate;´ com a rotina de gravação não resolve o problema?

Poderia criar uma procedure que fecha a aplicação


procedure FechaAplicativo;
begin
  DataModule.Query1.Insert;
  DataModulo.Query1.FieldByName(´Campo´).AsDate := now;
  DataModule.Query1.Post;
  Application.Terminate;
end;


Coloque esse código no seu dataModule, como público. Substitua as linhas do seu fonte que estão com ´Application.Terminate;´ por esta rotina ´FechaAplicativo´.


GOSTEI 0
Paullsoftware

Paullsoftware

15/05/2007

Colocar uma linha antes do ´Application.Terminate;´ com a rotina de gravação não resolve o problema? Poderia criar uma procedure que fecha a aplicação
procedure FechaAplicativo;
begin
  DataModule.Query1.Insert;
  DataModulo.Query1.FieldByName(´Campo´).AsDate := now;
  DataModule.Query1.Post;
  Application.Terminate;
end;
Coloque esse código no seu dataModule, como público. Substitua as linhas do seu fonte que estão com ´Application.Terminate;´ por esta rotina ´FechaAplicativo´.
Eu creio que isso ele já tentou, agora me diz uma coisa!!! se o kra for no X do form e dé um clickizinho, como ele vai disparar essa procedure?? :lol:


GOSTEI 0
Rvano

Rvano

15/05/2007

No onClose do form coloca assim:

  
if Application.MessageBox(´Deseja fechar?´, ´Aviso´, MB_YESNO+MB_ICONQUESTION) = mrYes then
  FechaAplicativo;


Assim, sempre que alguém clicar no X do form, o aplicativo executa essa rotina!!!


GOSTEI 0
Rvano

Rvano

15/05/2007

No onClose do form coloca assim:

  
if Application.MessageBox(´Deseja fechar?´, ´Aviso´, MB_YESNO+MB_ICONQUESTION) = mrYes then
  FechaAplicativo;


Assim, sempre que alguém clicar no X do form, o aplicativo executa essa rotina!!!


GOSTEI 0
POSTAR