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/)
-   -   Registrieren, wenn das Programm beendet werden muss. (https://www.delphipraxis.net/187853-registrieren-wenn-das-programm-beendet-werden-muss.html)

Cubysoft 9. Jan 2016 00:30

Registrieren, wenn das Programm beendet werden muss.
 
Hallo,

ich stehe derzeit vor einem kleinen Problem und hoffe, dass ihr mir (wie so oft vorher) dabei helfen könnt:


Klickt man in meiner Mainform auf den "Schließen"-Button (rotes X), wird mein Programm nur in den Tray minimiert. Dies mache ich durch das Event OnCloseQuery, indem ich CanClose auf false setze und dann die gewünschte Aktion durchführe.

Das Problem ist nun folgendes:

Möchte der Nutzer nun mein Programm doch beenden, z.B. durch den Taskmanager oder durch das Herunterfahren oder Abmelden, verweigert mein Programm natürlich weiterhin das schließen und minimiert sich brav in den Tray, bis es dann vom Betriebssystem/Taskmanager abgeschossen wird. Hier liegt dann auch das Problem. Mein Programm soll beim Beenden nämlich alle Daten abspeichern, wird es aber abgeschossen, wird dieser Schritt übersprungen, was bei dem Benutzer nicht gut ankommen wird.

Meine Frage ist nun: Wie kann ich merken, ob das Programm durch eine der oben genannten Möglichkeiten beendet wird? Ich würde dann nämlich ganz gern darauf reagieren und alles abspeichern und mein Programm dann ordnungsgemäß beenden.


Danke für eure Mithilfe!

geskill 9. Jan 2016 01:32

AW: Registrieren, wenn das Programm beendet werden muss.
 
Hey,
ich hätte dies auf den minimieren Bereich gelegt, oder einen neuen angelegt. Aber sei es drum.

Du kannst wenn der Benutzer das Programm mit dem TaskManager beendet nichts mehr machen. Windows killt das Programm sprichwörtlich.

Was du machen kannst und wie viele es machen, per Rechtsklick auf das Tray Icon ein Beenden Menü einblenden.

Letztes Problem: Windows fährt herunter. Hier kannst du das Event von Windows abfangen (WM_QUERYENDSESSION) und kurz vorher noch deine Einstellungen speichern und gegebenenfalls das Herunterfahren verzögern.

Liebe Grüße

Perlsau 9. Jan 2016 02:04

AW: Registrieren, wenn das Programm beendet werden muss.
 
Zitat:

Zitat von Cubysoft (Beitrag 1326465)
Mein Programm soll beim Beenden nämlich alle Daten abspeichern, wird es aber abgeschossen, wird dieser Schritt übersprungen, was bei dem Benutzer nicht gut ankommen wird. Meine Frage ist nun: Wie kann ich merken, ob das Programm durch eine der oben genannten Möglichkeiten beendet wird? Ich würde dann nämlich ganz gern darauf reagieren und alles abspeichern und mein Programm dann ordnungsgemäß beenden.

Ich würde in diesem Fall vorsorglich jedesmal nach dem Minimieren ins Tray speichern. Dann kann das Programm ruhig abgeschossen werden, es ist dann bereits alles in trockenen Tüchern.

Luckie 9. Jan 2016 08:19

AW: Registrieren, wenn das Programm beendet werden muss.
 
Ehrliche Meinung: Ich hasse Programme die sich nicht beenden, wenn man die Schließen-Schlatfläche vom Fenster benutzt. Die Schaltfläche ist zum Beenden des Programms da und nicht zum Minimieren in die TNA oder sonst wo hin. Skype ist auch so ein Fall. Es lässt sich auf normal Weg nicht beenden. Nur über das Menü des Icons in der TNA. So ein verhalten wäre für mich ein Punkt eine Alternative zu nutzen bzw. mich zumindest da nach um zu sehen.

haentschman 9. Jan 2016 08:42

AW: Registrieren, wenn das Programm beendet werden muss.
 
Moin...:P
Zitat:

Ehrliche Meinung: Ich hasse Programme die sich nicht beenden, wenn man die Schließen-Schlatfläche vom Fenster benutzt. Die Schaltfläche ist zum Beenden des Programms da und nicht zum Minimieren in die TNA oder sonst wo hin.
...sehe ich nicht so. Grundsätzlich alle Programme die in der TNA laufen haben dieses Verhalten und werden über ein Kontextmenü beendet. (Avira, SnippingTool, Teamviewer, Viber, Skype... usw.) Für mich sind "Fenster schließen" und "Beenden" 2 paar Schuhe. :thumb:

...wenn darüber weiter diskutiert werden sollte, sollten wir das auslagern. 8-)

mm1256 9. Jan 2016 09:54

AW: Registrieren, wenn das Programm beendet werden muss.
 
Zitat:

Zitat von geskill
Hey,Was du machen kannst und wie viele es machen, per Rechtsklick auf das Tray Icon ein Beenden Menü einblenden.

Letztes Problem: Windows fährt herunter. Hier kannst du das Event von Windows abfangen (WM_QUERYENDSESSION) und kurz vorher noch deine Einstellungen speichern und gegebenenfalls das Herunterfahren verzögern.

Zitat:

Zitat von perlsau
Ich würde in diesem Fall vorsorglich jedesmal nach dem Minimieren ins Tray speichern. Dann kann das Programm ruhig abgeschossen werden, es ist dann bereits alles in trockenen Tüchern.

Das sind die 3 wichtigsten Maßnahmen, und zusätzlich kann man noch folgendes tun:

Einen ganz normalen Menüpunkt zum Beenden in das Mainmenu einfügen, wodurch dann das Programm nicht minimiert wird, sondern direkt beendet werden kann. Hierzu braucht man dann eine Formvariable zur Entscheidung im OnClose.

Delphi-Quellcode:
procedure TMainform.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  if FTrayIconActive then begin
    Application.Minimize;
    CanClose := false;
  end;
  if CanClose then SaveAllDataAndLogout;
end;
Der Close-Event - sowohl im Tray-Menü als auch im Mainmenu - sieht dann so aus:

Delphi-Quellcode:
procedure TFrmHwpPhone.mTrayMenuCloseClick(Sender: TObject);
begin
  FTrayIconActive := false;
  Close;
end;
So nebenbei hat die Hilfsvariable den Vorteil, dass ich damit wahlweise das Verhalten des Programmes steuern kann, bzw. der Anwender selber entscheiden kann, ob er dieses Minimieren in den SysTray überhaupt möchte. Somit geht man allen unnötigen Diskussionen mit den Usern aus dem Weg, und anwenderfreundlich ist es auch :thumb:

Sir Rufo 9. Jan 2016 10:40

AW: Registrieren, wenn das Programm beendet werden muss.
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von haentschman (Beitrag 1326480)
Moin...:P
Zitat:

Ehrliche Meinung: Ich hasse Programme die sich nicht beenden, wenn man die Schließen-Schlatfläche vom Fenster benutzt. Die Schaltfläche ist zum Beenden des Programms da und nicht zum Minimieren in die TNA oder sonst wo hin.
...sehe ich nicht so. Grundsätzlich alle Programme die in der TNA laufen haben dieses Verhalten und werden über ein Kontextmenü beendet. (Avira, SnippingTool, Teamviewer, Viber, Skype... usw.) Für mich sind "Fenster schließen" und "Beenden" 2 paar Schuhe. :thumb:

...wenn darüber weiter diskutiert werden sollte, sollten wir das auslagern. 8-)

Wieso, das ist doch ganz schnell geklärt:

Mach es richtig und schon funktioniert es wie es soll.

Schau dir den Anhang an. Die Anwendung hat exakt das gewünschte Verhalten und blockiert trotzdem nicht das Beenden beim Herunterfahren.

haentschman 9. Jan 2016 10:53

AW: Registrieren, wenn das Programm beendet werden muss.
 
Hallöle...:P

:gruebel: Irgendwie verstehe ich den Zusammenhang nicht. Es ging darum das mit dem Schließen Button die Anwendung nicht beendet wird, sondern im Tray verbleibt. Dein Programm, und dessen Verhalten, entspricht exakt meiner Meinung und der Anderer... 8-)
Zitat:

Mach es richtig und schon funktioniert es wie es soll.
...aber immer doch. :tongue:

Sir Rufo 9. Jan 2016 11:40

AW: Registrieren, wenn das Programm beendet werden muss.
 
Ganz simpel:

Die erste an
Delphi-Quellcode:
TApplication
registrierte Form wird die MainForm und somit auch Stellvertreter für die Anwendung.

In diesem Zusammenhang kann man sagen, dass die MainForm die Anwendung selber ist.
Schließe ich diese Form, dann schließe ich die Anwendung.
Blockiere ich das Schließen dieser Form, dann blockiere ich das Schließen (Beenden) der Anwendung.

Nehme ich diese MainForm aber nur noch als Stellvertreter und nehme mir für die Darstellung andere Formulare, dann kann ich diese Formulare öffnen, schließen, minimieren ... whatever.

Meine Anwendung (verteten durch die MainForm, die nicht angezeigt wird) kann so aber von aussen ganz einfach beendet werden.

Das ist der Trick.

haentschman 9. Jan 2016 12:47

AW: Registrieren, wenn das Programm beendet werden muss.
 
:P
Zitat:

Blockiere ich das Schließen dieser Form, dann blockiere ich das Schließen (Beenden) der Anwendung.
...um das Blockieren ging es doch nicht in meiner Aussage. Es ging um das Nichtbeenden der Anwendung über den Schließen Button und das Verstecken in der TNA.
Zitat:

Meine Anwendung (verteten durch die MainForm, die nicht angezeigt wird) kann so aber von aussen ganz einfach beendet werden.
...davon gehe ich auch aus. 2 meiner Anwendungen laufen 24/7 in der TNA. Wenn der Computer runtergefahren wird wird das Beenden nicht blockiert. So soll es sein.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:00 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