Autor Beitrag
maxk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1696
Erhaltene Danke: 1

Win XP, Debian Lenny
Delphi 6 Personal
BeitragVerfasst: Do 02.09.04 08:15 
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:
ausblenden 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:
ausblenden 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.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TForm1.FormCreate(Sender: TObject);
begin
 Memo1.Lines.Clear;              // Löscht alle Zeilen aus der Stringlist und damit auch dem Memo
 Memo1.Lines.Add('Hello world'); // Fügt eine Zeile mit dem Inhalt "Hello world" hinzu

 ShowMessage(Memo1.Lines[0]);    // Zeigt den Inhalt der ersten Zeile der Stringlist/Memo an
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:
ausblenden volle Höhe 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:
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); // Variable F Dateinamen zuweisen
  {$I-}                // Fehlermeldungen unterdrücken
  Reset(F);            // Datei zum Lesen öffnen
  {$I+}                // Fehlermeldungen anzeigen
  if IOResult<>0 then begin
   ShowMessage('Fehler beim Öffnen der Datei zum Lesen');
   Exit;
  end;
  ReadLn(F,a);         // Erste Zeile der Datei F in Variable a einlesen
  ReadLn(F,b);         // Zweite Zeile der Datei F in Variable b einlesen
  CloseFile(F);        // Datei schließen

  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); // Variable F Dateinamen zuweisen
 {$I-}                // Fehlermeldungen unterdrücken
 Rewrite(F);          // Datei zum Schreiben öffnen (vorhanden Inhalt löschen)
 {$I+}                // Fehlermeldungen anzeigen
 if IOResult<>0 then begin
  ShowMessage('Fehler beim Öffnen der Datei zum Schreiben');
  Exit;
 end;
 WriteLn(F,a);        // Variable a in erste Zeile der Datei F schreiben
 WriteLn(F,b);        // Variable b in zweite Zeile der Datei F schreiben
 CloseFile(F);        // Datei schließen
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:
ausblenden 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                         // Öffne die Datei
  ShowMessage('Inhalt von Test\Text: '+ReadString('Test','Text',''));                 // Lese einen String
  ShowMessage('Inhalt von Test\Zahl: '+IntToStr(ReadInteger('Test','Zahl',0)));       // Lese einen Integer
  ShowMessage('Inhalt von Test\Dual: '+BoolToStr(ReadBool('Test','Dual',False),True));// Lese einen Boolean
 finally
  Free;                                                                               // Schließe die Datei
 end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 with TIniFile.Create(Datei) do try               // Öffne die Datei
  WriteString('Test','Text','Hello world');       // Schreibe einen String
  WriteInteger('Test','Zahl',32);                 // Schreibe einen Integer
  WriteBool('Test','Dual',True);                  // Schreibe einen Boolean
 finally
  Free;                                           // Schließe die Datei
 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.