2016-10-19 3 views
0

Wie rufen Sie eine Funktion auf, der bereits ein Ereignis zugeordnet ist?So legen Sie mehrere Ereignisse für die Funktion fest

Ich möchte die Funktion mit so etwas rufen können:

statsDialog::statsDialog(..) : wxDialog(..) { 
    updateStats(); 
} 

Oder, wie mehrere Eventhandler auf eine Funktion binden? Rufen Sie zum Beispiel updateStats mit dem Ereignis wxEVT_SET_FOCUS AND auf, wenn UPDATE_STATS_BUTTON gedrückt wird. Wie kann ich das tun, ohne Code zu duplizieren (Kopieren der Funktion updateStats, indem Sie sie einfach in wxFocusEventHandler ändern)?

BEGIN_EVENT_TABLE(statsDialog, wxDialog) 
EVT_BUTTON(UPDATE_STATS_BUTTON, statsDialog::updateStats) 
END_EVENT_TABLE() 

statsDialog::statsDialog(..) : wxDialog(..) {  
    // layout stuff 
} 

void 
statsDialog::updateStats(wxCommandEvent& event) { 
    // do stuff on dialog focus AND when UPDATE_STATS_BUTTON is pressed 
} 

Antwort

0

haben einfach eine Funktion DoUpdateStats() genannt sowohl von der Fokus und Schaltfläche Ereignishandler aufgerufen. Dies ist besonders trivial bei Verwendung von C++ 11 mit Bind():

Bind(wxEVT_SET_FOCUS, [](wxFocusEvent& e) { e.Skip(); DoUpdateStats(); }); 
btn->Bind(wxEVT_BUTTON, [](wxCommandEvent&) { DoUpdateStats(); }); 
+0

Vielen Dank! Works, musste aber & in den Klammern hinzufügen, damit es kompiliert werden konnte. 'updateStatsButton-> Bind (wxEVT_BUTTON, [&] (wxCommandEvent &) {DoUpdateStats();});' –

+0

Der Standard-Capture-Knoten wird nicht benötigt, wenn 'DoUpdateStats()' eine globale Funktion ist, aber wenn es eine Member-Methode ist müssen "dieses" erfassen. Es ist wohl besser, dies explizit zu tun, als den Standard-Capture-Modus zu verwenden. –

Verwandte Themen