22. String-Listen
a) Die Klasse TStrings
String-Listen erlauben es Zeichenketten in dynamischen Listen komfortabel zu verwalten. Man kann Zeichenketten anfügen, einfügen, löschen oder suchen.
Die Memo-Komponente und die ListBox-Komponente besitzen mit den Eigenschaft Lines bzw. Items bereits Stringlisten. Sie sind von der Klasse TStrings abgeleitet und beherrschen
| Clear | Löscht alle Einträge in der Liste |
|---|---|
| Add( s ) | Fügt eine Zeichenkette s am Ende der Liste hinzu. |
| Insert( i , s ) | Fügt eine Zeichenkette s in der Zeile i ein. |
| Delete( i ) | Löscht die Zeichenkette in der Zeile i . |
| IndexOf( s ) | Sucht die Zeichenkette s und liefert ihre Position in der Liste. |
| ItemIndex | Liefert bei einer Listbox den Index der aktuellen Zeile, z.B. beim Anklicken. |
| LoadFromFile(Dateivariable) | Füllt die Liste mit Textzeilen aus der angegebenen Datei. |
| SaveToFile(Dateivariable) | Speichert die Einträge der Liste in der angegebenen Datei. |
| Assign(Stringliste) | Weist der String-Liste die Strings eines anderen Objekts zu. |
Listbox mit der Stringliste ListBox.Items.
Memo mit der Stringliste Memo.Lines
b) Die Klasse TStringlist
Noch leistungsfähiger sind Objekte der Klasse TStringlist, die wir bei unserem Sudoku-Assistenten bereits verwendet haben.
Zusätzlich zu den Methoden von TStrings stellt diese Klasse folgende Eigenschaften und Methoden zur Verfügung:
| Sort | Die Methode Sort sortiert die Zeichenketten der Liste in aufsteigender Reihenfolge. |
|---|---|
| Sorted | Hat die Eigenschaft Sorted den Wert true, werden die Zeichenketten automatisch sortiert. Ist Sorted true, dürfen keine Zeichenketten mit Insert eingefügt, sondern müssen mit Add angefügt werden. |
| Duplicate | Duplicate kann die Werte dupAccept, dupIgnore oder dupError annehmen Damit können Duplikate akzeptiert oder ignoriert werden oder bei Duplikaten ein Fehler ausgelöst werden. |
| CaseSensitive | Steuert, ob doppelte Strings unter Berücksichtigung der Groß-Kleinschreibung gesucht werden. |
Die Anwendung erfolgt in drei Schritten. Zuerst wird eine Variable vom Typ TStringlist deklariert. Dann wird der Konstruktor der Klasse aufgerufen um eine Instanz der Klasse zu erzeugen. Am Schluss muss diese mit den Destruktor der Klasse wieder aufgeräumt werden, da sonst der verwendete Speicher nicht mehr freigegeben wird. Um dies sicher zu stellen, kann man z.B. den Konstruktor im Ereignis OnCreate und den Destruktor im Ereignis OnClose des Formulars aufrufen.
| Ceate | Der Konstruktor Create erzeugt eine Instanz der Klasse, d.h. ein Objekt. |
|---|---|
| Destroy | Der Destruktor Destroy gibt den zugewiesenen Speicher wieder frei. |
| Free | Die Methode Free prüft zuerst, ob die Instanz noch existiert und ruft dann erst Destroy auf. |
Als Beispiel die Routine zum Laden der Daten in unserem Sudoku-Assistenten:
procedure TForm1.BtnLadenClick(Sender: TObject);
var z,s : integer;
daten: TStringlist; // deklariert eine Objektvariable der Klasse/Typ TStringlist
begin
if OpenDialog1.Execute then
begin
try
daten := TStringlist.Create; // erzeugt ein Objekt/Instanz der Klasse TStringlist
daten.LoadFromFile(OpenDialog1.Filename); // ruft die Methode LoadFromFile der Klasse TStringlist auf
for z:= 1 to 9 do
for s:=1 to 9 do
x[z,s] := StrToInt(Copy(daten[z-1],s,1));
anzeigen;
finally
daten.free; // gibt die Instanz wieder frei, löscht sie also aus dem Speicher
end;
end;
end;
Aufgaben
- Schreiben Sie ein Programm, das aus einer Textdatei Namen in eine Stringliste einliest. Die Liste soll sortiert sein und keine Duplikate enthalten.
Zur Anzeige soll die Liste mit Assign der Eigenschaft Items einer Listbox zugewiesen werden. - Schreiben Sie ein Programm, das in unserer Datei adressen.dat aus dem letzten Kapitel die häufigsten Frauen- und die häufigsten Männer-Vornamen bestimmt.
Einführung in das Programmieren mit DELPHI
