AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Application.Terminate mit Msg.Dialog geht nur über TrayIcon Menü

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

Ein Thema von ReVenGer · begonnen am 24. Okt 2013 · letzter Beitrag vom 25. Okt 2013
Antwort Antwort
ReVenGer

Registriert seit: 11. Okt 2005
Ort: Hannover
50 Beiträge
 
Delphi XE7 Architect
 
#1

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

  Alt 24. Okt 2013, 19:01
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
  Mit Zitat antworten Zitat
ASM

Registriert seit: 15. Aug 2004
165 Beiträge
 
Delphi 7 Enterprise
 
#2

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

  Alt 24. Okt 2013, 19:51
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;
  Mit Zitat antworten Zitat
ReVenGer

Registriert seit: 11. Okt 2005
Ort: Hannover
50 Beiträge
 
Delphi XE7 Architect
 
#3

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

  Alt 24. Okt 2013, 20:14
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.

Geändert von ReVenGer (24. Okt 2013 um 20:47 Uhr)
  Mit Zitat antworten Zitat
ASM

Registriert seit: 15. Aug 2004
165 Beiträge
 
Delphi 7 Enterprise
 
#4

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

  Alt 24. Okt 2013, 22:28
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).
  Mit Zitat antworten Zitat
ReVenGer

Registriert seit: 11. Okt 2005
Ort: Hannover
50 Beiträge
 
Delphi XE7 Architect
 
#5

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

  Alt 25. Okt 2013, 20:57
Vielen Dank für die Erklärung. Jetzt verstehe ich das auch.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:33 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