Einzelnen Beitrag anzeigen

Roachford
(Gast)

n/a Beiträge
 
#7

Re: Verzweigte Datenstruktur "anstrengender" ?

  Alt 31. Aug 2008, 00:08
Delphi-Quellcode:
type
  TExample = class;

  TExampleList = class(TObjectList)
  protected
    function GetItem(Index: integer): TExample;
    procedure SetItem(Index: integer; AObject: TExample);
  public
    property Items[index: integer]: TExample read GetItem write SetItem; default;
  end;

  TExample = class
  private
    fItems: TExampleList;

  public
    constructor Create;
    destructor Destroy; override;

    property Items: TExampleList read fItems;
  end;
...

Delphi-Quellcode:
function TExampleList.GetItem(Index: integer): TExample;
begin
  result := TExample(inherited GetItem(Index));
end;

procedure TExampleList.SetItem(Index: integer; AObject: TExample);
begin
  inherited SetItem(Index, AObject);
end;

...

constructor TExample.Create;
begin
  inherited;

  fItems := TObjectList.Create;
end;

destructor TExample.Destroy;
begin
  fItems.Free;

  inherited;
end;
----------------------------

Delphi-Quellcode:
var
  lTest: TExample;
begin
  lTest := TExample.Create;
  try
    lTest.Items.Add(TExample.Create);
    lTest.Items[0].Items.Add(TExample.Create);

    // zu finden unter: lTest.Items[0].Items[0]
  finally
    lTest.Free;
  end;
end;
Um es dann angenehmer zu machen mit der Entfernung der Items aus den Listen, könntest du in TExample dir vermerken in welcher Liste er selbst hängt oder Alternativ welcher TExample sein Parent ist. Dann könntest du im Destructor von TExample Self in der Liste vom Parent entfernen (aber aufpassen, dass du das Element nicht doppelt freigeben lässt: du befindest dich dann schon im Destructor. Also unbedingt Extract() verwenden und nicht Remove!!). Das hätte den schicken Nebeneffekt, dass du ein Element nur freigeben brauchst und müsstest es nicht mehr explizit in der Liste zu suchen um es zu entfernen.
  Mit Zitat antworten Zitat