Listen
TList
Delphi bietet innerhalb der VCL Klassen an, die eine Anzahl an Daten verwalten können. Die wichtigste dieser Klassen ist TList. TList kann man sich am einfachsten als eine Art dynamisches Array von Pointern vorstellen. Da die Verschiedenen Listeneinträge Pointer sind, ist es möglich, alle anderen Klassen oder Variablen zu verwalten.
Liste := TList.Create;
Hiermit wird die Liste initialisiert und der nötige Speicher bereitgestellt.
Liste.Free;
Wenn die Liste nicht mehr benötigt wird, muss der Speicherplatz auch wieder freigegeben werden, dies geschieht häufig beim Programmende oder, wenn die Liste nur innerhalb einer Prozedur benötigt wurde, nach dem finally:
Liste := TList.Create; try MacheEtwasMitDerListe; finally Liste.Free; end;
Mit dem Aufruf der Funktion Add kann man der Liste einen Eintrag hinzufügen und die Eigenschaft Items bietet einem Zugriff auf die einzelnen Einträge:
var s1, s2, s3: String; Liste: TList; begin s1 := 'Hallo'; s2 := 'Welt'; s3 := '!'; Liste := TList.Create; try Liste.Add(Pointer(s1)); Liste.Add(Pointer(s2)); Liste.Add(Pointer(s3)); Label1.Caption := string(Liste.Items[0]) + ' ' + string(Liste.Items[1]) + string(Liste.Items[2]) finally Liste.Free; end; end;
Zuerst werden die Strings auf die Benötigten Werte gesetzt, und danach der Liste zugewiesen (oder genauer: ein Pointer auf den String wird der Liste hinzugefügt). Add fügt die neuen Einträge immer am Ende an, die Liste beginnt bei 0. Der 1. String liegt also an der Position 0, man erhält also mit Liste.Items[0] Zugriff auf ihn. Die Eigenschaft Items beinhaltet eine Art Array, in dem die Pointer gespeichert werden. Danach muss er noch wieder in einen String gewandelt werden. Jetzt werden die Einzelnen Strings aneinandergefügt und in das Label gesetzt.Weitere wichtige Eigenschaften und Methoden von TList sind:Count – Liefert die Anzahl der Einträge zurück. Da die Zählung bei 0 beginnt, muss eine Schleife so aussehen, um die Liste durchzugehen:
for I := 0 to Liste.Count-1
Clear – Löscht alle Einträge in der Liste, Vorsicht, evtl. muss vorher der Speicher freigegeben werden, auf den die Pointer weisen!
Delete – Löscht einen Eintrag in der Liste. Vorsicht, evtl. muss vorher der Speicher freigegeben werden, auf den der Pointer weist!Exchange – Vertauscht zwei Einträge in der Liste.
Move – Verschiebt einen Eintrag zu einer neuen Position
Insert – Kann Beiträge auch in der Liste und nicht nur am Ende Einfügen
TStringList
TStringlist funktioniert sehr ähnlich wie TList. Allerdings ist das Ziel nicht die Verwaltung von Unterschiedlichen Daten, sondern hauptsächlich von Strings.
Die Methoden Delete, Clear, Move, Exchange und Insert funktionieren genau wie bei TList, die Methoden Add und Insert verlangen nur anstelle des Pointers als Parameter einen String. Items wird ersetzt durch das aussagekräftigere String, also erhält man Zugriff auf ein Element durch
aStringList.Strings[IntegerWert];
Wichtig hierbei ist, genau wie in TList, dass die Zählung bei 0 beginnt, z.B. das 3. Element hat also die Stelle 2.
Hinzugekommen sind die Eigenschaft Sorted, die neu hinzugekommene String automatisch alphabetisch einsortiert und die Methode Sort, die ein einziges mal sortiert.
Mit Find ist es möglich, einen String innerhalb der Liste zu suchen und sich die Position anzeigen zu lassen.
Wichtig können auch die Methoden BeginUpdate und EndUpdate sein, die man verwenden sollte, wenn man umfangreiche Änderungen an der Liste vornimmt. Sie sind aber nur bei Komponenten notwendig, die die Stringliste auch anzeigen:
Memo1.Lines.BeginUpdate; for I := 0 to 100000 do Memo1.Lines.Add(IntToStr(i)); Memo1.Lines.EndUpdate;
Mit Hilfe von LoadFromFile und SaveToFile ist es auf einfachste Weise möglich, Texte zu speichern, ohne umfangreichere Quelltexte zu schreiben:
if OpenDialog1.Execute then Memo1.Lines.LoadFromFile(OpenDialog1.FileName);
Eine wichtige Eigenschaft von TStringList ist es, dass neben den Strings auch noch Pointer gespeichert werden können. Die Methode AddObject kann sowohl einen Pointer als auch einen String hinzufügen. Die Eigenschaft Objects bietet Zugriff auf die einzelnen Pointer. Die Zählung des Arrays Objects beginnt bei 0, genau wie items bei TList. Wichtig hierbei ist, dass man bedenkt, dass jedem String ein Pointer zugeordnet ist, man also nicht 2 getrennte Listen hat.