Einzelnen Beitrag anzeigen

Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.735 Beiträge
 
Delphi 2007 Professional
 
#7

AW: E/A-Fehler in Wrapperklasse

  Alt 22. Feb 2012, 07:47
Wenn der Constructor fehlschlägt (Exception), dann wird die Klasse gleich wieder freigegeben (Destroy wird aufgerufen).
(Ob das soweit stimmt, würde einem der Debugger verraten)

Die Klasse entspricht also eher diesem: (man beachte das Reset)
Delphi-Quellcode:
procedure Test(const AFileName: string);
var
  f: TextFile;
begin
  AssignFile(f, AFileName);
  try
    Reset(f);
    //
  finally
    CloseFile(f);
  end;
end;
Wie sieht denn die Fehlermeldung hier aus?
OK, das ist es. Jetzt, wo ich es auf dem Silbertablett serviert kriege, sehe ich es auch.

Und was passiert bei Folgendem?
Delphi-Quellcode:
destructor TTest.Destroy;
begin
  if TFileRec(f).Mode <> fmClosed then
    CloseFile(f);
  inherited;
end;

// oder
destructor TTest.Destroy;
begin
  //if TFileRec(f).Mode in [fmInput, fmOutput, fmInOut] then
  if TFileRec(f).Mode = fmInput then
    CloseFile(f);
  inherited;
end;
Ich habe die erste Variante genommen (mit TTextRec statt TFileRec) und kriege jetzt das erhoffte Ergebnis. Ist eigentlich logisch - ist ja der gleich Grund, aus dem man (mindestens) in Destruktoren Free statt Destroy aufrufen sollte - damit nur tatsächliche allozierte Ressourcen freigegeben werden.

Vielen Dank euch allen!
Uli Gerhardt
  Mit Zitat antworten Zitat