wxWidgets: Problem beim Anlegen einer EventTable



  • Hi Leuts,

    ich arbeite hier mit wxFormbuilder, wxWidgets und VisualStudioExpress 2008.
    Nun möchte ich einen Timer anlegen (wxTimer).
    Alle Beispiele die ich im Net dazu finde arbeiten mit einer EventTable (beim Formbuilder benutze ich stattdessen "Connect").

    Nun meldet der Linker:
    error LNK2005: "protected: virtual struct wxEventTable const * __thiscall Test0MainDialog::GetEventTable(void)const " (?GetEventTable@Test0MainDialog@@MBEPBUwxEventTable@@XZ) ist bereits in Main.obj definiert.

    Was mache ich denn falsch ?

    Greets
    Karlheinz

    Meine Klasse sieht also so aus:
    class Test0MainDialog : public MainDialog
    {
    DECLARE_EVENT_TABLE()
    protected:
    // Handlers for MainDialog events.
    void OnClickOK( wxCommandEvent& event );
    void OnClickCancel( wxCommandEvent& event );

    public:
    /** Constructor /
    Test0MainDialog( wxWindow
    parent );
    void OnTimer(wxTimerEvent& event);

    private:
    wxTimer m_timer;

    };
    BEGIN_EVENT_TABLE(Test0MainDialog, MainDialog)
    EVT_TIMER(TIMER_ID, Test0MainDialog::OnTimer)
    END_EVENT_TABLE()



  • hast du das BEGIN_EVENT_TABLE() und das END_EVENT_TABLE() vieleicht in den Header gepackt? dann wird diese nämlich in jeder Datei deklariert, in der der Header included wird. Ergo mehrfachdeklaration.



  • 🙂
    Danke.
    Nun läßt sich zwar das Programm compilieren und linken, aber das Timer Event tritt nicht auf (habe einen Breakpoint auf die Funktion gesetzt, die wird nicht aufgerufen).



  • das kommts jetzt darauf an wie dein Konstruktor aussieht.
    So ein timer will doch gestartet sein 😉

    poste mal deinen code,nicht nur den header



  • BEGIN_EVENT_TABLE(Test0MainDialog, MainDialog)
    EVT_TIMER(TIMER_ID, Test0MainDialog::OnTimer)
    END_EVENT_TABLE()

    Test0MainDialog::Test0MainDialog( wxWindow* parent )
    :
    MainDialog( parent )
    {
    m_timer.Start(1000);
    }

    void Test0MainDialog::OnTimer(wxTimerEvent &event)
    {
    int i = 0;
    i++;
    }



  • hat dein Timer-Objekt auch tatsächlich die ID ' TIMER_ID '?



  • das war der Fehler.
    Obwohl ich noch nciht weiss, was genau ich dem Konstruktor, bzw. SetOwner (wxEvtHandler *owner, int id = -1) als wxEvtHandler übergeben muss.
    Wenn ich anstelle von TIMER_ID mit -1 arbeite, dann funzts es.
    Was muss ich da übergeben ?


Anmelden zum Antworten