CheckListBox1 AddObject auslesen ???



  • Hallo,
    ich schreibe in mein ChecklistBox1 einen Namen und in TObject einen ID.

    for (int i=0; i<SQLQuery1->RecordCount ; i++) {
    	 String tan = SQLQuery1->FieldByName("product")->AsString;
    	 String id_var2 = SQLQuery1->FieldByName("produktid")->AsString;
    	 CheckListBox1->Items->AddObject(tan,(TObject*)id_var2.c_str());
    	 SQLQuery1->Next();
     }
    

    Leider kann ich nicht wie bei ListBox auslesen:

    ...
    int vari6 = (int)Form1->ListBox1->Items->Objects[Form1->ListBox1->ItemIndex];
    ...
    

    Meine Frage ist (CheckListBox1->Items->AddObject) String möglich ?
    Und wenn ja wie kann ich es auslesen ?

    Dank im Voraus.



  • Hallo

    Dein Problem ist das du nicht die Grundlagen der Speicherverwaltung in C++ beherscht. Denn sonst wüßtest du das deine zweite Variante mit int zwar funktioniert, aber bereits schon eine Schummelei ist. Denn AddObject verlangt einen Zeiger auf TObject, und du zwingst ihm statt dessen ein int auf. Das geht weil (auf 32 bit) ein Zeiger die gleiche Größe wie int hat. Der Compiler läßt sich damit überrumpeln.
    Aber wenn du versuchst einen temporären AnsiString in TObject-Zeiger zu zwingen, wird die Schummelei nicht mehr gutgehen. Denn AnsiString ist nicht nur kein POD, sondern belegt auch mehr Speicher als int bzw. ein Zeiger. Deshalb wird der Speicher, den das lokale AnsiString belegt, nach dem Schleifenkörper ungültig. Jeder Zugriff danach über die in Objects gespeicherten Adressen ist ungültig.

    Um das Problem zu lösen, schlage ich dir zwei Möglichkeiten vor :
    - Du speicherst die AnsiStrings, die du in AddObjects als Object verwenden willst, in einem zusätzlichen internem (dynamischen) Array. Dann kannst du entweder eine direkte Beziehung zwischen Position CheckListBox und Array herstellen, oder den Arrayindex an AddObject übergeben wie du es gewohnt bist.

    - Du erstellst eine Klasse, abgeleitet von TObject, die zusätzlich nur einen AnsiString-Member hat. Nun kannst du für AddObject jeweils ein solches Dummy-Objekt (mit new!) erstellen dem du ganz ohne Schummelei ein AnsiString mitgibst. Nachteil ist das du selber auch dafür sorgen must das nach gebrauch diese Dummy-Objekte gelöscht werden.

    bis bald
    akari



  • Dein Problem ist das du nicht die Grundlagen der Speicherverwaltung in C++ beherscht.

    Da gebe ich dir Recht.
    Danke für die zwei Tipps.
    Dummy-Objekt ist mir Neu, aber zu mindest sehe ich jetzt wo meine Probleme sind und wie meine Lösung aus sieht.

    Danke.


Log in to reply