![]() |
Auf Objekt in der TObjectList zugreifen
Hi DP, ich möchte ein zur Laufzeit generiertes Objekt über die TObjectList mit neuen Informationen versorgen nur weiß ich jetzt nicht wie ich wieder auf das Objekt zugreifen kann (Google wollte mir auch nicht helfen). Alternativ hätte ich noch den Array nur weiß ich nicht ob das so prickelnd ist :mrgreen:
Danke Luki :spin: |
AW: Auf Objekt in der TObjectList zugreifen
Normalerweise müsste mit einem hart gecasteten Typen gehen, so mache ich es immer:
Delphi-Quellcode:
TFoo(DeineListe[index]).IrgendEtwas
|
AW: Auf Objekt in der TObjectList zugreifen
Ich glaube ohne etwas Code und was nicht funktioniert wie erwartet stellt sich jeder etwas anderes drunter vor.
|
AW: Auf Objekt in der TObjectList zugreifen
Halt Moment, wo bitte habe ich geschrieben das etwas nicht geht? Wenn es der Fall wäre würde ich Code posten doch jetzt wollte ich nur Fragen ob jemand weiß, oder einen Link zu einem Tut, wie man die Objekte bearbeitet
|
AW: Auf Objekt in der TObjectList zugreifen
Zitat:
![]() ![]() Obwohl die Doku da eigentlich genug Auskunft geben sollte. |
AW: Auf Objekt in der TObjectList zugreifen
Oh, das es zwei gibt wusste ich nicht :oops: Und danke für die Links zu Emba:thumb:, ich finde die meistens nicht bzw. ich sollte mir ein Lesezeichen setzen :stupid:
|
AW: Auf Objekt in der TObjectList zugreifen
![]() |
AW: Auf Objekt in der TObjectList zugreifen
Zitat:
Das magische Wort heißt docwiki und offenbart so ![]() |
AW: Auf Objekt in der TObjectList zugreifen
Da ich schon länge nichts mehr gecodet habe, hier eine Übung. Ich hoffe es ist richtig:
Delphi-Quellcode:
implementation
{$R *.dfm} uses Contnrs; type TInfo = class //Beispiel-Klasse DT: TDateTime; end; var Obj: TObjectList; procedure TForm1.FormCreate(Sender: TObject); begin Obj := TObjectList.Create; end; procedure TForm1.Button1Click(Sender: TObject); var Info: TInfo; p: Integer; begin Info := TInfo.Create; //Beispiel-Objekt Erstellen Info.DT := Now; p := Obj.Add(Info); //Beispielobjekt in ObjectList zuweisen if p > -1 then ShowMessage(Format('Aktuelle Zeit im Item %d als Objekt gespeichert.', [p])); end; procedure TForm1.Button2Click(Sender: TObject); var DT: TDateTime; Info: TInfo; p: Integer; begin if Obj.Count = 0 then Exit; p := Obj.Count - 1; Info := TInfo(Obj[p]); //Beispielobjekt aus ObjektList wieder auslesen DT := Info.DT; ShowMessage('Im Objekt gespeicherte Zeit: ' + TimeToStr(DT)); end; |
AW: Auf Objekt in der TObjectList zugreifen
Wie ist das eigentlich, wenn man noch nicht generisch unterwegs ist und immer Objekte der selben Klasse in die Objektliste packen möchte und einem das ganze rumgecaste stört?
Ich habe dazu einmal eine eigene Klasse erstellt, die selber intern eine Objektlist hatte und die nach außen hin die paar Methoden anbot, die ich benötigte (und die soweit gleich hießen, wie die der Objektliste) und habe in diesen Methoden dann das "rumcasten" erledigt. Wäre es da besser/sinnvoller gewesen stattdessen eine Klasse zu erstellen, die von TObjectlist erbt? |
AW: Auf Objekt in der TObjectList zugreifen
Nein, wie denn? Ich dachte (bin mir nicht sicher), die alte TObjectList arbeitet mit
Delphi-Quellcode:
oder
Pointer
Delphi-Quellcode:
. Du kannst in einer Ableitung nicht einfach den Typ verschärfen, also gegen
TObject
Delphi-Quellcode:
ersetzen.
TMeineKlasse
|
AW: Auf Objekt in der TObjectList zugreifen
Ob das besser oder sinnvoller ist, sei dahingestellt, ich zumindest habe das so gemacht.
|
AW: Auf Objekt in der TObjectList zugreifen
Die TObjectList ist nicht sonderlich kompliziert, ich denke die baut auf TList auf. Wer also nichts erben will, bzw. die TObjectList nicht, kann den Code von TObjectList kopieren und an eigene Bedürfnisse modifizieren.
|
AW: Auf Objekt in der TObjectList zugreifen
Wozu? Meistens reicht es schon die property Items zu überschreiben:
Delphi-Quellcode:
TSomeItems = class(TObjectList)
private function GetSomeItem(Index: integer): TSomeItem; public property Items[Index: integer]: TSomeItem read GetSomeItem; default; end; { TSomeItems } function TSomeItems.GetSomeItem(Index: integer): TSomeItem; begin Result := TSomeItem(inherited Items[Index]); end; { TSomeApp } procedure TSomeApp.DoSomething; begin Index := FSomeItems.Add(TSomeItem.Create); FSomeItems[Index].DT := Now; end; |
AW: Auf Objekt in der TObjectList zugreifen
![]() |
AW: Auf Objekt in der TObjectList zugreifen
Zitat:
Nur überdecken/verdecken, da es ja nicht überschreibbar (override) ist. |
AW: Auf Objekt in der TObjectList zugreifen
Aber wenn ich nur Items anfasse, kann ich ja immer noch z.B. ein TEdit zur Liste hinzufügen. Das wird dann beim Items-Getter ganz böse knallen.
|
AW: Auf Objekt in der TObjectList zugreifen
Jupp, aber wenn man böse castet, dann bekommt man auch in die generischen Liste ein TEdit rein. (das Gegenteil von hier -> nicht casten)
Aber man könnte ja auch noch die Add- und InsertMethoden überdecken. :wink: Und wenn man eine Variable auf TObjectList hat, dann ist dort ebenfalls wieder das alte Item. Es ist halt nur in dem Typen überdeckt, aber im Vorfahren natürlich nicht. (bei den Generics gibt es das Problem nicht, da der Typ nicht mit dem Vorfahren kompatibel ist :stupid:) |
AW: Auf Objekt in der TObjectList zugreifen
Schau Dir doch einfach #15 nochmal an und folge dem Link. Das ist doch fast alles schon gesagt worden :stupid:
|
AW: Auf Objekt in der TObjectList zugreifen
Es fehlt nur noch Eines.
Wenn man Notify "überschreibt" und dort eine Typprüfung einbaut, dann könnte man ganz leicht dafür sorgen, daß nur erlaubte Typen in die Liste aufgenommen werden. :angel2: |
AW: Auf Objekt in der TObjectList zugreifen
Es gibt mindestens 4 Varianten:
1.) man verwendet TObjectList und muss beim auslesen der Objekte casten 2.) man verwendet eine generische ObjektList (natürlich nur wenn man eine Delphi Version hat die das unterstützt) 3.) man leitet von TObjectList ab und überdeckt das Items[]-Property 4.) man erstellt eine Klasse die intern ein privates Objekt vom Typ TObjectList hat und präsentiert nach Aussen nur die Properties und Methoden die man für die Aufgabenstellung unbedingt braucht:
Delphi-Quellcode:
Das bedeutet natürlich die meiste Schreibarbeit und den geringsten Grad an Wiederverwendbarkeit;
TSomeItems = class(TObject)
private FList : TObjectList; public constructor Create; destructor Destroy;override; procedure Add(item:TSomeItem); function AddNew:TSomeItem; property Items[Index: integer]: TSomeItem read GetSomeItem; default; property Count:Integer read GetCount; end; im Gegenzug kann man die Klasse auf seine Anforderungen genau zuschneiden und hat die beste Kontrolle darüber was in die Liste eingefügt oder aus der Liste gelöscht werden kann. |
AW: Auf Objekt in der TObjectList zugreifen
3a) wie in 3 genannt
3b) mit überschreiben verdecken von Add und Insert, mit dem gewollten Typen 3c) mit überschreiben von Notify und am Besten auch Add/Insert Bei 3c bekommt man zwar erst Meldung nach der Aktion. Entweder man wirft nur eine Exception und lässt das so, oder bei Add wird das ungültige gleich wieder entfernt und danach die Exception, bzw. beim Löschen wieder eintragen und Exception. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:31 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