Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Application.Terminate bei geöffneter Datei - Fehler? (https://www.delphipraxis.net/132648-application-terminate-bei-geoeffneter-datei-fehler.html)

Real-TTX 16. Apr 2009 19:25


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:
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;
Danke für jede Anmerkung und Idee :)

Gruß, Real-TTX

toms 16. Apr 2009 19:43

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.

himitsu 16. Apr 2009 19:44

Re: Application.Terminate bei geöffneter Datei - Fehler?
 
Delphi-Quellcode:
while not eof(Datei) do
...
      CloseFile(Datei);
      Application.Terminate;
    end;
  end;
end;
CloseFile(Datei);
fällt dir was auf?
( 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:
end else if strCommand = 'exit' then
begin
  CloseFile(Datei);
  Application.Terminate;
  Exit;
end;
oder besser noch
Delphi-Quellcode:
end else if strCommand = 'exit' then
begin
  Application.Terminate;
  Break;
end;
Application.Terminate; sagt dem Programm nur, daß es beendet werden soll, aber die aktuelle Prozedur wird dadurch nicht beendet.

toms 16. Apr 2009 19:50

Re: Application.Terminate bei geöffneter Datei - Fehler?
 
Zitat:

Zitat von himitsu
Delphi-Quellcode:
.
        CloseFile(Datei);
        Application.Terminate;
      end;
    end;
  end;
  CloseFile(Datei);
end;
fällt dir was auf?
( zweimal CloseFile(Datei) )

Der Fehler entsteht jedoch primär nicht dort obwohl das zweimal CloseFile auch zu einem Fehler führen wird.

Yogu 16. Apr 2009 19:51

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:
try ... finally CloseFile(Datei); end;
Nur damit wird sichergestellt, dass die Datei auch geschlossen wird. Und das ist nun wirklich ein heikles Thema.

Real-TTX 16. Apr 2009 20:22

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

Yogu 16. Apr 2009 20:45

Re: Application.Terminate bei geöffneter Datei - Fehler?
 
Zitat:

Zitat von Real-TTX
Ist für mich völlig Sinnfrei, dass bei Terminate noch etwas gemacht wird... :)

Das ist ganz und gar nicht sinnfrei, denn schließlich will man vielleicht noch Dateien schließen :P

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