AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Registrieren, wenn das Programm beendet werden muss.
Thema durchsuchen
Ansicht
Themen-Optionen

Registrieren, wenn das Programm beendet werden muss.

Ein Thema von Cubysoft · begonnen am 9. Jan 2016 · letzter Beitrag vom 9. Jan 2016
Antwort Antwort
Cubysoft

Registriert seit: 5. Sep 2014
Ort: Ludwigshafen
76 Beiträge
 
Delphi XE8 Professional
 
#1

Registrieren, wenn das Programm beendet werden muss.

  Alt 9. Jan 2016, 01:30
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!
Tobias
  Mit Zitat antworten Zitat
Benutzerbild von geskill
geskill

Registriert seit: 17. Feb 2007
Ort: NRW
420 Beiträge
 
Delphi 2010 Professional
 
#2

AW: Registrieren, wenn das Programm beendet werden muss.

  Alt 9. Jan 2016, 02:32
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
Sebastian
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#3

AW: Registrieren, wenn das Programm beendet werden muss.

  Alt 9. Jan 2016, 03:04
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.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

AW: Registrieren, wenn das Programm beendet werden muss.

  Alt 9. Jan 2016, 09:19
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#5

AW: Registrieren, wenn das Programm beendet werden muss.

  Alt 9. Jan 2016, 09:42
Moin...
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.

...wenn darüber weiter diskutiert werden sollte, sollten wir das auslagern.
  Mit Zitat antworten Zitat
mm1256

Registriert seit: 10. Feb 2014
Ort: Wackersdorf, Bayern
642 Beiträge
 
Delphi 10.1 Berlin Professional
 
#6

AW: Registrieren, wenn das Programm beendet werden muss.

  Alt 9. Jan 2016, 10:54
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 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
Gruss Otto PS: Sorry wenn ich manchmal banale Fragen stelle. Ich bin Hobby-Programmierer und nicht zu faul die SuFu zu benutzen
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: Registrieren, wenn das Programm beendet werden muss.

  Alt 9. Jan 2016, 11:40
Moin...
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.

...wenn darüber weiter diskutiert werden sollte, sollten wir das auslagern.
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.
Angehängte Dateien
Dateityp: zip dp_187853.zip (893,4 KB, 15x aufgerufen)
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#8

AW: Registrieren, wenn das Programm beendet werden muss.

  Alt 9. Jan 2016, 11:53
Hallöle...

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...
Zitat:
Mach es richtig und schon funktioniert es wie es soll.
...aber immer doch.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

AW: Registrieren, wenn das Programm beendet werden muss.

  Alt 9. Jan 2016, 12:40
Ganz simpel:

Die erste an 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.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#10

AW: Registrieren, wenn das Programm beendet werden muss.

  Alt 9. Jan 2016, 13:47

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.
  Mit Zitat antworten Zitat
Antwort Antwort


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 03:07 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