Also ich poste hier einfach mal mein erstes Tutorial rein:
Inhalt:
- Vorwort
- Prüfen, ob eine Datei existiert
- Der einfachste Weg: Speichern einer Stringlist
- Back to the roots: Arbeiten mit dem Typ Textfile
- Konfigurationsdateien: Arbeiten mit TIniFile
- Schlusswort
I: Die Demos stehen hier zum Download zur verfügung.
Vorwort
Häufig ist es erforderlich, in Dateien zu schreiben bzw. aus Dateien zu lesen. Dies ist z.B. nötig, um Konfigurationsdateien zu erstellen, Daten des Benutzers zu speichern (z.B. Texte in einem Editor) oder Informationen aus anderen Anwendungen auszulesen. Es gibt sehr viele Anwendungsgebiete, da die Möglichkeit der Informationsspeicherung in Dateien sehr viel älter ist als die Registrierungsdaten von Microsoft Windows. Dieses Tutorial soll einige Möglichkeiten des Dateizugriffs zeigen und an kleinen Beispielen demonstrieren.
Prüfen, ob eine Datei existiert
Bevor man eine Datei zum Lesen öffnen kann, sollte man prüfen, ob diese überhaupt existiert. Ist dies nicht der Fall, so löst ein Aufruf zum Laden meist eine Exception aus. Zum Prüfen auf Existenz einer Datei bietet die Unit
SysUntils die Funktion FileExists(const FileName: string): Boolean; an, mit welcher eine Existenzprüfung sehr einfach ist:
Delphi-Quelltext
1:
| if FileExists('C:\Test.txt') then ShowMessage('Datei existiert') else ShowMessage('Datei existiert nicht!'); |
I: Die Unit SysUtils bietet auch eine Möglichkeit herauszufinden, ob ein Verzeichnis existiert. Hierbei handelt es sich um die Funktion DirectoryExists(const Directory: string): Boolean;, welche hier nicht weiter intessieren soll.
Der einfachste Weg: Speichern einer Stringlist
Eine Stringlist bietet die Möglichkeit, über einen direkten Aufruf ihren Inhalt in eine Textdatei zu schreiben bzw. zu lesen. Da die Stringlist von TMemo benutzt wird, betrachte ich diese Möglichkeit als die einfachste, da man mit nur jeweils einer Programmzeile den Dateizugriff vollziehen kann. Diese Aufrufe nennen sich SaveToFile und LoadFromFile. Da, wie bereits erwähnt, auch ein TMemo mit einer Stringlist arbeitet, ist folgendes Beispielprogramm realisierbar:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| const Datei='C:\Test.txt';
procedure TForm1.Button1Click(Sender: TObject); begin if FileExists(Datei) then Memo1.Lines.LoadFromFile(Datei) else ShowMessage('Die Datei '+Datei+' wurde nicht gefunden!'); end;
procedure TForm1.Button2Click(Sender: TObject); begin Memo1.Lines.SaveToFile(Datei); end; |
Zuvor sollten auf einem neuen Formular ein Memo und zwei Buttons erstellt worden sein. Schreibt man nun in das Memo einen Text hinein und klickt anschließend Button2 (Projekt starten nicht vergessen
), so wird der Inhalt des Memos in die Datei C:\Test.txt geschrieben. Ein Klick auf Button1 stellt diesen Text wieder her, selbst wenn die Anwendung zuvor neu gestartet oder der Text im Memo geändert wurde. Nun ist unsere Anwendung in der Lage, Daten zu speichern, welche der Benutzer eingegeben hat. Will man jedoch Daten speichern, die automatisch eingefügt werden, müssen diese erst in das Memo gespeichert werden. Mit der letzten Zeile wird demonstriert, wie man den Text aus einer Stringlist wieder laden kann.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| procedure TForm1.FormCreate(Sender: TObject); begin Memo1.Lines.Clear; Memo1.Lines.Add('Hello world'); ShowMessage(Memo1.Lines[0]); end; |
I: Zur Speicherung von Konfigurationsinformationen sollten Sie kein Memo verwenden. Verwenden Sie statt dessen lieber direkt eine Stringlist oder eine der folgenden Methoden.
Back to the roots: Arbeiten mit dem Typ Textfile
Das Arbeiten mit Textfiles stammt noch aus der Zeit von Turbo Pascal. Das heißt jedoch nicht, dass diese Methode heute nicht mehr verwandt werden sollte. Ganz im Gegenteil, denn das Arbeiten mit dem Typ Textfile ist die zweiteinfachste Methode des Dateizugriffs mit Delphi. Zur Arbeit mit Textfiles ist es erforderlich, eine Variable als
Textfile zu definieren. Dieser Variable wird anschließend mit AssignFile(var F; FileName: string) ein Dateiname zugewiesen. Mit den Aufrufen Rewrite(var F), Append(var F: Text) oder Reset(var F); wird die Datei geöffnet. Mit den Befehlen WriteLn und ReadLn ist dann ein Zugriff auf die Datei möglich. Anschließend wird die Datei mit CloseFile(var F); wieder geschlossen. Ein einfaches Beispiel:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43:
| const Datei='C:\Test.txt';
procedure TForm1.FormCreate(Sender: TObject); var F:TextFile; a,b:string; begin if FileExists(Datei) then begin AssignFile(F,Datei); {$I-} Reset(F); {$I+} if IOResult<>0 then begin ShowMessage('Fehler beim Öffnen der Datei zum Lesen'); Exit; end; ReadLn(F,a); ReadLn(F,b); CloseFile(F); ShowMessage('Zeile1: '+a+#13+ 'Zeile2: '+b); end; end;
procedure TForm1.Button1Click(Sender: TObject); var F:TextFile; a,b:string; begin a:='Hello'; b:='world';
AssignFile(F,Datei); {$I-} Rewrite(F); {$I+} if IOResult<>0 then begin ShowMessage('Fehler beim Öffnen der Datei zum Schreiben'); Exit; end; WriteLn(F,a); WriteLn(F,b); CloseFile(F); end; |
Eigentlich ganz einfach
I: In dem Beispiel werden nur Strings gespeichert, allerdings kann man auch andere Typen speichern. Dazu ist es nur nötig, die Definition der Variable a bzw. b zu ändern!
Konfigurationsdateien: Arbeiten mit TIniFile
Bisher haben wir ausschließlich das Arbeiten mit reinen Textdateien behandelt. Nun wollen wir Konfigurationsdateien erstellen. Diese lassen sich zwar auch mit den oben gennanten Methoden erstellen, mit dem Typ TIniFile ist dies jedoch sehr viel einfacher! Zuerst sollten Sie die Unit
IniFiles einbinden. Nun kann eine Variable als Typ TIniFile definiert werden, mit welcher ein Zugriff auf eine Datei möglich wird:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24:
| uses Inifiles; const Datei='C:\Test.ini';
procedure TForm1.FormCreate(Sender: TObject); begin if FileExists(Datei) then with TIniFile.Create(Datei) do try ShowMessage('Inhalt von Test\Text: '+ReadString('Test','Text','')); ShowMessage('Inhalt von Test\Zahl: '+IntToStr(ReadInteger('Test','Zahl',0))); ShowMessage('Inhalt von Test\Dual: '+BoolToStr(ReadBool('Test','Dual',False),True)); finally Free; end; end;
procedure TForm1.Button1Click(Sender: TObject); begin with TIniFile.Create(Datei) do try WriteString('Test','Text','Hello world'); WriteInteger('Test','Zahl',32); WriteBool('Test','Dual',True); finally Free; end; end; |
Starten Sie nun ihr Projekt und klicken Sie auf Button1, um die Werte in die Datei zu schreiben. Schließen Sie die Anwendung und betrachten Sie sich die Datei C:\Test.ini im Texteditor. Wie Sie sehen, hat Delphi uns eine ganze Menge Arbeit abgenommen und die Variablen an der richtigen Position in die Datei geschrieben. Wenn Sie das Projekt nun erneut starten, so sollten Ihnen drei Dialogfenster präsentiert werden, die jeweils eine Variable der Datei anzeigen.
I: Mit TIniFiles ist sehr viel mehr möglich, als hier beschrieben wurde. Zum Beispiel bieten die Read-Funktionen die Möglichkeit, Standardwerte zu übergeben. Wenn Sie mehr Informationen wünschen, so klicken Sie sich bitte durch die Delphihilfe.
Schlusswort
Wie Sie sehen, gibt es in Delphi verschiedene Möglichkeiten, auf Dateien zuzugreifen. In diesem Tutorial wollte ich nur einen kleinen Einblick in das Arbeiten mit Textdateien geben. Es gibt selbstverständlich auch die Möglichkeit, komplexere Inhalte zu bearbeiten (Stichwort Streams). Wenn Sie darüber mehr Informationen erhalten wollen, kann ein Blick in die Delphihilfe nicht schaden. Auch der Griff zu einer Internetsuchmaschine lohnt sich sicherlich...
// Edit: Danke an opfer.der.genauigkeit für den Hinweis, dass die Verwendung des Schalters I noch fehlte!
Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.