PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : wxWindows void* Zeiger



dakjo
12-01-2004, 15:54
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 .......................

wraith
12-01-2004, 16:05
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.

dakjo
12-01-2004, 17:06
Auch wenn ich 0, anstatt GetCount() nehme, bekomme ich einen Sec Fault bei der zuweisung.

wraith
12-01-2004, 17:22
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).

dakjo
12-01-2004, 20:33
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 ?

dakjo
15-01-2004, 08:14
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,
_

dakjo
15-01-2004, 15:47
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,
_

dakjo
16-01-2004, 08:30
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,
_