Home » Tutorials » VCL » Listen in Delphi

Listen in Delphi

TList

Im Prinzip ist die Klasse TList ähnlich aufgebaut, wie die Klasse TStrings. Die Methoden zum Hinzufügen, Löschen, Austauschen usw. haben die gleichen Namen und erfüllen gleiche Zwecke.
Allerdings speichert eine TList im Gegensatz zu TStrings keine String-Listen, sondern Pointer bzw. Referenzen. Dies hat den Vorteil, dass so Listen aus kompletten Objekten oder Records erstellt werden können.
Im folgenden Beispiel wollen wir uns ansehen, wie man eine Liste mit Record-Strukturen füllt.
Zunächst wird die Record-Deklaration benötigt:

type
  PTestRecord = ^TTestRecord;
  TTestRecord = record
    Str1: String;
    Nummer: Integer;
  end;

Der Record besteht hier aus einem String und einer Integer-Variable.
Im folgenden Beispiel wird eine Liste mit zwei dieser Records erstellt. Der Speicher für die Records muss manuell reserviert werden. Dies geschieht mit der Routine New. Abschließend wird hier die Variable Str1 des zweiten Records in einer Dialog-Box angezeigt.

procedure TForm1.Button1Click(Sender: TObject);
var
  List: TList;
  Rec: PTestRecord;
begin
  List:=TList.Create;
  try
    New(Rec);
    List.Add(Rec);
    Rec.Str1:='Erster String';
    Rec.Nummer:=100;
    New(Rec);
    List.Add(Rec);
    Rec.Str1:='Zweiter String';
    Rec.Nummer:=200;

    ShowMessage(TTestRecord(List[1]^).Str1);
  finally
    List.Free;
  end;
end;

In dem oben stehenden Beispiel ist noch ein kleiner Fehler drin. Da wird mit New Speicher erzeugen, muss dieser vor dem Freigeben der Liste auch wieder manuell freigegeben werden. Dies geschieht mit der Routine Dispose:

for i:=0 to List.Count-1 do
      Dispose(PTestRecord(List[i]));

TObjectList

In neueren Delphi-Versionen gibt es zusätzlich die Klasse TObjectList (Unit contnrs). Sie ist direkt von TList abgeleitet. Sollten Sie statt Records Referenzen auf Objekte speichern wollen, empfehle ich diese Klasse zu verwenden.
TobjectList besitzt eine Eigenschaft namens OwnsObjects. Ist sie auf True gesetzt, werden die Elemente beim Löschen (entweder durch den Aufruf von Delete, Clear oder beim Freigeben der Liste) automatisch freigegeben.
Steht Ihnen der Quellcode der Delphi-Quellen zur Verfügung, können Sie das Prinzip der TObjectList auch für andere Objekte zurechtschneidern. So entfallen lästige Typecasts.