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!