Zitat von
Hansa:
Himitsu kann ich so nicht zustimmen. Es ist Blödsinn, das Textfile dauernd neu zu deklarieren. Deklariere es im Form-private-Teil und fertig.
Zitat von
Bounser:
Das heißt ich speicher es als private Variable und muss nur darauf achten, dass die Variable nur einmal mit AssignFile einen Dateipfad zugewiesen bekommt. Das wäre nun eine gute Variante. Danke für die Antworten!
Gruß Bounser
Nein so würde ich es nicht machen. Denn wo das hinführt haben wir ja gesehen. Es gibt keinen Grund diese Variable global zu deklarieren und auch wenn sie im private-Abschnitt der Formklasse steht, ist sie aus der Sicht der Formklasse global. Grundsätzlich gilt, dass man die Sichtbarkeiten so gering wie möglich halten soll, um Fehler zu vermeiden. Ein Fehler besteht nämlich darin, dass man die Variable für die Textdatei benutzt mit Rewrite, aber die Datei noch offen oder noch nicht offen ist. Der Compiler meckert aber nicht, weil er sie ja kennt. Und wie wir gesehen haben, ist der Fehler schwer zu finden, weil man überall im Code überprüfen muss, welchen Zustand denn nun die Dasteivariable hat. Deklariert man sie konsequent lokal und nur da wo man sie braucht, kann dies nicht passieren, da der Fehler schon beim programmieren auffällt und wenn nicht, kann die Stelle mit dem Fehler genau auf eine Stelle im Code eingegrenzt werden , die man sehr leicht beim Debuggen findet. Es sollte also so aussehen:
Delphi-Quellcode:
procedure Foo;
var
tf: TextFile;
begin
try
Assign(tf, '...');
Rewrite(tf);
Writeln(tf, '...');
CloseFile(tf);
except
on E: EInOutError
end;
end;
procedure Bar;
var
tf: TextFile;
begin
Assign(tf, '...');
Rewrite(tf);
Readln(tf, '...');
CloseFile(tf);
end;
Noch zu beachten wäre die Fehlerbehandlung, die hier gänzlich fehlt. Und die man mit einer globalen Textdateivariable kaum sauber hinbekommen hätte:
Delphi-Quellcode:
procedure Foo;
var
tf: TextFile;
begin
Assign(tf, '...');
{$I-} // automatische Fehlerbehandlung ausschalten, machen wir selber
Rewrite(tf);
{$I+}
if IOResult = 0 then // auf Fehler prüfen
begin
Writeln(tf, '...';
CloseFile(tf);
else // Fehler
ShowMessage(SysErrorMessage(GetLastError));
end;
Alternativ kann man auch mit Exceptions arbeiten, da die Ein- und Ausgaberoutinen entsprechende Exceptions auslösen:
Delphi-Quellcode:
procedure Foo;
var
tf: TextFile;
begin
AssignFile(tf, '
...');
try
Rewrite(tf);
Writeln(tf, '
jhegfejhsd');
CloseFile(tf);
except
CloseFile(tf);
// Mögliche offene Datei schliessen
raise;
// Exception erneut auslösen, um sie an den Aufrufer hoch zu reichen
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
try
Foo;
except
on E: EInOutError
do // Exception abfangen und behandlen
ShowMessage(E.
Message);
end;
end;