[wxPack] Eventhandler für Controls aus FormBuilder
-
Hallo!
Vielleicht könnt ihr mir ja helfen, die Webseiten von wxFormBuilder, wxWidgets und auch Google geben darüber nicht viel her.
Ich benutze das wxPack Version 2.7.0. Über MS VS Express habe ich ein wxWidgets-Projekt erstellt und das GUI über den Editor zusammengebastelt. Soweit funktioniert auch alles. Doch bei den Events scheitert es dann.
Der FormBuilder erzeugt alle Controls als Pointer-Membervariable mit new. Dem Konstruktoraufruf eines jeden Controls wird eine Control ID übergeben. Händisch erstellt würde man jedem Control eine eigene Control ID geben (a la ID_BUTTON_OK, ID_COMBO_1). Nicht so der FormBuilder. Er legt alle Controls unter der selben Control ID ab (ID_DEFAULT).
m_panel1 = new wxPanel( m_splitter1, ID_DEFAULT, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); wxBoxSizer* bSizer5; bSizer5 = new wxBoxSizer( wxHORIZONTAL ); m_button2 = new wxButton( m_panel1, ID_DEFAULT, wxT("MyButton"), wxDefaultPosition, wxDefaultSize, 0 ); bSizer5->Add( m_button2, 0, wxALL, 5 ); m_button3 = new wxButton( m_panel1, ID_DEFAULT, wxT("MyButton"), wxDefaultPosition, wxDefaultSize, 0 ); bSizer5->Add( m_button3, 0, wxALL, 5 ); m_button4 = new wxButton( m_panel1, ID_DEFAULT, wxT("MyButton"), wxDefaultPosition, wxDefaultSize, 0 ); bSizer5->Add( m_button4, 0, wxALL, 5 );
Jetzt verstehe ich nicht, warum man diese ID über den Editor nicht verändern kann (wie beim Resourceneditor des VS), bzw. warum er nicht selbstständig verschiedene ID's wählt. So kann ich ja keine Events abfangen, wenn jedes Control die selbe Control ID hat, oder? Im Quelltext möchte ich die ID's nicht verändern, denn wenn im FormBuilder etwas verändert wird überschreibt er ja das cpp wieder.
Ich bin ratlos
bitte helft mir.
viele Grüße
Daniel
-
Ich glaube du kannst das schon ändern im wxFormBuilder.
Einfach im Fenster unter wxWindow wo id/ID_DEFAULT steht.
Wenn du keine festen statischen IDs (enum, const etc.) vergeben willst,
kannst du auch einfach wxNewId() einfügen, das vergibt dann einfach
die nächste freie ID. (so mach ich es i.d.R.)
Ich kopiere meistens allerdings den erzeugungscode in meine Klassen,
da man nach dem GUI Design häufig nichts mehr ändern muss am Aussehen.
Und ich so einfach ein paar Sachen einfacher einfügen kann.
Wenn man erstmal an den Sizerkram gewöhnt hat, braucht man für kleinere
Dialoge auch keine Formbuilder mehr.
-
phlox81 schrieb:
Ich glaube du kannst das schon ändern im wxFormBuilder.
Einfach im Fenster unter wxWindow wo id/ID_DEFAULT steht.
Wenn du keine festen statischen IDs (enum, const etc.) vergeben willst,
kannst du auch einfach wxNewId() einfügen, das vergibt dann einfach
die nächste freie ID. (so mach ich es i.d.R.)
Ich kopiere meistens allerdings den erzeugungscode in meine Klassen,
da man nach dem GUI Design häufig nichts mehr ändern muss am Aussehen.
Und ich so einfach ein paar Sachen einfacher einfügen kann.
Wenn man erstmal an den Sizerkram gewöhnt hat, braucht man für kleinere
Dialoge auch keine Formbuilder mehr.Jo, habs jetzt gefunden. ist etwas versteckt.
Wenn man nun die ID's mit wxNewId() vergibt, woher weiß ich dann welche ID das Control hat um es anzusprechen? Also für Events mein ich. Gibts da vielleicht ne Methode um das Control über die Membervariable anzusprechen? Oder wie machst du das?
Stimmt eigentlich, wenn man mit dem Designen fertig ist, braucht man den FormBuilder eigentlich nicht mehr. Na mal sehen.Danke
gruß
Daniel
-
Natürlich weisst du nicht was für eine ID welches Steuerelment hat.
Das ist der Nachteil der Methode, du sparst dir aber das anlegen und verwalten von
Enums für die Steuerelemente. Ein weiteres Problem ist, das du Events nicht über die Makros binden kannst.Aber für all das gibt es gute, wenn nicht sogar bessere Lösungen:
In meinen Panels sind die Steuerelemente immer auch membervariablen, so kann ich jeder
Zeit auf sie zugreifen, ohne irgendwie rumcasten zu müssen, oder gar wxWindow::FindChildbyID aufrufen zu müssen.
Selbst die ID ist kein Problem, denn mit txtctrl->GetId() hab ich die sofort, zumindest zur Laufzeit,
und da brauch ich sie ja. Die Events kann man nun ganz einfach mit Connect verbinden:Connect(prev->GetId(),wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(GridPanel::OnPrev));
prev ist hier ein wxButton, die Event ID als zweites Argument findest du fast immer in der Doku der jeweiligen Klasse.
Die EventHandler sind auch recht easy, für CommandEvents gibts den wxCommandEventHandler, für Maus den wxMouseEventHandler etc.
GridPanel::OnPrev ist dann der eigentliche Handler, der die Syntax void GridPanel::OnPrev(wxCommandEvent& e) hat.
-
DanielusITF schrieb:
...Gibts da vielleicht ne Methode um das Control über die Membervariable anzusprechen?
phlox81 schrieb:
...In meinen Panels sind die Steuerelemente immer auch membervariablen, so kann ich jeder Zeit auf sie zugreifen, ohne irgendwie rumcasten zu müssen, oder gar wxWindow::FindChildbyID aufrufen zu müssen.
Selbst die ID ist kein Problem, denn mit txtctrl->GetId() hab ich die sofort, zumindest zur Laufzeit,
und da brauch ich sie ja. Die Events kann man nun ganz einfach mit Connect verbinden:Connect(prev->GetId(),wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(GridPanel::OnPrev));
prev ist hier ein wxButton, die Event ID als zweites Argument findest du fast immer in der Doku der jeweiligen Klasse.
Die EventHandler sind auch recht easy, für CommandEvents gibts den wxCommandEventHandler, für Maus den wxMouseEventHandler etc.
GridPanel::OnPrev ist dann der eigentliche Handler, der die Syntax void GridPanel::OnPrev(wxCommandEvent& e) hat.genau das meinte ich, m_control->GetId()...
vielen dank für die ausführliche erklärung. mit wxNewId() und GetId() scheint das wirklich etwas komfortabler zu sein.gruß
Daniel