TList - Items



  • Hallo,
    Ich habe wieder mal ein (einfaches) Problem, bei dem ihr mir sicher weiterhelfen könnt.

    In meiner Anwendung (mit BCB6 entwickelt) speichere ich mehrere Objekte (logischerweise mit unterschiedlichen Daten) in einer TList-Komponente.
    Dazu benutze ich natürlich die Methode "Add(void*)". Dies scheint auch zu funktionieren, doch das Problem liegt anschliessend im Zugriff auf diese Liste.

    Wenn ich eine Schleife mache über alle Items in TList, dann liefert mir jedes Item die gleichen Daten zurück, und zwar immer diejenigen, die beim letzten Aufruf der Methode "Add" hinzugefügt wurden.

    Hier der Code wie ich die Daten in die Liste schreibe:

    // lList ist der Name der TList-Komponente
    
        CEntryStruct *Entry = new CEntryStruct();
    
        for (int i = 0; i < 10; i++)
        {
            // Entry wird jedes mal mit anderen Daten gefüllt
            ...
            lList->Add(Entry);
        }
    

    Hier der Code wie ich versuche auf die Items zuzugreifen:

    CEntryStruct *Entry;
    
        for (int i = 0; i < lList->Count; i++)
        {
            Entry = (CEntryStruct*)lList->Items[i];
            // Daten aus Entry lesen
            ...
        }
    


  • Probier es mal so:

    // lList ist der Name der TList-Komponente 
    
        CEntryStruct *Entry ;
    
        for (int i = 0; i < 10; i++) 
        { 
            Entry = new CEntryStruct(); 
    
            // Entry wird jedes mal mit anderen Daten gefüllt 
            ... 
            lList->Add(Entry); 
        }
    

    Du mußt immer eine neue Instanz mit new erzeugen, sonst ueberschreibst Du einfach immer die alte. 🙄



  • ... Achso mach es lieber so:

    for (int i = 0; i < lList->Count; i++)
    {
    Entry = dynamic_cast<CEntryStruct>(lList->Items[i]);*
    if(Entry)
    {
    // Daten aus Entry lesen
    }
    ...
    }



  • Herzlichen Dank YLIREBUS, jetzt funktioniert es bestens 👍

    wieder mal so ein dämlicher Fehler... 🙄



  • @YLIREBUS
    TList verwaltet void* Pointer und die kannst du nicht mit dynamic_cast zurück casten. Hierfür benötigt man schon einen reinterpret_cast (oder halt den alten C-Style Cast).



  • @Braunstein

    sorry ich mache das immer, hatte nie Probleme.
    Wenn es nicht funzen würde, würde es an der Stelle Kacheln.
    Weil man nur ein gültiges Handel bekommt, wenn es sich auch wirklich um den gekasteten Typ handelt 🙂

    Hier mal das Beispiel aus der Hilfe mit dem einfachen cast:

    typedef struct AList
    
    {
      int I;
      char C;
    } TAList;
    
    typedef TAList* PAList;
    
    void __fastcall TForm1::Button1Click(TObject *Sender)
    
    {
      PAList AStruct;
      TList *MyList = new TList;
      // fill the TList
      AStruct = new TAList;
      AStruct->I = 100;
      AStruct->C = 'Z';
      MyList->Add(AStruct);
      AStruct = new TAList;
      AStruct->I = 100;
      AStruct->C = 'X';
      MyList->Add(AStruct);
    
      // Liste durchlaufen und Elemente auf der Zeichenfläche 
      // einer PaintBox-Komponente ausgeben.
      int Y = 10; // Position auf der Zeichenfläche
      for (int i = 0; i < MyList->Count; i++)
      {
        AStruct = (PAList) MyList->Items[i];
    
        PaintBox1->Canvas->TextOut(10, Y, IntToStr(AStruct->I));
        Y += 30;  // Y-Wert erneut erhöhen
        PaintBox1->Canvas->TextOut(10, Y, AStruct->C);
        Y += 30;  //Y-Wert erhöhen
      }
    
      // Aufräumen: Listeneinträge und Liste freigeben
      for (int i = 0; i < MyList->Count; i++)
      {
        AStruct = (PAList) MyList->Items[i];
        delete AStruct;
      }
      delete MyList;
    }
    

Anmelden zum Antworten