Avatar billede skovjuul Nybegynder
20. maj 2013 - 23:52 Der er 4 kommentarer og
1 løsning

Main.FormClose bliver omgået når brugeren logger ud af computeren

Hej

Er lige blevet opmærksom på en uhensigtsmæssighed.

Jeg har nogle afsluttende procedurer, der bliver kørt i FormClose (gem i ini-fil, fjern bruger fra en tabel i en database og lign.).

Desværre bliver FormClose ikke kaldt, hvis brugeren logger ud af computeren uden at lukke programmet først - altså hvis brugeren trykker på det fine windowsflag og vælger "Log af" eller "Luk Computeren".

Dette er på Windows 7 computere.

Er det noget jeg kan gøre noget ved, eller er det en bug/uheldighed i hele operativ-/Delphi-systemet?

På forhånd tak for hjælpen.
Avatar billede kroning Nybegynder
21. maj 2013 - 01:44 #1
Har ikke kikket nærmere på det men måske er det denne WM message du skal bruge http://msdn.microsoft.com/en-us/library/windows/desktop/aa376890(v=vs.85).aspx
Avatar billede MADOlsen Forsker
21. maj 2013 - 10:21 #2
Giver #1 ret. Jeg bruger selv den message i en nogenlunde tilsvarende situation.
Avatar billede skovjuul Nybegynder
21. maj 2013 - 14:43 #3
Jeg er ikke den store haj i brugen af WM messages, kunne jeg mon lokke et eksempel ud af jer?
Avatar billede hrc Mester
22. maj 2013 - 08:38 #4
(igen referencer til de nævnte messages)

http://msdn.microsoft.com/en-us/library/windows/desktop/aa376890(v=vs.85).aspx

http://msdn.microsoft.com/en-us/library/windows/desktop/aa376889(v=vs.85).aspx

interface

  TfrmMain = class(TForm)
    procedure WMQueryEndSession(var Msg: TWMQueryEndSession); message WM_QUERYENDSESSION;

    procedure WMEndSession(var Msg: TWMEndSession); message WM_ENDSESSION;
    ..
  end;

implementation

procedure TfrmMain.WMQueryEndSession(var Msg: TWMQueryEndSession);
begin
  if MessageDlg('Afslut program og luk windows?',mtConfirmation,[mbYes,mbNo], 0) = mrNo then
    Msg.Result := 0
  else begin
    Msg.Result := 1;
    ModalResult := mrOK; // Kan ikke huske om den har nogen betydning, tror det ikke
  end;
end;

procedure TfrmMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  // Luk de ting du gerne vil lukke ordentligt ned.
end;
Avatar billede skovjuul Nybegynder
19. juni 2013 - 00:37 #5
Ja, en gammel sag :)

Prøvede for noget tid siden ovenstående, men WMQueryEndSession blev aldrig kaldt af Delphi. WMEndSession er jeg lidt uklar på hvad jeg skal bruge til?

Da der nok ikke er tid til en dialogboks i forbindelse med computeren bliver lukket ned (når folk bare logger ud), kan jeg så bare smide et kald til FormClose i WMQueryEndSession og så checke på et flag i FormClose, så ikke den bliver kørt to gange hvis man lukker programmet rigtigt?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester