Folgende Situation:
Ich habe einen Service, der eine Stapeldatei aufruft.
Diese ruft wiederum eine Anwendung auf, die ein paar Dinge macht. Durch
Application.Terminate wird diese Anwendung automatisch beendet.
Zumindest sollte es so sein.
Starte ich die Stapeldatei manuell, funktioniert alles, wei gewünscht. Wird aus dem Service heraus gestartet, Wird die Anwendung nicht beendet. Es hat den Eindruck, dass das
Appplication.Terminate nicht ausgeführt wird.
Da ich während des Durchlaufs in der Anwendung Protokolle er zeuge, weiß ich genau, dass das Programm bis zum Terminate durchläuft.
Im FormCreate mache ich folgendes:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| procedure TSDIAppForm.FormCreate(Sender: TObject); begin if ParamCount > 0 then begin Automatiklauf := True; SetzeFelder(ParamStr(1)); btnKomplett.Click; end else begin Automatiklauf := False; end; end; |
Wenn der Anwendung also ein Parameter übergeben wird, läuft es automatisch:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| procedure TSDIAppForm.btnKomplettClick(Sender: TObject); begin btnKomplett.Tag := 1; btnCommand.Click; btnSourceEinlesen.Click; btnTargetEinlesen.Click; btnDatensicherung.Click; btnKomplett.Tag := 0; if Automatiklauf then Application.Terminate; end; |
Das Programm ist bis auf die Fertig-Meldung ohne Dialoge.
Hat jemand eine Idee, was falsch sein könnte?
Ergänzung:
Das ist der Source, der am Schluss in btnDatensicherung.Click ausgeführt wird:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| if not Automatiklauf then begin frmProtokoll.ListBox1.Clear; frmProtokoll.ListBox1.Items.AddStrings(Protokoll); frmProtokoll.show; end else begin tmp := DateTimeToStr(now); tmp := StringReplace(tmp, '.', '-', [rfReplaceAll]); tmp := StringReplace(tmp, ':', '-', [rfReplaceAll]); Protokoll.SaveToFile(ExtractFilePath(ParamStr(0)) + tmp + '.pkl'); end; |
Das Protokoll wird definitiv erzeugt und ist wirklich der letzte Schritt vor dem Terminate.