AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Application.Terminate bei geöffneter Datei - Fehler?
Thema durchsuchen
Ansicht
Themen-Optionen

Application.Terminate bei geöffneter Datei - Fehler?

Ein Thema von Real-TTX · begonnen am 16. Apr 2009 · letzter Beitrag vom 16. Apr 2009
Antwort Antwort
Real-TTX

Registriert seit: 7. Mai 2008
Ort: Stuttgart / Wertheim
136 Beiträge
 
Delphi 2007 Enterprise
 
#1

Application.Terminate bei geöffneter Datei - Fehler?

  Alt 16. Apr 2009, 20:25
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_directorythen
      begin
        if not DirectoryExists(strParam) then
        CreateDir(strParam);
      end else if strCommand = 'downloadthen
      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 = 'downloadsthen
      begin
        intMaxDownloads := strtoint(strParam);
        ProgressBarAll.Max := intMaxDownloads;
      end else if strCommand = 'exitthen
      begin
        CloseFile(Datei);
        Application.Terminate;
      end;
    end;
  end;
  CloseFile(Datei);
end;
Danke für jede Anmerkung und Idee

Gruß, Real-TTX
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#2

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

  Alt 16. Apr 2009, 20:43
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.
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#3

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

  Alt 16. Apr 2009, 20:44
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 = 'exitthen
begin
  CloseFile(Datei);
  Application.Terminate;
  Exit;
end;
oder besser noch
Delphi-Quellcode:
end else if strCommand = 'exitthen
begin
  Application.Terminate;
  Break;
end;
Application.Terminate; sagt dem Programm nur, daß es beendet werden soll, aber die aktuelle Prozedur wird dadurch nicht beendet.
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#4

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

  Alt 16. Apr 2009, 20:50
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.
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von Yogu
Yogu

Registriert seit: 10. Jan 2008
15 Beiträge
 
Turbo Delphi für Win32
 
#5

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

  Alt 16. Apr 2009, 20:51
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

try ... finally CloseFile(Datei); end; Nur damit wird sichergestellt, dass die Datei auch geschlossen wird. Und das ist nun wirklich ein heikles Thema.
Yogu
  Mit Zitat antworten Zitat
Real-TTX

Registriert seit: 7. Mai 2008
Ort: Stuttgart / Wertheim
136 Beiträge
 
Delphi 2007 Enterprise
 
#6

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

  Alt 16. Apr 2009, 21:22
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
  Mit Zitat antworten Zitat
Benutzerbild von Yogu
Yogu

Registriert seit: 10. Jan 2008
15 Beiträge
 
Turbo Delphi für Win32
 
#7

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

  Alt 16. Apr 2009, 21:45
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

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.
Yogu
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:37 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