ListBox Werte speichern... nur wie?
-
Hallo Jungs, ich habe in Errinerung, das man in einer ListBox auch Werte im Hintergrund speichern kann. Also mit Add wird ein sichtbarer Wert eingegeben und an dieser Stelle kann eine "unsichtbarer" Wert eingegeben werden, der dann mittels der Index Nummer ausgegeben werden kann. Bin schon die Ganze Zeit auf der Suche, weiß aber leider nicht wie das geht? Wäre nett wenn mir das hier einer kurz zeigen könnte, bzw mir die Methode sagen könnte, mit der das gemacht wird.
Gruß
Thorsten
-
Hallo,
siehe Hilfe zu
TListBox::Items::AddObject
TLIstBox::ObjectsDiese Objekte sind aber vom Typ TObject. Du mußt also entweder von TObject ableiten oder casten.
-
ahh, was ist caste? will die werte nur als AnsiString dann speichern ist da dann sowas wie GetObject[0] etc, kann grade nicht nachschauen
-
Hallo
casten : Speicherbereiche mit einem anderem Typ ansprechen als vorgegeben
Du kannst in TStrings die Methode AddObject verwenden, um zu einem Listeintrag noch ein Referenzobjekt (von TObject abgeleitet) zu hinterlegen, das du selber erstellst hast und verwaltest.
Über das Array Objects kannst du jederzeit wieder das Objekt an einer beliebiger Stelle auslesen.
Aber du meistens brauchst einen cast auf den ursprüngichen Typ, um mit diesem vernünftig zu arbeiten. das kann man mit static_cast machen.Das ganze funktioniert mit blinden, C-Style Casts auch mit AnsiStrings.
bis bald
akari
-
Wie schon angedeutet ist die Eigenschaft Objects ein Array auf Pointer auf TObject. AnsiStrings kann man da so ohne weiteres nicht hineinpacken. Evtl Pointer auf AnsiString die du dann nach TObject casten mußt.
AnsiString text; list->Items->AddObject(reinterpret_cast<TObject*>(&text));So etwas ist aber sehr tückisch. Du mußt gut auf die Gültigkeitsbereiche der Variablen (bzw. der Pointer) achten. Wenn du deinen String wieder raushaben willst mußt du wieder zurückcasten wobei du hier keine Kontrolle hast ob das gut geht da ein reinterpret_cast keine Gültigkeitsprüfungen vornimmt.
Eine andere Variante wäre hier eine neue Klasse von TObject abzuleiten welcher der du dann nur neue Membervariablen hinzufügen mußt.
class MyClass : public TObject { public: AnsiString text; }; MyClass *obj = new MyClass; obj->text = "Hallo"; list->Items->AddObject(obj);Mit new erzeugte Objekte mußt du natürlich auch selbst wieder löschen. Die ListBox macht das nicht für dich. Beim Auslesen mußt du dann zurückcasten.
AnsiString TestText; MyClass *test = dynamic_cast<MyClass*>(list->Items->Objects[0]); if( test != 0) //war der Cast erfolgreich? TestText = test->text;Hier nimmt man dynamic_cast weil dieser eine Überprüfung der Gültigkeit zulässt.
@akari
Pointer auf AnsiString kannst du nicht mit static_cast nach TObject* casten da AnsiString nicht von TObject abgeleitet ist. Hier ist der reinterpret_cast oder ein C-Style Cast erforderlich. [edit]Oder habe ich dich da falsch verstanden?[edit]
-
hat bisher leider noch nicht funktioniert, bekomme da ein paar fehlermeldungen wie "Konvertierung von MyClass nach AnsiString nicht möglich" und so.
Gibt es da nicht noch ne andere Lösung? [edit] also auch ohne klasse?[/edit]
vlt. noch ein TList -objekt erzeugen und darin auch die Pfade speichern?ich habe irgendwie wage in errinerung das ich das mal einfacher hinbekommen habe, nur weiß ich leider nicht mehr wie, habe auch kein projekt mehr alles wech ...
trotzdem vielen dank schonmal
-
Aktuelle Fehlermeldungen
[C++ Fehler] db_u1.cpp(54): E2034 Konvertierung von 'MyClass *' nach 'AnsiString' nicht möglich
[C++ Fehler] db_u1.cpp(54): E2342 Keine Übereinstimmung des Typs beim Parameter 'S' ('const AnsiString' erwartet, 'MyClass *' erhalten)
[C++ Fehler] db_u1.cpp(54): E2193 Zu wenige Parameter im Aufruf von '_fastcall TStrings::AddObject(const AnsiString,TObject *)'
-
Da hatte ich wohl eine falsche Parameterlist für AddObject verwendet.

Es muß natürlich so seinlist->Items->AddObject("ListBoxEintrag",obj);Der erste Parameter in AddObject stellt deinen ListBoxEintrag dar und der zweite dein einzufügendes Objekt.
-
Ja super geil, das funktioniert auch nun!!
Nur wie meintest du das:
Mit new erzeugte Objekte mußt du natürlich auch selbst wieder löschen. Die ListBox macht das nicht für dich.
Mit " delete MyClass " kann ich das ja nicht löschen. Weiß grad nicht wie das gemeint ist.
Trotzdem schon mal vielen vielen dank
-
Das bedeutet, wenn du die Instanzen von MyClass mit new erstellt und dann in deine ListBox gepackt hast, werden sie nicht gelöscht wenn die ListBox-Instanz gelöscht wird (also im Destruktor des Owners). Das bedeutet, das du die Objekte vorher selbst löschen mußt. Das kannst du z.Bsp. im Destruktor deiner Form machen (wenn diese Form Owner von der Listbox ist).
So etwa__fastcall TMyForm::~TMyForm() { for( int i=0; i< list->Items->Count; ++i) delete list->Objects[i]; } //---------------------------------------------------------------------------Das ist jetzt nur ein Beispiel und nicht eins zu eins zu übertragen.