Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Auf Objekt in der TObjectList zugreifen (https://www.delphipraxis.net/182893-auf-objekt-der-tobjectlist-zugreifen.html)

Luki206 24. Nov 2014 18:15

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:

TForm1 24. Nov 2014 18:18

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

Der schöne Günther 24. Nov 2014 18:31

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.

Luki206 24. Nov 2014 18:52

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

Sir Rufo 24. Nov 2014 18:59

AW: Auf Objekt in der TObjectList zugreifen
 
Zitat:

Zitat von Luki206 (Beitrag 1280939)
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

Dann frag das direkt und vor allem auf welche Delphi-Referenz durchsuchenSystem.Contnrs.TObjectList / Delphi-Referenz durchsuchenSystem.Generics.Collections.TObjectList bezieht sich deine Frage?
Obwohl die Doku da eigentlich genug Auskunft geben sollte.

Luki206 24. Nov 2014 19:10

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:

DeddyH 24. Nov 2014 19:22

AW: Auf Objekt in der TObjectList zugreifen
 
http://www.delphipraxis.net/dp_reference.php (da steht auch ein prima Tipp ;))

Sir Rufo 24. Nov 2014 20:29

AW: Auf Objekt in der TObjectList zugreifen
 
Zitat:

Zitat von Luki206 (Beitrag 1280941)
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:

Du möchtest mir/uns jetzt tatsächlich weis machen, dass du dir ein Wort nicht merken kannst?

Das magische Wort heißt docwiki und offenbart so Bei Google suchendocwiki TObjectList seine Magie. Ja, du hast Recht, das übersteigt natürlich die Fähigkeit eines Otto-Normal-Programmieres. :roll:

Popov 24. Nov 2014 21:41

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;

Jumpy 25. Nov 2014 10:34

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?

Der schöne Günther 25. Nov 2014 10:40

AW: Auf Objekt in der TObjectList zugreifen
 
Nein, wie denn? Ich dachte (bin mir nicht sicher), die alte TObjectList arbeitet mit
Delphi-Quellcode:
Pointer
oder
Delphi-Quellcode:
TObject
. Du kannst in einer Ableitung nicht einfach den Typ verschärfen, also gegen
Delphi-Quellcode:
TMeineKlasse
ersetzen.

DeddyH 25. Nov 2014 10:45

AW: Auf Objekt in der TObjectList zugreifen
 
Ob das besser oder sinnvoller ist, sei dahingestellt, ich zumindest habe das so gemacht.

Popov 25. Nov 2014 10:58

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.

Bjoerk 25. Nov 2014 13:12

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;

DeddyH 25. Nov 2014 13:22

AW: Auf Objekt in der TObjectList zugreifen
 
http://www.delphi-treff.de/tutorials/vcl/tobjectlist/3/, allerdings trifft der Text nicht ganz zu, denn die Methoden können gar nicht überschrieben werden, dazu müssten sie virtuell oder dynamisch sein. Tatsächlich werden sie im gezeigten Code also verdeckt. In den meisten Fällen ist das nicht so schlimm, aber wenn Polymorphie (z.B. ein TObjectList-Parameter) ins Spiel kommt, spielt das schon eine Rolle.

himitsu 25. Nov 2014 15:53

AW: Auf Objekt in der TObjectList zugreifen
 
Zitat:

Zitat von Bjoerk (Beitrag 1281029)
Wozu? Meistens reicht es schon die property Items zu überschreiben:

Jupp.

Nur überdecken/verdecken, da es ja nicht überschreibbar (override) ist.

DeddyH 25. Nov 2014 15:56

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.

himitsu 25. Nov 2014 16:01

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:)

DeddyH 25. Nov 2014 19:29

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:

himitsu 25. Nov 2014 20:26

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:

sx2008 25. Nov 2014 23:33

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:
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;
Das bedeutet natürlich die meiste Schreibarbeit und den geringsten Grad an Wiederverwendbarkeit;
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.

himitsu 26. Nov 2014 09:36

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 15:03 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz