Einzelnen Beitrag anzeigen

Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#14

Re: Dateien erstellen, schreiben, Lesen (E/A-Fehler 32 &

  Alt 8. Mai 2008, 08:19
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;
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat