Home » Tutorials » VCL » TObjectList

TObjectList

Grundlagen

Was ist TObjectList

TObjectList ist eine Klasse, mit der man eine Liste von Objekten verwalten kann. Eine TObjectList ist dann nützlich, wenn man viele Objekte verwalten will und die genaue Anzahl erst zur Laufzeit feststeht. Ein Beispiel dafür ist eine Adressverwaltung, bei der Nutzer neue Datensätze anlegen kann. Die Anzahl der Datensätze ist dann dynamisch.

Grundlagen: Array und Listen

Dynamische Arrays und Listen bieten jeweils die Möglichkeit der dynamichen Reservierung von Speicherplatz. Man muss also erst zur Laufzeit wissen, wie viel Speicherplatz tatsächlich benötigt wird.

Für ein dynamisches Array wird zur Laufzeit ein zusammenhängender Speicherbereich reserviert. Das dynamische Array bietet dann vereinfachten Zugriff auf den Speicherbereich. Mehr jedoch nicht. Mit der Funktion SetLength() lässt sich die Länge zur Laufzeit ändern. Da dabei aber intern ein neues Array erzeugt wird und alle Daten umkopiert werden, ist dies nicht besonders effizent.

TList löst nun dieses Problem, indem intern die Speicherverwaltung intelligenter gestaltet wird. Zusätzlich bietet TList noch Methoden zum einfachen Verschieben, Löschen, Vertauschen, etc. Außerdem ist TList vollkommen objektorientiert.

Eine weitere Möglichkeit, Daten in einer Liste zu speichern, sind die so genannten verketteten Listen. Eine solche Liste besteht aus Elementen, die jeweils aus einem Pointer auf einen Datenbereich und einem Pointer auf das nächste Element in der Liste bestehen. Die Elemente können beliebig im Speicher verteilt sein. Sie müssen also nicht hintereinander liegen. Diese Listen haben den Vorteil, dass das Verschieben, Löschen und Abhängen von Daten recht schnell geht. Dafür ist der Zugriff auf ein bestimmtes Element sehr langsam.

TList verwaltet als Nutzdaten Pointer, also nur Zeiger auf die eigentlichen Daten. Da in Delphi alle Objekte intern sowieso Pointer sind(d.h. eine Variable vom Typ TButton bezeichnet nicht den Button selbst, sondern eigentlich nur einen Pointer auf den Button. Deshalb muss man Objekte auch manuell erzeugen.), bietet es sich an, eine Liste speziell für Objekte zu implementieren. Und genau das ist die Klasse TObjectList, die wir uns im Folgenden genauer ansehen wollen.

Array oder Liste

Vorteil Array schnell, statisch und dynamisch realisierbar
Nachteil Array Löschen, Einfügen, Verschieben etc. von Elementen muss selbst programmiert werden
Vorteil Liste Das Freigeben von Objekten kann von der Liste übernommen werden, hat vordefinierte Methoden für Löschen, Einfügen etc.
Nachteil Liste geringfügig langsamer als Array

Besonders wenn wenn man bestimmte Objekte löschen oder verschieben möchte, lohnt sich der Einsatz der TObjectList, weil es dafür schon fertige Mehoden gibt.
Um zu zeigen, dass das Löschen von Objekten bei einer TObjectList wesentlich einfacher ist, folgt ein kleines Beispiel:
Das Löschen eines Elementes aus einem dynamischen Array könnte man beispielsweise wie folgt realisieren. Es soll das fünfte Element gelöscht werden, und die Reihenfolge soll erhalten bleiben.

for i:=4 to high(testarray)-1 do
begin
 testarray[i] := testarray[i+1];
end;
SetLength(testarray,length(testarray)-1);

Es müssen also alle Elemente nach dem zu löschenden Element verschoben werden. Die Schleife beginnt bei 4 und nicht bei 5, weil der erste Index des Arrays 0 ist. Bei einer ObjectList geht das Löschen einfacher und schneller, da keine Elemente verschoben werden müssen:

ObjectList.Delete(4);