Anzeige:
Ergebnis 1 bis 11 von 11

Thema: wxWindows void* Zeiger

  1. #1
    Registrierter Benutzer Avatar von dakjo
    Registriert seit
    08.03.2002
    Beiträge
    90

    wxWindows void* Zeiger

    Ich verzweifel gleich !

    Ich habe eine Class wxListbox
    Code:
    m_pList1 = new wxListBox(this, -1, wxDefaultPosition, wxSize(170,320));
    nun kann man dieser Classe Daten übergeben,
    Laut Docu :
    Code:
    void Append(const wxString&  item, void* clientData)
    Das mach ich wie folgt
    Code:
    wxString msg = dlg->GetValue();
    m_pList1->Append(dlg->GetValue(), &msg);
    Richtig ?

    Nun will ich diese Daten wiederhaben
    Laut Docu
    Code:
    void* GetClientData(int n)
    Was muss ich machen um die Daten wieder zu kriegen ?

    SO ?
    Code:
    wxString *str = (wxString *) (m_pList1->GetClientData(m_pList1->GetCount()));
    Gehts jedenfalls nicht

    Ich hasse void .......................
    Code:
    ------>>>|| Gentoo Linux ||<<<------

  2. #2
    Registrierter Benutzer
    Registriert seit
    24.06.2003
    Beiträge
    486

    Re: wxWindows void* Zeiger

    Original geschrieben von dakjo

    SO ?
    Code:
    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.

  3. #3
    Registrierter Benutzer Avatar von dakjo
    Registriert seit
    08.03.2002
    Beiträge
    90
    Auch wenn ich 0, anstatt GetCount() nehme, bekomme ich einen Sec Fault bei der zuweisung.
    Code:
    ------>>>|| Gentoo Linux ||<<<------

  4. #4
    Registrierter Benutzer
    Registriert seit
    24.06.2003
    Beiträge
    486
    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).

  5. #5
    Registrierter Benutzer Avatar von dakjo
    Registriert seit
    08.03.2002
    Beiträge
    90
    Danke jetzt gehts, na klar, static wars !

    Kann ich das einfach so tun ?

    Code:
    if(dlg->ShowModal() == wxID_OK)
    {
       m_pItemL1++;
       static wxString msg = dlg->GetValue();
       m_pList1->Append(dlg->GetValue(), &msg);
    }
    Oder gehts besser ?
    Code:
    ------>>>|| Gentoo Linux ||<<<------

  6. #6
    Registrierter Benutzer Avatar von dakjo
    Registriert seit
    08.03.2002
    Beiträge
    90
    Hatte den keiner ne Meinung dazu ?
    Code:
    ------>>>|| Gentoo Linux ||<<<------

  7. #7
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    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,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  8. #8
    Registrierter Benutzer Avatar von dakjo
    Registriert seit
    08.03.2002
    Beiträge
    90
    Also husch ich nachher, wenn ich die Listbox nicht mehr brauche, einfach mit

    laut Docu:
    Code:
    void Delete(int n)
    
    Deletes an item from the listbox.
    
    Parameters
    
    n
    
    The zero-based item index.
    Einmal durch die ListBox.

    Richtig ?
    Code:
    ------>>>|| Gentoo Linux ||<<<------

  9. #9
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    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,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  10. #10
    Registrierter Benutzer Avatar von dakjo
    Registriert seit
    08.03.2002
    Beiträge
    90
    Aber ich bekomm doch den Zeiger wider Zurück mit

    Code:
    wxString *str = (wxString *) (m_pList1->GetClientData(num));
    Dann kann ich doch mit,
    Code:
    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 ?
    Code:
    ------>>>|| Gentoo Linux ||<<<------

  11. #11
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Klar, hab ich auch als zweite Möglichkeit vorgeschlagen.

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •