StringList (Pascal-Script) #
Eine StringList ist, wie der Name schon sagt, eine Liste von Strings (Array). Jeder String steht in einer neuen Zeile, und auf jede Zeile kann man einzeln zugreifen. Man kann Strings an bestimmten Stellen einfügen, ans Ende anhängen, in der Liste verschieben, löschen, zählen, suchen und vieles mehr. Außerdem ist es möglich, StringLists von Festplatte zu laden bzw. auf Festplatte zu speichern.
Folgende Schritte werden im folgenden behandelt:
-
Deklarieren der Liste
-
Erzeugen der Liste
-
Arbeiten mit der Liste
-
Strings ans Ende anhängen
-
Strings einfügen
-
Strings in der Liste bewegen
-
ganze StringLists anhängen
-
bestimmte Strings auslesen
-
Strings an bestimmte Stellen zuweisen
-
Anzahl der Strings feststellen
-
Position eines bestimmten Strings suchen
-
bestimmte Strings aus der Liste löschen
-
alle Strings aus der Liste löschen
-
durchgehen aller Einträge der Liste (iterieren)
-
-
Abspeichern einer Liste auf der Festplatte
-
Laden einer Liste von der Festplatte
-
Liste am Ende wieder freigeben
Deklarieren einer Liste #
Eine Liste muss zunächst deklariert werden wie jede andere Variable auch. Dies kann man unter Deklarationen –> Vaiables tun, wenn man die Liste global benötigt, ansonsten kann dies auch in der Funktion / Prozedur selber geschehen. StringLists sind vom Typ TStringList, die Deklaration sieht also so aus:
var
Liste1: TStringList; { Deklaration einer Liste }
Liste2, Liste3, Liste4: TStringList; { Deklaration mehrerer Listen }
Position, Anzahl, Laufvariable: Integer { andere Deklarationen }
TestVariable: String;
Erzeugen einer Liste #
Vor der Benutzung muss eine StringList erzeugt werden, und zwar mittels der Funktion create:
begin
Liste1:= TStringList.create; { Erzeugen einer StringList }
Liste2:= TStringList.create; { Erzeugen einer weiteren Liste }
Danach kann man mit der Liste arbeiten. Man sollte nicht vergessen die Liste (vielmehr den Speicher) am Ende wieder freizugeben (Punkt 6).
Arbeiten mit Listen #
Wenn man mit einer Liste arbeitet, muss man darauf achten, dass die verwendeten Indizes immer existieren, ansonsten wird eine Exception geworfen. Will man also auf den 4. Eintrag einer Liste zugreifen, oder will man an 4. Stelle einen String einfügen, aber die Liste hat nur 3 Einträge, so wird man mit einer Exception bestraft werden. Weiterhin ist zu beachten, dass die Indizierung der Strings bei 0 beginnt, d.h. der erste String hat den Index 0, der 5. den Index 4. Das heißt weiterhin, dass die Anzahl der Strings immer um eins größer ist als der letzte Index! Eine Liste mit 8 Einträgen geht von 0 bis 7. Will man also in eine Liste mit 3 Strings an 2. Stelle einen String einfügen so muss man als Index beim Einfügen 1 angeben. Dies ist eine in der Programmiertechnik gängige Methode, Listen usw. fangen immer bei 0 an.
Die Operationen im Einzelnen (es wird jeweils vorausgesetzt, dass die hier verwendeten Listen bereits deklariert und erzeugt wurden):
Strings ans Ende anhängen ( add ) Mit add kann man einen String ans Ende der Liste anhängen:
Liste1.add('A');
Liste1.add('B');
Liste1.add('C');
Liste1 sieht danach folgendermaßen aus:
A B C
Strings einfügen ( insert ) Mit insert kann man einen String an einer bestimmten Stelle einfügen. Alle Strings hinter dieser Stelle rücken dadurch eins auf. Der Funktion insert übergibt man als ersten Parameter die Stelle an der eingefügt werden soll (Achtung: Die Stelle muss existieren!) und als zweiten Parameter den einzufügenden String:
Liste1.insert(0, 'a');
Liste1.insert(2, 'b');
Liste1 sieht danach folgendermaßen aus:
a A b B C
Man muss beachten, dass nach dem ersten Einfügen an erster Stelle alle weiteren Einträge bereits um eins nach hinten geschoben wurden. Außerdem ist wichtig dass der angegebene Index maximal so groß ist wie die Anzahl der Einträge in der Liste, d.h. eins nach dem letzten Eintrag darf man noch einfügen, in dieser Liste oben ginge noch insert(5, ‘D’), das wäre gleichbedeutend mit add(‘D’).
Strings in der Liste bewegen ( move )
Mit move kann man Strings in der Liste verschieben. Dieser Funktion werden zwei Parameter übergeben: Der Index des Strings der verschoben werden soll und seine neue Position in der Liste:
Liste1.move(1, 3);
Liste1 sieht nun so aus:
a b B A C
Das große A wurde von seiner Position (Index 1) an die 4. Stelle verschoben (Index 3).
**StringLists an bestehende Liste anhängen ( addStrings ) **Damit kann man eine bestehende Liste an eine andere anhängen:
Liste2.add('eins');
Liste2.add('zwei');
Liste2.add('drei');
Liste1.addStrings(Liste2);
Danach sieht Liste1 folgendermaßen aus:
a b B A C eins zwei drei
**Bestimmte Strings auslesen **Um den einen bestimmten String auszulesen, benötigt man nur seinen Index:
ShowMessage ( Liste[1] );
TestVariable:= Liste[3];
Memo.Text:= Liste[2];
Diese Bespiele geben den 2. Eintrag aus, weisen den 4. Eintrag der Variable TestVariable zu und setzen den Text eines Memos auf den 3. Eintrag.
Strings an bestimmte Stellen zuweisen
Liste1[0]:= 'AA';
Liste1[4]:= 'DD';
Damit werden die Einträge an den Stellen 0 und 4 überschrieben mit ‘AA’ bzw. ‘DD’. Die Liste sieht nun folgendermaßen aus:
AA b B A DD eins zwei drei
Wieder muss man aufpassen, dass man die Länge der Liste nicht überschreitet sprich Liste[8] adressiert obwohl die Liste nur 8 Einträge hat, also von 0 bis 7 geht.
**Anzahl der Strings feststellen ( count ) **Will man die Anzahl der Strings in der Liste (=Länge der Liste) wissen, so kann man sich der Funktion count bedienen:
Anzahl:= Liste1.count;
Diese liefert die Länge der Liste. Vorsicht: Ist die Länge 8, so geht die Liste nur bis 7 !!
**Position eines bestimmten Strings suchen ( IndexOf ) **Die Funktion *IndexOf* liefert die erste Stelle eines gesuchten Strings in der Liste. Dabei übergibt man der Funktion den gesuchten String:
Position:= Liste1.IndexOf('DD');
IndexOf liefert nur ein Ergebnis, wenn genau der gesuchte String existiert! In unserem Beispiel würde also die Suche nach ‘D’ keinen Treffer ergeben. In diesem Fall liefert IndexOf den Wert -1 zurück.
Bestimmte Strings aus der Liste löschen ( delete )
Mit delete kann man einen bestimmten String aus der Liste löschen. Alle nachfolgenden Strings rücken dann eins auf. Der Funktion delete übergibt man den Index des zu löschenden Strings:
Liste1.delete(4);
Liste1.delete(3);
Liste1.delete(2);
Liste1.delete(1);
Diese 4 Zeilen verursachen das gleiche wie
Liste1.delete(1);
Liste1.delete(1);
Liste1.delete(1);
Liste1.delete(1);
weil die Einträge nachrücken. Liste1 sieht danach folgendermaßen aus:
AA eins zwei drei
Alle Strings aus der Liste löschen ( clear )
Mit clear löscht man alle Einträge einer Liste:
Liste1.clear;
Wie wird Liste1 danach wohl aussehen?
Genau, leer. **Iterieren, durchgehen aller Einträge der Liste **Will man z.B. alle Einträge einer Liste ausgeben oder nach gewissen Teilstrings suchen, so muss man die komplette Liste durchgehen. Dies macht man mit einer Schleife. Dabei geht man von 0 bis Länge der Liste - 1 :
Laufvariable:= 0;
while Laufvariable < liste2.count do
begin
ShowMessage (Liste2[Laufvariable]);
Laufvariable:= Laufvariable + 1;
end;
Diese Schleife geht von 0 bis Länge-1 (Liste2.count liefert die Länge, und durch das < geht die schleife nur bis länge-1) und gibt dabei alle Einträge der liste in einem Fenster aus. es gibt sicher auch sinnvollere Beispiele, aber der zum verdeutlichen des Sachverhalts ist dieses hier ausreichend.
Abspeichern einer Liste #
Um eine Liste auf der Festplatte in einer ASCII -Datei abzuspeichern, kann man SaveToFile benutzen. SaveToFile bekommt dabei als Parameter den Namen der Datei in welche gespeichert werden soll (als String). Ist diese Datei nicht vorhanden, so wird sie angelegt, ist sie vorhanden so wird sie überschrieben.
Liste2.SaveToFile('c:\eulanda\liste2.txt');
Damit kann man also während der Erzeugung eines Formulars gewisse Daten exportieren, Log-Dateien führen usw.
Laden einer Liste von Festplatte #
Funktioniert analog zum Abspeichern mit der Funktion LoadFromFile. Die Funktion bekommt wieder den Dateinamen als String (Vorsicht: Hierbei muss die Datei existieren, sonst wird eine Exception geworfen!):
Liste2.LoadFromFile('c:\autoexec.bat');
Diese Anweisung würde die autoexec.bat von der Festplatte einlesen. Eine sinnvolle Anwendung wäre, den Benutzernamen des aktuellen Benutzers zu ermitteln und dann je nach Benutzer eine Signatur von der Festplatte laden siehe Beispiel).
Liste am Ende wieder freigeben #
Ganz zum Schluss, das ist wichtig, muss das StringList-Objekt wieder freigegeben werden:
Liste1.Free;
Liste2.Free;
end;
Das StringList-Objekt weist sich und seinen Strings Speicher zu, und der wird nur wieder freigegeben, wenn das Objekt mit Free wieder freigegeben wird! Wenn man in einem Formular 2 Listen benutzt, das Formular mehrmals täglich benutzt (im schlimmsten Fall auf einem Server, der sehr selten neu gestartet wird), so ist ganz schnell der gesamte Speicher von StringList-Objekten belegt und der Rechner wird langsam oder stürzt gar ab.