Home » Tutorials » VCL » TObjectList

TObjectList

Sonstiges

Die Eigenschaft last

Häuft möchte man, wenn ein Object in die Liste eingefügt wurde, auch noch auf das hinzugefügte Objekte zugreifen. Das lässt sich mit der Eigenschaft last der ObjectList einfach realisieren.

ObjectList.add(TKlasse.create);
TKlasse(ObjectList.last).methode;
TKlasse(ObjectList.last).feld := 1;

Die Eigenschaft count

Count liefer die Anzahl der in der Liste gespeicherten Objekte. Das ist nützlich, wenn man mit einer Schleife alle Objekte durchlaufen möchte. Allerdings muss man beachten, dass count nicht dem höchsten index entspricht, weil das erste Objekt den Index 0 hat.

for i:=0 to ObjectList.count-1 do
begin
 TKlasse(ObjectList.items[i]).blabla;
end;

TObjectList an Klasse anpassen

Der Typecast, der beim Zugriff auf ein Objekt aus der Liste notwendig ist, macht den Code unübersichtlich und fehleranfällig. Er lässt sich vermeiden, indem man die TObjectList an eine Klasse anpasst. Es wird dann also kein TObject zurückgeliefert sondern z.B TKlasse.
Dafür wird eine neue Klasse erstellt, die von TObjectList erbt, und dann werden die entsprechenden Eigenschaften überschrieben.

TCustomObjectList = class(TObjectList)
  protected
    function getItem(Index: Integer): TKlasse; virtual;
    procedure setItem(Index: Integer; Objekt: TKlasse); virtual;
  public
    function Add(Objekt: TKlasse): Integer; virtual;
    function Remove(Objekt: TKlasse): Integer; virtual;
    function IndexOf(Objekt: TKlasse): Integer; virtual;
    procedure Insert(Index: Integer; Objekt: TKlasse); virtual;
    function First: TKlasse; virtual;
    function Last: TKlasse; virtual;
    property Items[Index: Integer]: TKlasse read getItem write setItem; default;
  end;

  function TCustomObjectList.getItem(Index: Integer): TKlasse;
  begin
    Result := TKlasse(inherited Items[Index]);
  end;

  procedure TCustomObjectList.setItem(Index: Integer; Objekt: TKlasse);
  begin
    inherited Items[Index] := Objekt;
  end;

  function TCustomObjectList.Add(Objekt: TKlasse): Integer;
  begin
    Result := inherited Add(Objekt);
  end;

  function TCustomObjectList.First: TKlasse;
  begin
    Result := TKlasse(inherited First());
  end;

  function TCustomObjectList.IndexOf(Objekt: TKlasse): Integer;
  begin
    Result := inherited IndexOf(Objekt);
  end;

  procedure TCustomObjectList.Insert(Index: Integer; Objekt: TKlasse);
  begin
    inherited Insert(Index, Objekt);
  end;

  function TCustomObjectList.Last: TKlasse;
  begin
    Result := TKlasse(inherited Last());
  end;

  function TCustomObjectList.Remove(Objekt: TKlasse): Integer;
  begin
    Result := inherited Remove(Objekt);
  end;