Einzelnen Beitrag anzeigen

alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#13

Re: try & except Problem

  Alt 21. Jun 2006, 07:15
Zitat von Waldteufel:
Zitat von atreju2oo0:
mach aus dem rewrite mal nen normales write...
Aber nur aus dem zweiten. Rewrite öffnet nämlich die Datei...
Stimmt zwar, aber im Kontext des Codes ist es falsch (WriteLn statt Write, beide auf Writeln, dafür das Reset auf Rewrite):
Delphi-Quellcode:
try
  assignfile (datei, 'rekord.txt'); //rekord wird geladen
  reset (datei);
  readln (datei, rekordhalter);
  readln (datei, punkttxt);
  closefile (datei);
except
  reset (datei);
  rewrite (datei, 'NoName');
  rewrite (datei, '10');
  closefile (datei);
  assignfile (datei, 'rekord.txt');
end;
Da stimmen mehrere Sachen nicht.
  • Erstmal muss das AssignFile VOR das Try.
  • 'Reset' öffnet eine Datei zum Lesen, 'Rewrite' öffnet sie zum Schreiben, initialisiert sie aber (sie ist also nach dem Rewrite komplett leer).
  • Den Dateinamen solltest Du irgendwo als Konstante deklarieren.
  • Dein Codefragment setzt 'Rekordhalter' und 'PunkteTxt' nur dann, wenn die Datei existiert, sonst ist der Inhalt der Variablen undefiniert.
Dann würde ich das anders lösen: Der Inhalt der Datei kann nur gelesen werden, wenn die Datei auch existiert, bzw. wird sie mit Vorgabewerten belegt, wenn sie noch nicht exisitiert:
Delphi-Quellcode:
Const
  MyFilename = 'rekord.txt';
  VorgabeName = 'NoName';
  VorgabePunkte = '10';
...
  assignfile (datei, MyFileName);
  If Not FileExists (MyFileName) Then Begin // Wenn die Datei nicht existiert, wird sie mit Vorgabewerten belegt
    ReWrite (datei); // Öffnet die Datei zum Schreiben und setzt den Dateiendezeiger nach vorne
    Try // Fehlerbehandlung für 'rewrite' fehlt.
      rekordhalter := VorgabeName; // Jetzt sind die Variablen belegt
      PunktTxt := VorgabePunkte;
      WriteLn (datei, RekordHalter); // Vorgabewerte in die Datei schreiben
      WriteLn (datei, PunktTxt);
    Finally
      CloseFile (Datei);
    End
  End
  Else Begin // Datei existiert, kann also gelesen werden
    reset (datei); // Hier müsste noch eine komplette Fehlerbehandlung rein
    Try // Denn die Datei kann gesperrt sein, oder sonstwas
      readln (datei, rekordhalter);
      readln (datei, punkttxt);
    Finally
     closefile (datei);
    End
  End;
...
Die Fehlerbehandlung für das Öffnen der Datei kann man durch umschließen der gesamten Routine mit einem Try...Except erreichen, nurdas das etwas ungenau ist.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat