Announcement

Collapse
No announcement yet.

Indiziert auf Objekte zugreifen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Indiziert auf Objekte zugreifen

    Hallo liebe Delphi-Freunde,
    ich habe da ein Problem für das ich keine Loesung finde. Ich moechte auf Objekte indiziert zugreifen.
    Etwa in folgender Form :

    for i := 1 to 4 do
    if BoolTab[i]
    then ShapeTab[i].Color := clRed
    else ShapeTab[i].Color := clBlue;

    Für das Anlegen einer entsprechenden Liste von Shapes (Komponenten) finde ich nun keine Loesung.
    Nach vielem erfolglosen Suchen habe ich mir zur Probe folgendes einfallen lassen :

    ShapeTab: array[1..4] of TShape = (Shape1,Shape2,Shape3,Shape4);

    Da TShape ein Typ ist, wird er vom Compiler nicht angemeckert. Aber bei Shape1 will er jedoch eine Konstante haben.
    Gibt es überhaupt eine Moeglichkeit Objekte zu packen und dann wieder einen Zugriff darauf zu bekommen oder haben
    die Vaeter von Delphi an einen solchen Umgang mit Objekten nicht gedacht.

    Udo Reith

  • #2
    Hallo,

    das Anlegen eigener Listen wäre auch Zuviel des Guten, denn Delphi macht das schon automatisch im Hintergrund. In der Delphi-Hilfe sind mehrere Beispiel dazu unter <b>TComponent.Components</b> zu finden.

    "<i>Mit Components können Sie auf alle der Komponente untergeordneten Komponenten zugreifen, beispielsweise auf die Komponenten eines Formulars. Die Eigenschaft ist besonders nützlich, wenn Sie einzelne untergeordnete Komponenten über eine Nummer anstelle über deren Namen ansprechen wollen. Components wird intern verwendet, um iterative Prozesse an allen untergeordneten Komponenten durchzuführen.</i>"

    Über den Objektinspektor kann man jeder Instanz einen eigenen (eindeutigen) Wert in der Eigenschaft <b>Tag</b> zuweisen, so dass beim Durchgehen der Kollektion aller Instanzen jede einzelne eindeutig identifiziert werden kann.
    &#10

    Comment


    • #3
      Zwei weitere Verfahren sind - wenn man nur bestimmte Objekte benutzen will - TList (für beliebige Objekte) oder TComponentList (für eine bestimmte Menge von explizit benannten Komponenten)

      Comment


      • #4
        Hallo Jürgen,
        ich habe eine kurze Frage zu TList. Kann ich in einer TList auch Objekte unterschiedlichen Typs ( selbstdefinierte Objekte ) sammeln ?
        Bsp.:
        MyList := TList.create; MyList.add(EinObjektTypA); MyList.add(EinObjektTybB);
        Wenn ja, wie kann ich auf die einzelnen Objekte wieder zugreifen ? Ich habe es so probiert :
        AktuellesObjekt := TEinObjektTypA(MyList.Items[entsprechender index]);
        Bekomme aber eine Zugriffsverletzung lesen von Adresse....

        Das Problem entsteht, da ich diese Objekte in meiner Anwendung instatiiere, oder auch nicht (!) je nach Bedarf, und diese Objekte sollen dann in einer Datenbank gespeichert werden. Wenn ich eins dieser Objekte in der Anwendung Instatiiere und dann wieder freigebe (Objekt.free) bekomme ich bei der Abfrage :
        if MeinMittlerweileWiederGelöschtesObjekt <> nil die Reaktion true, obwohl es nicht mehr existiert !?? Daher wollte ich die Objekte (verschiedenen Typs) in einer TList unterbringen.

        Gib es da eine Lösung ??
        Lut

        Comment


        • #5
          Hy

          die TList-Frage ( untersch. Objekt in einer Liste ) hat sich dadurch geklärt, das ich einen Quelltextfehler bei mir gefunden habe.

          Aber nun habe ich doch noch eine Frage :

          Wenn ich eine Liste mit verschiedenen Objekten habe, kann ich dann den ObjektTYP eines Items ermitteln ? Ich habe es so probiert:

          showmessage((myListe.Items[i]^).classname);

          was allerdings die Fehlermeldung 'Record,Object oder Klassentyp erforderlich' ergab.Ich möchte das Item nicht durch

          Object :=TMyObject(myListe.Items[i]);
          showmessage(Object.classname);

          dereferenzieren, da ich dafür ja schonden Typ brauche ??

          Danke Lut

          Comment

          Working...
          X