wxListCtrl - wie Items einfègen nach dem erstellen
-
Hi,
Ich fange grad an mich mit wxWidgets ausseinanderzusetzten, und möchte nun im Moment eine kleine Tabelle mit wxListCtrl erstellen. Also wenn ich im Constructor von Frame die Spalten und Einträge hinzufüge klappt das toll aber wenn ich nachher runtime einen Eintrag machen will stürzt das proggi ab.//base.cpp #include <wx/wx.h> #include "base.h" IMPLEMENT_APP(HalloWeltApp) bool HalloWeltApp::OnInit() { BasicFrame *frame = new BasicFrame( wxT("Hallo Welt"), 50,50, 500,500); frame->Show(TRUE); SetTopWindow(frame); return TRUE; } BasicFrame::BasicFrame( const wxChar *title, int xpos, int ypos, int widht, int height) : wxFrame ( (wxFrame *) NULL, -1,title, wxPoint(xpos,ypos), wxSize(widht, height),wxDEFAULT_FRAME_STYLE){ panel = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxSize(200, 100)); button = new wxButton( panel, wxID_OK, wxT("Ende"), wxPoint(10,10),wxDefaultSize); MenuBar = new wxMenuBar(); InfoMenu = new wxMenu(); InfoMenu->Append(MENU_INFO_ABOUT, wxT("&About")); MenuBar->Append(InfoMenu, wxT("&Info")); SetMenuBar(MenuBar); CreateStatusBar(1); const wxPoint ListCtrlPos(100, 10); const wxSize ListCtrlSize(300, 200); wxListCtrl *ListCtrl = new wxListCtrl(this, -1,ListCtrlPos, ListCtrlSize,wxLC_REPORT|wxLC_VRULES|wxLC_HRULES,wxDefaultValidator,wxT("ListCtrl")); ListCtrl->InsertColumn(1,"erste Spalte",wxLIST_FORMAT_LEFT,-1); ListCtrl->InsertColumn(2,"zweite Spalte",wxLIST_FORMAT_LEFT,-1); ListCtrl->InsertColumn(3,"dritte Spalte",wxLIST_FORMAT_LEFT,-1); long itemIndex = ListCtrl->InsertItem(0, "sdfdsf"); ListCtrl->SetItem(itemIndex, 1, "fffgdsa"); ListCtrl->SetItem(itemIndex, 2, "njbnjb"); } BasicFrame::~BasicFrame() { } BEGIN_EVENT_TABLE(BasicFrame, wxFrame) EVT_BUTTON(wxID_OK, BasicFrame::OnClickButtonOK) EVT_MENU(MENU_INFO_ABOUT,BasicFrame::OnMenuInfoAbout) EVT_SIZE(BasicFrame::OnSize) END_EVENT_TABLE() void BasicFrame::OnClickButtonOK(wxCommandEvent &event){ Close(); } void BasicFrame::OnMenuInfoAbout(wxCommandEvent &event) { long itemIndex = ListCtrl->InsertItem(0, "lol"); ListCtrl->SetItem(itemIndex, 1, "xd"); } void BasicFrame::OnSize(wxSizeEvent& event) { SetStatusText(wxT("Fenstergrösse wurde geändert")); }
//base.h #ifndef BASIC_H #define BASIC_H #include "wx/listctrl.h" class HalloWeltApp : public wxApp{ public: virtual bool OnInit(); }; class BasicFrame : public wxFrame { private: wxListCtrl *ListCtrl; wxPanel* panel; wxButton* button; wxMenuBar *MenuBar; wxMenu *InfoMenu; enum { MENU_INFO_ABOUT }; DECLARE_EVENT_TABLE() public: BasicFrame( const wxChar *title, int xpos, int ypos, int widht, int height); ~BasicFrame(); void OnClickButtonOK(wxCommandEvent &event); void OnMenuInfoAbout(wxCommandEvent &event); void OnSize(wxSizeEvent& event); }; #endif
Meine Frage wär nun, wie kann ich runtime mithilfe eines Butto etc. einen Eintrag machen? Mit wxGrid klappt das ja auch, also müsste es mit wxListCtrl doch auch gehen.
Ich bin dankbar für jede Hilfe
-
Das wxListCtrl Element hat eine Funktion InsertItem über die du neue Einträge in der Liste hinzufügen kannst. Diese funktion nutzt du ja aber auch in deinem Quellcode wie ich gesehen habe schon.
Du sagst das das Programm beim versuch vom Hinzufügen eines neuen Eintrags abstürzt. Welche Fehlermeldung erhälst du den beim Absturz?
-
Naja das hinzufügen von Elementen funktioniert schon aber wenn ich z.b. einen Button oder ein Menu-Element benutze um nach der Erstellung des ListCtrls noch ein Element hinzuzufügen wie hier:
void BasicFrame::OnMenuInfoAbout(wxCommandEvent &event) { long itemIndex = ListCtrl->InsertItem(0, "lol"); ListCtrl->SetItem(itemIndex, 1, "xd"); }
dann führt das zum Absturz.
-
Du erstellst das ListCtrl ja auch lokal. Die Membervariable ist nicht intialisiert.
-
Du erstellst das ListCtrl ja auch lokal. Die Membervariable ist nicht intialisiert
Also zum einen wusste ich noch nicht mal das es da verschiedene Bereiche gibt und zum anderen, hat diese Methode aber bei wxGrid hervorragend funktioniert.
Ich wäre froh wenn du das etwas verständlicher mit einem Beispielcode erläutern könntest.
Ahh und danke für die Antwort!
-
GUI ist nix für Anfänger, falls du also noch probleme mit den Basics hast, solltest du dir erstmal diese aneigenen.
Zu deinem Problem:
im Konstruktor:
wxListCtrl* ListCtrl = new wxListCtrl(...);
Das ist eine lokale Variable, die gibts nicht mehr nach dem Konstruktor geschweige denn ausserhalb davon.
Und sie verdeckt deine Membervariable, so das sie nie initialisiert wird.
Wenn du später drauf zugreifst, ist sie deshalb ungültig.
Der Crash hat also nix mit wxWidgets, wxGrid oder wxListCtrl zu tun, sondern hängt lediglich an dem nichtinitialisierten und ungültigen Pointer.phlox
-
Ok danke habs hingekriegt, und ja ich werde mich nochmal über die Bücher begeben. Aber müsste mich der Compiler nicht auf sowas hinweisen? Also ich bins eigentlich gewohnt, dass wenn eine Variable irgendwo nicht zur verfügung steht, ich vom Compiler darauf hingewiesen werde.
-
Nein, den Pointer zu initialisieren ist deine Sache.
Der Code ist ja valide, solange man nicht drauf zugreift