Avatar billede tokelil Nybegynder
23. februar 2001 - 17:41 Der er 5 kommentarer og
2 løsninger

Sender ved OnCloseQuery

Hvordan kan jeg få mit program til at lukke, når Windows lukkes, når jeg har følgende i min OnCloseQuery:

if (BeenChanged) {
  if (MessageDlg(\"Exit without saving?\", mtConfirmation, TMsgDlgButtons() << mbYes << mbNo, 0) == mrNo) {
    CanClose = false;
  }
}

Programmet skal kun kunne åbne MessageDlg() når programmet afsluttes fra programmet, og ikke når Windows lukkes!

Jeg troede jeg kunne tilføje følgende:
if (Sender == Form1) {
  ...
}

Men det virker ikke, da dialogboksen stadig kommer når man lukker Windows!

Nogen forslag?
Avatar billede pstric Nybegynder
23. februar 2001 - 17:48 #1
Lav en handler til WM_QUERYCLOSESESSION eller WM_CLOSESESSION, der sætter din Form1.OnCloseQuery = 0.
Avatar billede tokelil Nybegynder
23. februar 2001 - 18:49 #2
Øhh... Jeg er en damn newbee! :-) Kan du ikke uddybe hvordan jeg laver en handle til WM_QUERYCLOSESESSION ?
Avatar billede pstric Nybegynder
23. februar 2001 - 22:32 #3
Undskyld, det kan jeg da godt forstå. Jeg skrev bare efter hukommelsen, og der er åbenbart røget et par kredse ;-(

Messagen hedder WM_ENDSESSION.

Indsæt message handleren sådan her i TForm1\'s header fil:

protected:
        void __fastcall WMEndSession(TMessage &Message);
BEGIN_MESSAGE_MAP
        MESSAGE_HANDLER(WM_ENDSESSION, TMessage, WMEndSession)
END_MESSAGE_MAP(TControl)

Implementer handleren sådan her i .cpp filen:

void __fastcall TForm1::WMEndSession(TMessage &Message)
{
        if (Message.WParam == TRUE) {
                OnCloseQuery = 0;
        }
}
Avatar billede tokelil Nybegynder
24. februar 2001 - 17:34 #4
Det virker stadig ikke... :-(
Dialogboksen som kommer ved OnCloseQuery kommer stadig!
Jeg får ingen fejlmeddelser eller lignende når jeg indsætter din kode, men det hjælper heller ikke på noget.
Kan det ikke være det er en af de andre WM_ kald der skal bruges?
Avatar billede soepro Nybegynder
26. februar 2001 - 12:15 #5
Du kan ikke umiddelbart se forskel på en bruger genereret close og en close sendt af Windows. Du kan komme lidt af vejen, ved at lave en ekstra bool (f.eks. USerExit) som du sætter til true, når bruger vælge en af de \"autoriserede\" måder at afslutte dit program på. (Altså exit fra menuen eller en Exit knap.) Men du vil ikke kunne fange at de selv klikker på X i toppen af formen.
Avatar billede soepro Nybegynder
26. februar 2001 - 12:19 #6
Problemet er at de er jo OGSÅ windows der håndtere den alm. Close event - alle meddelelser kommer fra Windows.

Måske kan du vælge heldig at Application->Terminated kun bliver sat, når Windows anmoder om at afslutte programmet - og så kun poppe op med meddelelsen, hvis den ej er sat:

:
if (Beenchanged && !Application->Terminated)
:
Avatar billede tokelil Nybegynder
28. august 2001 - 00:07 #7
Hmmm... har aldrig rigtigt fået det til at virke som jeg gerne ville, men har løst det på en anden måde! (The Microsoft Word style... ;-))

anyway.. I får 15 p. hver som tak for hjælpen.
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