Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Event beim Schließen / "Abschiessen" des Programms (https://www.delphipraxis.net/154957-event-beim-schliessen-abschiessen-des-programms.html)

KahPee 3. Okt 2010 01:40

Event beim Schließen / "Abschiessen" des Programms
 
Hallo,

ich suche ein Event das ausgelöst wird beim Schließen des Programms. Es soll zu dem zeitpunkt ein wert in einer bestimmten Datei geändert werden, der anzeigt, dass das Programm nicht mehr läuft. Wenn alles planmäßig läuft kann ich das im OnClose machen. Wie fange ich jetzt aber die Möglichkeit ab, dass sich das Programm aufhängt (warum auch immer) und das OnCLose nicht ausgelöst wird (z.B. Beenden mit dem Taskmanager/Prozess beenden)..

Vielen Dank

KahPee

Sir Rufo 3. Okt 2010 02:24

AW: Event beim Schließen / "Abschiessen" des Programms
 
In der .dpr

Delphi-Quellcode:
Begin
  ...
  Application.Run;
  // Hier ist der EndOfApplicationEvent
end.
Wenn das Programm abgeschossen wird ... Das kann man nicht abfangen

BTW OnClose wird nicht nur beim Beenden der Application aufgerufen.

Eine weitere Möglichkeit ist es auch eine Unit zu schreiben und im initialization und finalization Teil dieses zu handeln.
Das ist eigentlich am elegantesten.

Björn Ole 3. Okt 2010 02:33

AW: Event beim Schließen / "Abschiessen" des Programms
 
Falls du das Abschießen irgendwie mitbekommen willst, könntest du über MSDN-Library durchsuchenCreateFile mit dwFlagsAndAttributes = FILE_FLAG_DELETE_ON_CLOSE eine temporäre Datei erstellen, die gelöscht wird, sobald das Programm beendet wird.

Luckie 3. Okt 2010 11:24

AW: Event beim Schließen / "Abschiessen" des Programms
 
Und was hat er davon? Ich kann dir nicht ganz folgen. Und ich wäre mir nicht so sicher, ob die API-Funktion noch aufgerufen wird, weil der Prozess ja abgeschossen wird. Wenn der Klitschko dir eine vor die Birne haut, dann wirst du auch keine Zeit mehr haben dir die Nase zu putzen bevor du umfällst. ;)

KahPee 3. Okt 2010 11:47

AW: Event beim Schließen / "Abschiessen" des Programms
 
Vielleicht ist das auch der falsche Ansatz (weil hier jemand fragt was hab ich davon). Ich habe vor, dass das Programm nicht zweimal gestartet werden kann. Mein erster Gedanke war beim Starten zu gucken ob die "MeinProgramm.exe" schon gestartet ist. Nur ist es so, dass sich das Programm logischer Weise dann selbst erkennt^^. Nun sollte eine Booleanvariable in einer Datei genau das Problem beheben. Beim Start wird die Variable auf true und beim schließen auf false gesetzt. Das programm startet in der Folge nur wenn diese Variabele auf false steht. Wenn das Programm nun aber "abgeschossen" wird. Weil es einen Bug hat und nicht mehr weiterläuft. Dann gibt es das Problem, dass man den Wert erst per Hand ändern muss damit das Programm wieder startet.

Gibt es noch andere Lösungsvorschläge - jetzt wo ich ein bisschen klarer ausgedrückt habe worum es mir eigentlich geht?

mfg Kahpee

Sir Rufo 3. Okt 2010 11:58

AW: Event beim Schließen / "Abschiessen" des Programms
 
Zitat:

Zitat von Luckie (Beitrag 1053454)
Und was hat er davon? Ich kann dir nicht ganz folgen. Und ich wäre mir nicht so sicher, ob die API-Funktion noch aufgerufen wird, weil der Prozess ja abgeschossen wird. Wenn der Klitschko dir eine vor die Birne haut, dann wirst du auch keine Zeit mehr haben dir die Nase zu putzen bevor du umfällst. ;)

Die Datei wird korrekt wieder gelöscht, auch wenn das Programm mit dem Task-Manager abgeschossen wird (ich habe es aber auch erst geglaubt als ich es gesehen habe ;) )

Nun ob er schaut ob in einer Datei ein entsprechender Wert gesetzt ist, oder ob eine Datei vorhanden ist ... kommt ja quasi aufs gleiche heraus ... allerdings um zu überprüfen ob die Anwendung aktuell läuft oder nicht kann ich ja auch bei den laufenden Prozessen nachsehen ;)

Viel interessanter ist es zu wissen, ob das Programm während der letzten Ausführung abgeschossen (bzw. unkonventionell) beendet wurde. Und dafür müsste die Datei bestehen bleiben.

@KahPee Schau mal nach Hier im Forum suchenMutex, das braucht man zur Erkennung, ob eine Anwendung schon läuft

rollstuhlfahrer 3. Okt 2010 11:59

AW: Event beim Schließen / "Abschiessen" des Programms
 
Die eleganteste Art und Weise, ein Programm vor mehrfachem Starten zu schützen ist eine Mutex. Einfach mal suchen, dann findest du auch die Beispiele dazu.

ein paar Links:
Bernhard

idefix2 3. Okt 2010 12:18

AW: Event beim Schließen / "Abschiessen" des Programms
 
Delphi-Quellcode:
procedure AbortIfNotUnique (const Bezeichnung: string);
begin
  createMutex( nil, true, PWideChar(Bezeichnung));
  if GetLastError = ERROR_ALREADY_EXISTS then
  begin
    MessageDlg('Das Programm '+Bezeichnung+' ist schon in Betrieb'#13#10
                +'Sie können immer nur eine Version des Programmes starten',
                mtError,[mbOk],0);
    halt;
  end;
end;


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