Archiv verlassen und diese Seite im Standarddesign anzeigen : wxWindows void* Zeiger
Ich verzweifel gleich !
Ich habe eine Class wxListbox
m_pList1 = new wxListBox(this, -1, wxDefaultPosition, wxSize(170,320));
nun kann man dieser Classe Daten übergeben,
Laut Docu :
void Append(const wxString& item, void* clientData)
Das mach ich wie folgt
wxString msg = dlg->GetValue();
m_pList1->Append(dlg->GetValue(), &msg);
Richtig ?
Nun will ich diese Daten wiederhaben
Laut Docu
void* GetClientData(int n)
Was muss ich machen um die Daten wieder zu kriegen ?
SO ?
wxString *str = (wxString *) (m_pList1->GetClientData(m_pList1->GetCount()));
Gehts jedenfalls nicht :(
Ich hasse void .......................
Original geschrieben von dakjo
SO ?
wxString *str = (wxString *) (m_pList1->GetClientData(m_pList1->GetCount()));
Gehts jedenfalls nicht :(
Was geht denn nicht?
Also wie ich das sehe,gibt GetCount die Anzahl der Elemente zurück,und der Zugriff mit GetClientData ist zero-based.
Dein Zugriff greift also auf ein Element zu,daß es nicht gibt.
Auch wenn ich 0, anstatt GetCount() nehme, bekomme ich einen Sec Fault bei der zuweisung.
Die Liste speichert nur die Adresse deines Objektes ab,aber wenn dein Objekt automatisch ist,dann existiert es nicht mehr,wenn du später wieder über den Zeiger draufzugreifen willst.
Mach' mal testweise deinen string msg static oder global (später mußt du ihn dann dynamisch anlegen).
Danke jetzt gehts, na klar, static wars !
Kann ich das einfach so tun ?
if(dlg->ShowModal() == wxID_OK)
{
m_pItemL1++;
static wxString msg = dlg->GetValue();
m_pList1->Append(dlg->GetValue(), &msg);
}
Oder gehts besser ?
Hatte den keiner ne Meinung dazu ?
anda_skoa
15-01-2004, 08:21
Es geht darum, einen Pointer zu übergeben, der auch spätzer noch vorhanden ist.
Dein erster Versuch benutze eine lokale Variable, die natürlich nur kurz gültig ist.
Am besten du erzeugst einfach eine wxString Instanz am Heap und sorgst halt dafür, dass sie auch wieder gelöscht wird, wenn das Item gelöscht wird.
Ciao,
_
Also husch ich nachher, wenn ich die Listbox nicht mehr brauche, einfach mit
laut Docu:
void Delete(int n)
Deletes an item from the listbox.
Parameters
n
The zero-based item index.
Einmal durch die ListBox.
Richtig ?
anda_skoa
15-01-2004, 16:48
Ich denke nicht, denn da wird wahrscheinlich der void* nicht gelöscht.
Entweder du merkst dir die String Pointer in einer Liste und löscht sie anschliessend von da, oder du musst vorher durch die Listbox gehen und dort von jedem Eintrag den Datenpointer löschen.
Ciao,
_
Aber ich bekomm doch den Zeiger wider Zurück mit
wxString *str = (wxString *) (m_pList1->GetClientData(num));
Dann kann ich doch mit,
void Clear()
Empties the string and frees memory occupied by it.
Erst den String leermachen und dann mir delete str den Pointer löschen oder ?
anda_skoa
16-01-2004, 13:15
Klar, hab ich auch als zweite Möglichkeit vorgeschlagen.
Ciao,
_
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.