![]() |
Application.Terminate bei geöffneter Datei - Fehler?
Wie im Thread-Titel schon geschrieben verursacht Application.Terminate ein Fehler in meiner EOF Schleife....
Hier der Code :
Delphi-Quellcode:
Danke für jede Anmerkung und Idee :)
procedure TFrmMain.FileParse(strFile : string);
var Datei: TextFile; strZeile, strCommand, strParam : string; RegEx, RegExLine : TRegExpr; intCountDownloads, intMaxDownloads : integer; begin intCountDownloads := 0; intMaxDownloads := 0; RegEx := TRegExpr.Create; RegExLine := TRegExpr.Create; RegEx.Expression := '^\s*(\w+)\s*\=(.+)\s*\;$'; AssignFile(Datei, strFile); Reset(Datei); while not eof(Datei) do begin ReadLn(Datei, strZeile); if RegEx.Exec(strZeile) then begin strCommand := RegEx.Match[1]; strParam := RegEx.Match[2]; if strCommand = 'create_directory' then begin if not DirectoryExists(strParam) then CreateDir(strParam); end else if strCommand = 'download' then begin RegExLine.Expression := '^\s*(.+)\s*\;(.+)\s*'; if RegExLine.Exec(strParam) then begin inc(intCountDownloads); if intMaxDownloads > 0 then begin LabelFileNummer.Caption := IntToStr(intCountDownloads) + ' / ' + IntToStr(intMaxDownloads); end else begin LabelFileNummer.Caption := IntToStr(intCountDownloads); end; HTTPDownloadFile(RegExLine.Match[1],RegExLine.Match[2]); ProgressBarAll.StepIt; end; end else if strCommand = 'downloads' then begin intMaxDownloads := strtoint(strParam); ProgressBarAll.Max := intMaxDownloads; end else if strCommand = 'exit' then begin CloseFile(Datei); Application.Terminate; end; end; end; CloseFile(Datei); end; Gruß, Real-TTX |
Re: Application.Terminate bei geöffneter Datei - Fehler?
Hallo
Setze bei Application.Terminate; einen Haltepunkt und führe dann den Code schrittweise weiter aus (F8) Dann wirst du sehen, warum ein Fehler kommt. |
Re: Application.Terminate bei geöffneter Datei - Fehler?
Delphi-Quellcode:
fällt dir was auf?
while not eof(Datei) do
... CloseFile(Datei); Application.Terminate; end; end; end; CloseFile(Datei); ( zweimal CloseFile(Datei) ) wobei da zuerst eof(Datei) aufgerufen wird ... so oder so ergibt das eine Exception, da die datei schon geschlossen ist. versuch mal
Delphi-Quellcode:
oder besser noch
end else if strCommand = 'exit' then
begin CloseFile(Datei); Application.Terminate; Exit; end;
Delphi-Quellcode:
Application.Terminate; sagt dem Programm nur, daß es beendet werden soll, aber die aktuelle Prozedur wird dadurch nicht beendet.
end else if strCommand = 'exit' then
begin Application.Terminate; Break; end; |
Re: Application.Terminate bei geöffneter Datei - Fehler?
Zitat:
|
Re: Application.Terminate bei geöffneter Datei - Fehler?
Probier mal, das Application.Terminate; durch ein Close; zu ersetzen. Wenn du FileParse nicht im FormCreate aufrufst, müsste das auch gehen, und ich finde es sauberer.
Sonst gilt natürlich, was himitsu geschrieben hat: Application.Terminate beendet (wie Close übrigens auch) das Programm nicht sofort, sondern erst etwas später. Die Prozedur wird noch korrekt beendet. Noch ein Hinweis: Pack um die Schleife am Besten noch ein
Delphi-Quellcode:
Nur damit wird sichergestellt, dass die Datei auch geschlossen wird. Und das ist nun wirklich ein heikles Thema.
try ... finally CloseFile(Datei); end;
|
Re: Application.Terminate bei geöffneter Datei - Fehler?
Danke für die Antworten :)
Ich habe es nun hinbekommen mit der Lösung von himitsu. Mein Problem war: Ich wusste nicht dass trotz Application.Terminate die Prozedur noch beendet wird. Ist für mich völlig Sinnfrei, dass bei Terminate noch etwas gemacht wird... :) Aber danke für die Info :) Gruß, Real-TTX |
Re: Application.Terminate bei geöffneter Datei - Fehler?
Zitat:
Wenn du mal genau hinschaust, siehst du, dass da sogar noch eine ganze Menge passiert: Alle Formular und Steuerelemente müssen freigegeben werden, alle Units finalisiert (finalization wird ausgeführt), Threads werden beendet etc. Wenn das Programm wirklich abstürzen lassen willst, dann musst du Halt; verwenden. Das ist allerdings die unsauberste Variante, ein Programm zu beenden, da wirklich kein Speicher freigegeben wird o.ä. Sollte man nur in Konsolenanwendungen benutzen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:48 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz