Object Pascal im Detail - Dateien www.delphi-treff.de
125
var i: Integer;
begin SetLengthSchreibsaetze, 10;
for i := 0 to HighSchreibsaetze do begin
Schreibsaetze[i].Zahl := i; Schreibsaetze[i].Wort := IntToStri +
. Datensatz ;
end; SchreibeDatei;
LeseDatei; for i := 0 to HighLesesaetze do
begin WriteLnLesesaetze[i].Zahl;
WriteLnLesesaetze[i].Wort; WriteLn;
end; ReadLn;
end.
4.11.6. Die Klasse TStringList
Der Grund, warum wir Textdateien bisher eher stiefmütterlich behandelt haben, ist, dass es komfortablere Methoden der Bearbeitung dafür gibt. Hier bieten sich Stringlisten an, da das Verwalten der Strings in einer
Liste dem Benutzer zusätzliche Möglichkeiten bietet.
4.11.6.1. Die Handhabung
Um eine Stringliste zu erstellen und wieder freizugeben, gehen wir den üblichen Weg: uses
Classes; var
stringliste: TStrings; begin
stringliste := TStringList.Create; try
Mache was mit stringliste finally
stringliste.Free; end;
end; Soll die Lebensdauer einer Stringliste an die Anwendung oder das Vorhandensein eines Formulars gekoppelt
werden, so bieten sich zum Erzeugen und Freigeben die Ereignisse OnCreate und OnDestroy an. Für die Anwendung benutzt man hierbei die Ereignisse des Hauptformulars.
Object Pascal im Detail - Dateien www.delphi-treff.de
126
Wir können natürlich vorhandene Textdateien in eine Stringliste laden und auch wieder speichern: stringliste.LoadFromFileFN;
stringliste.SaveToFileFN; Wollen wir der Stringliste neue Strings hinzufügen, so geschieht dies mit Add, AddStrings oder Insert.
Add hängt einen String an, Insert fügt an der angegebenen Position ein und AddStrings hängt der Stringliste die Strings einer anderen Stringliste an. Strings sind hier zu verstehen als Zeilen einer Stringliste. Bei
Add und Insert können die einzelnen Strings als Stringkonstante oder Stringvariable übergeben werden. Beim Einfügen eines Strings durch Insert sollte man beachten, dass Listen grundsätzlich 0-indiziert sind.
var s: AnsiString;
... stringliste.Add
Übergabe als Konstante ;
stringliste.Adds; stringliste.Insert1, s;
2. Position stringliste1.AddStringsstringliste2;
Das Löschen einer Zeile geschieht durch Delete unter Angabe des Index als Parameter. Soll der komplette Inhalt der Stringliste gelöscht werden, so bieten Listen dafür die Methode Clear.
stringliste.Delete3; Löscht die 4. Zeile
stringliste.Clear; Der direkte Zugriff auf eine Zeile geschieht nicht durch einen Parameter, sondern über die Array-Eigenschaft
Strings. Dadurch können wir den String direkt bearbeiten oder lesen. Die Anzahl der Zeilen einer Stringliste lesen wir aus der Eigenschaft Count. Zugreifen können wir auf Elemente von 0 bis Count-1.
var s: AnsiString;
i: Integer; ...
stringliste.Strings[3] := Text
; 4. Zeile ersetzen
stringliste[3] := Text
; Alternative Schreibweise
stringliste[0] := stringliste[0] + Text
; Anhängen an 1. Zeile
s := stringliste[stringliste.Count - 1]; Letzte Zeile wird s zugewiesen
stringliste[1] := stringliste[3]; 2. und 4. Zeile sind nun identisch
i := stringliste.Count; i zeigt die Anzahl der Zeilen
Um die Strings innerhalb der Liste umzuordnen, verwenden wir dir Methoden Move und Exchange, jeweils durch Übergabe zweier Indizes. Move verschiebt dabei den String mit Index1 nach Index2. Der String an Index2
und alle Strings zwischen diesen Indizes ändern dadurch ihre Position. Exchange vertauscht zwei Strings, die Indizes aller anderen Strings ändern sich dadurch nicht.
Object Pascal im Detail - Dateien www.delphi-treff.de
127
stringliste.Move1, 3; 2. Zeile ist nun 4. Zeile
stringliste.Exchange0, stringliste.Count - 1; Vertauscht 1 und letzte Zeile
Wollen wir die Stringliste auf das Vorhandensein eines Strings testen, so müssen wir nicht die Liste prüfend durchlaufen, sondern verwenden dazu IndexOf. Diese Funktion gibt -1 zurück, wenn der Prüf-String kein
String der Liste ist, andernfalls den Index des 1. Vorkommens. Die gesamte Zeile und der Prüf-String müssen dabei identisch sein Berücksichtigen muss man hier den angegeben Typ der Stringliste in der
Variablendeklaration. Verwendet man, wie oben angegeben, TStrings, dann ist der Vergleich nicht unter Berücksichtigung der Groß-Kleinschreibung. Ist der angegebene Typ in der Variablendeklaration jedoch
TStringList, dann kann man dieses Verhalten durch die Eigenschaft CaseSensitive steuern. var
stringliste: TStringList; i: Integer;
... Groß-Kleinschreibung soll berücksichtigt werden
stringliste.CaseSensitive := True; i zeigt -1 oder den Index des 1. Auffindens
i := stringliste.IndexOf Hallo Welt
;
4.11.6.2. Stringlisten in Verbindung zur VCL