Einführung in das Programmieren mit DELPHI  

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 u.a. folgende Methoden:

ClearLö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.
ItemIndexLiefert 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:

SortDie Methode Sort sortiert die Zeichenketten der Liste in aufsteigender Reihenfolge.
SortedHat 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.
DuplicateDuplicate kann die Werte dupAccept, dupIgnore oder dupError annehmen
Damit können Duplikate akzeptiert oder ignoriert werden oder bei Duplikaten ein Fehler ausgelöst werden.
CaseSensitiveSteuert, 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.

CeateDer Konstruktor Create erzeugt eine Instanz der Klasse, d.h. ein Objekt.
DestroyDer Destruktor Destroy gibt den zugewiesenen Speicher wieder frei.
FreeDie 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

  1. 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.
  2. 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.

Lösungen

© 2009 : Bernd Schultheiss