Listen mit TList Besondere Datentypen

Object Pascal im Detail - Besondere Datentypen www.delphi-treff.de 132

4.12.2. Listen mit TList

Die Delphi-RTL Runtime Library bietet Klassen an, mit denen sich Datenstrukturen einfacher handhaben lassen als mit den Standard-Datentypen. So ist z.B. eine Liste an Elementen mit TList einfacher zu verwenden als ein Array. Was ist der Unterschied? TList ist eine Klasse, von der zunächst eine Instanz erzeugt werden muss. Dann lassen sich über die Methoden Add und Insert Elemente anhängen bzw. an einer bestimmten Position einfügen. Schon hier hätten wir bei einem Array das Problem, den Eintrag, der bisher an der Position war, sowie alle folgenden um eine Position nach hinten zu verschieben. Dafür muss auch genügend Speicher reserviert werden SetLength. Nicht so bei TList: uses Generics.Collections; procedure TForm1.MyMethod; var MyList: TListInteger; begin MyList := TListInteger.Create; try MyList.AddRange[1, 2 ,3]; MyList.Insert0, 9; ... finally MyList.Free; end; Was passiert in diesem Beispiel? Wir definieren eine Variable vom Typ TList und geben dahinter in spitzen Klammern an, von welchem Typ die Elemente der Liste sein dürfen. In diesem Fall handelt es sich um eine Liste von Integer-Werten. Diese Schreibweise nennt sich Generics und ist in Delphi erst seit Version 2009 möglich Bis dahin enthielt eine Liste einfach nur Pointer, so dass beim Auslesen der Werte immer eine Typumwandlung durchgeführt werden musste. Direkt nach begin wird eine Instanz der Liste erzeugt. Mit AddRange können gleich mehrere Werte in die Liste eingefügt werden. Add und AddRange fügen Werte immer am Ende an. Insert und InsertRange hingegen platzieren die neuen Werte an der angegebenen Position. Das Insert im Beispiel fügt den Wert 9 an der ersten Position Index 0, weil die Zählung bei 0 beginnt ein. Die bereits vorhandenen Werte 1, 2 und 3 rutschen dadurch eine Position weiter. Die Werte der Liste lassen sich auch automatisch sortieren: MyList.Sort; Durch diesen Aufruf gelangt die in obigem Beispiel am Anfang eingefügte 9 ans Ende der Liste. Durch den Aufruf von Object Pascal im Detail - Besondere Datentypen www.delphi-treff.de 133 MyList.Reverse; lässt sich die Reihenfolge der Elemente umdrehen, also rückwärts sortieren. Auf die einzelnen Elemente einer Liste greift man über ihren Index zu. So gibt beispielsweise ShowMessageIntToStrMyList.Items[2]; den Wert an Indexposition 2 also den dritten Wert aus. Wer nach einem bestimmten Wert in einer sortierten Liste suchen möchte, sollte sich die Methode BinarySearch anschauen. Als Erweiterung einer TList gibt es auch TObjectList. Diese ist hilfreich, wenn die Liste nicht einfache Zahlen wie in obigem Beispiel, sondern Objekte beinhalten soll. Beim Entfernen eines Objekts aus der Liste kann es freigegeben werden. Wichtig hierfür ist die Eigenschaft OwnsObject. Über sie wird festgelegt, ob die Elemente der Liste gehören true oder nicht false. Wenn Elemente der Liste gehören, werden sie beim Entfernen aus der Liste automatisch freigegeben. OwnsObject kann dem Konstruktor Create als Parameter mitgegeben werden. Standardwert ist true. Für Strings gibt es die Klasse TStringList.

4.12.3. Dictionaries mit TDictionary