Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Application.Terminate mit Msg.Dialog geht nur über TrayIcon Menü (https://www.delphipraxis.net/177214-application-terminate-mit-msg-dialog-geht-nur-ueber-trayicon-menue.html)

ReVenGer 24. Okt 2013 19:01

Application.Terminate mit Msg.Dialog geht nur über TrayIcon Menü
 
Hi,
ich habe folgendes Problem:

Beim beenden meines Programms suche ich Fenster, sollten diese noch vorhanden sein fragt er über einen Message.Dialog ob das Programm beendet werden soll.

Code:
Procedure WarnOnClose;
var
  Wnd: HWnd;
begin
  Wnd := FindWindow('Fenster_1', nil);
  begin
    if Wnd <> 0 then
    begin
      if MessageDlg('Fenster_1 is still running! Really quit Programm?',
        mtWarning, mbokCancel, 0) = mrok then
        application.Terminate;
    end;
    begin
      Wnd := FindWindow('Fenster_2', nil);
      begin
        if Wnd <> 0 then
        begin
          if MessageDlg('Fenster_2 is still running! Really quit Programm?',
            mtWarning, mbokCancel, 0) = mrok then
            application.Terminate;
        end;
      end;
    end;
  end;
end;
Jetzt zu dem Problem:

Wenn das Programm in der Taskleiste minimiert ist und ich das Popupmenü in der Taskleiste öffne, auf exit klicke und er die prozedur WarnOnClose aufrufe, erscheint der Message Dialog und bei Ok macht er Application.Terminate, auf Cancel bricht er ab.

Wenn ich aber bei der Form oben rechts auf das Kreuz zum beenden drücke, erscheint zwar der Message Dialog, dort macht er aber Application Terminate egal ob ich im Message Dialog Ok oder Cancel auswähle.

Das der Code oben nicht die eleganteste Lösung ist, kann ich mir fast denken.

Gruß
rvg

ASM 24. Okt 2013 19:51

AW: Application.Terminate mit Msg.Dialog geht nur über TrayIcon Menü
 
Zitat:

Zitat von ReVenGer (Beitrag 1233078)
Wenn ich aber bei der Form oben rechts auf das Kreuz zum beenden drücke, erscheint zwar der Message Dialog, dort macht er aber Application Terminate egal ob ich im Message Dialog Ok oder Cancel auswähle.

Versuche es nach folgendem Muster (entscheidend ist die Verwendung des Var-Parameters "CanClose"):
Delphi-Quellcode:
function TForm1.WarnOnClose: Boolean;
var
  Wnd: HWnd;
begin
  result := true;
  Wnd := FindWindow('notepad', nil);
  if Wnd <> 0 then
  begin
    result := MessageDlg('Notepad is still running! Really quit Programm?',
      mtWarning, mbokCancel, 0) = mrok;
  end;
end;

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  CanClose := WarnOnClose;
end;

ReVenGer 24. Okt 2013 20:14

AW: Application.Terminate mit Msg.Dialog geht nur über TrayIcon Menü
 
Vielen Dank für die Antwort!

Ersetzt mir FormCloseQuery die Punkte OnClose und OnDestroy, oder muss ich die dann weiterhin verwenden?

Jetzt besteht das Problem wenn ich im TrayIcon Exit drücke, das er bei ok kein Terminate macht, aber in der Form gehts.

ASM 24. Okt 2013 22:28

AW: Application.Terminate mit Msg.Dialog geht nur über TrayIcon Menü
 
Zitat:

Zitat von ReVenGer (Beitrag 1233087)
Ersetzt mir FormCloseQuery die Punkte OnClose und OnDestroy,

Nein. OnCloseQuery ist diesen vorgeschaltet.
OnClose und OnDestroy werden allerdings dann nicht mit besonderer Behandlung benötigt, solang es ausschließlich um das von Dir beschriebene Problem geht.

Zitat:

... oder muss ich die dann weiterhin verwenden?
Das "muss" hängt davon ab: Müssen beim Beenden des Programms abschließend noch instanziierte Objekte freigegeben und/oder evt. geöffnete Files etc. geschlossen werden, dann muss das natürlich spätestens in der Methode des OnDestroy-Ereignisses passieren. Entsprechendes gilt für evt. benötigte andere abschließende Aufgaben in der Methode des OnClose-Ereignisses. Zu beiden gelangt der weitere Ablauf ja einmalig und zwar nur dann, sobald der Var-Parameter CanClose in der Methode des OnCloseQuery-Ereignisses auf TRUE gesetzt worden ist (oder ggf. OnCloseQuery gar nicht behandelt werden würde, was einem CanClose=TRUE entspricht).

ReVenGer 25. Okt 2013 20:57

AW: Application.Terminate mit Msg.Dialog geht nur über TrayIcon Menü
 
Vielen Dank für die Erklärung. Jetzt verstehe ich das auch.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:06 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz