Nach fast getaner Arbeit startet mein Programm einen TTimer.
Der TTimer prüft, ob die Hauptarbeit denn nun wirklich vorbei ist oder nicht anhand dreier Boolean-Variablen die an verschiedenen Stellen gesetzt werden / resettet werden.
Trifft alles zu, steht im Timer Close;
In manchen Fällen schmiert hier das Programm ab. Ich schreibe zum Test vor dem Close im Close-Event selber an oberster Stelle eine Log-Datei. Etwa so
Delphi-Quellcode:
// Programm wird gestartet
// Wenn Programm gestartet, dann wird eine Prozedur aufgerufen, welche einen Timer (Timer_Arbeit) startet
// Dieser Timer setzt Timer_Arbeit.Enabled:=False und klickt Button1
// Wenn Button1-Arbeit fertig, wird Timer1 gestartet
// Sobald ArbeitImGange=True, darf Timer1 Close; aufrufen.
// Der Fehler kommt oft zwischen dem Ende von Timer_Arbeit und Timer1
procedure TForm1.Button1Click(Sender: TObject);
begin
ArbeitImGange := True;
// mache deine Arbeit!
// wenn fertig dann...
Timer1.Enabled := True;
ArbeitImGange := False;
end;
// timer
procedure Timer1Timer(Sender: TObject);
begin
if not ArbeitImGange dann
begin
Timer1.Enabled := False;
schreibeLog('1. Schließen gestartet');
Close;
end;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
schreibeLog('2. Schließen geht weiter ...');
// mach weiter
end;
Wenn das Programm abschmiert, steht Lognachricht #1 im Log, #2 aber nicht.
Wenn ich in der Windows-Meldung (APPCRASH) "Das Programm funktioniert nicht mehr" auf OK klicke, wird auch #2 ins Log geschrieben.
D.h da schmiert zwar irgendetwas ab, sobald ich die Windows-Meldung aber bestätige geht es weiter.
Darf man Close; nicht in einem Timer verwenden?