![]() |
TObjectList mit gemeinsamen Eigenschaften
Hallo,
ich habe eine TObjectList die unterschiedliche Klassen verwaltet, die nicht auf eine gemeinsame Basis zurück geführt werden können. Jetzt möchte ich jedem Eintrag in der Liste zusätzliche, für alle Einträge gleiche, Eigenschaften anhängen. Geht das? Beispiel:
Delphi-Quellcode:
Jetzt möchte ich z.B. jedes mal wenn die Liste erstellt wird, jedem Eintrag (also dem Auto, dem Haus, ...) die Uhrzeit anhängen wann der Eintrag in die Liste aufgenommen wurde. Sobald die Liste gelöscht wird, ist auch diese Information wieder gelöscht.
TAuto = class
.. end; THaus = class .. end; TObjList = class(TObjectList<TObject>) private FId: Integer; FName: string; public property Id: Integer read FId write FId; property name: string read FName write FName; end; Das Beispile ist nur zum deutlich machen meines Anliegens und nicht um über Sinn oder Unsinn des Konstrukts zu diskutieren. Real geht es darum den Status einzelner Einträge in der Liste zu überwachen. Wo immer möglich verwende ich schon heute klassifizierte Listen. Grüße und Danke Gerd |
AW: TObjectList mit gemeinsamen Eigenschaften
Wenn ich Dich richtig verstehe, könntest Du Deine Objekte kapseln...
Delphi-Quellcode:
Dann müsstest Du immer dieses kapselnde Objekt speichern.
MyRecordOderClass = record/class
TS: TDateTime; State: Integer; MyObject: TObject; end; Oder Du benutzt an anderer Stelle ein Dictionary, in dem Du zu jedem Objekt den Zeitstempel+Status speicherst. |
AW: TObjectList mit gemeinsamen Eigenschaften
Das mit dem Kapseln wäre ein Ansatz, bedeutet aber einen ziemlichen Umstellungsaufwand da alle Zugriffe ja jetzt noch zusätzlich über MyClass müssen.
Bei einem parallel geführten Dictionary habe ich kein so gutes Gefühl. Lieber wäre mir alles in eine Klasse/Liste Trotzdem Danke |
AW: TObjectList mit gemeinsamen Eigenschaften
Ein Class Helper für TObject wäre auch noch eine Option
|
AW: TObjectList mit gemeinsamen Eigenschaften
Du kannst Dir natürlich auch eine TMyStateObjectList bauen, die die klassische Objektlist und das Dictionary sowie auch sämtliche Zugriffe kapselt.
Etwa so:
Delphi-Quellcode:
TMyState = record
TS: TDateTime; State: Integer; end; TMyStateObjectList = class fObjectList: TObjectList; fDictionary: TDictionary(TObject/TMyState); procedure AddObject(aObject: TObject); function GetObject(aIndex: Integer): TObject; function GetState(aIndex: Integer): TMyState; end; |
AW: TObjectList mit gemeinsamen Eigenschaften
Zitat:
Delphi-Quellcode:
Zugriff dann in etwa so:
type
TAuto = class end; THaus = class end; TItem<T: class> = class private FInstance: T; FId: Integer; FName: string; public constructor Create(AInstance: T; AId: Integer; const AName: string); property Instance: T read FInstance; property Id: Integer read FId; property Name: string read FName; end; TObjList = class(TObjectList<TObject>) private FId: Integer; FName: string; public function Add<T: class>(AInstance: T): Integer; function AsItem<T:class>(Index: Integer): T; property Id: Integer read FId write FId; property name: string read FName write FName; end; constructor TItem<T>.Create(AInstance: T; AId: Integer; const AName: string); begin inherited Create; FInstance := AInstance; FId := AId; FName := AName; end; function TObjList.Add<T>(AInstance: T): Integer; begin Result := inherited Add(TItem<T>.Create(AInstance, Id, name)); end; function TObjList.AsItem<T>(Index: Integer): T; begin Result := (Items[Index] as TItem<T>).Instance; end;
Delphi-Quellcode:
myList.Add<TAuto>(MyAuto);
myList.Add<THaus>(MyHaus); myAuto := myList.AsItem<TAuto>[idx]; myHaus := myList.AsItem<THaus>[idx + 1]; |
AW: TObjectList mit gemeinsamen Eigenschaften
Zitat:
Eigentlich hatte ich gehofft, dass es einen Weg gibt, dies neuen Eigenschaften direkt den neuen Listenelementen zuweisen zu können. Danke Gerd |
AW: TObjectList mit gemeinsamen Eigenschaften
Jupp, über Class Helper "gleicheartige" Teile überall anhängen geht, aber dennoch muß dann immernoch für jede Klasse eine eigene Behandlung eingebaut werden und dazu auch ein harter Cast genau auf diese Typen.
Alternativ könnte man auch via RTTI auf "gleichnamige" Teile zugreifen, bzw. vorher auf deren Existenz prüfen, egal welche Klassen in der Liste sind. |
AW: TObjectList mit gemeinsamen Eigenschaften
Zitat:
Delphi-Quellcode:
ist mir noch nicht ganz klar was das macht. Ich werde mich mal rein arbeiten. Ein Ansatzpunkt ist da
TItem<T: class> = class
private FInstance: T; FId: Integer; FName: string; public constructor Create(AInstance: T; AId: Integer; const AName: string); property Instance: T read FInstance; property Id: Integer read FId; property Name: string read FName; end; Danke |
AW: TObjectList mit gemeinsamen Eigenschaften
Zitat:
|
AW: TObjectList mit gemeinsamen Eigenschaften
Class Helper ändert an der Art des Zugriffes nichts, aber es trennt den Code nach Klassen auf.
Also statt alles in eine große Zugriffsfunktion, ist dort dann nur noch ein IS, der Cast mit Zugriff auf den Helper (anstatt die Klasse abzuleiten und es da direkt einzubauen) und der Rest liegt dann in den jeweiligen Helpern (oder Ableitungen). |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:48 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz