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).
-
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; }