wxWidgets: vector zwischen Fenstern versenden
-
Danke für deine Hilfe!
Ich hab jetzt anhand des wxWidgetsTutorials http://www.c-plusplus.net/forum/viewtopic-var-t-is-175682.html
eine eigene Eventklasse programmiert. Es wird soweit alles kompiliert und das Programm springt auch in die Methode, welche das Signal auslöst.
Leider wird das Signal nicht im Hauptfenster empfangen.class ReceiveEvent : public wxNotifyEvent { private: vector<string> content; wxEventType eventType; public: ReceiveEvent(vector<string> vec,wxEventType = wxEVT_NULL,int id =0); ~ReceiveEvent(void); vector<string> getContent(); }; typedef void(wxEvtHandler::*ReceiveEventFunction)(ReceiveEvent&); BEGIN_DECLARE_EVENT_TYPES() DECLARE_EVENT_TYPE(EVT_VECTOR_READY, -1) END_DECLARE_EVENT_TYPES() #define EVT_VECTOR_READY_MACRO(id, fn) DECLARE_EVENT_TABLE_ENTRY( \ EVT_VECTOR_READY, id, -1, (wxObjectEventFunction) \ (wxEventFunction)(ReceiveEventFunction) & fn, \ (wxObject*) NULL), #define ReceiveEventHandler(func) \ (wxObjectEventFunction) \ (wxEventFunction)wxStaticCastEvent(ReceiveEventFunction, &func)
#include "receiveevent.h" DEFINE_EVENT_TYPE(EVT_VECTOR_READY) ReceiveEvent::ReceiveEvent(vector<string> vec,wxEventType type ,int id) { content = vec; eventType = type; } ..... [code] //Sendemethode im kleinen Fenster: void Dialog::sendLogs(wxCommandEvent& event) { ReceiveEvent * myevent = new ReceiveEvent(logfiles,EVT_VECTOR_READY); this->GetParent()->AddPendingEvent(*myevent); }
//im Konstruktor des Hauptfensters Connect(EVT_VECTOR_READY,ReceiveEventHandler(ProjectDlg::recLogFiles)); //Empfangsmethode void ProjectDlg::recLogFiles(ReceiveEvent &event) { logfiles = event.getContent(); }
-
Ist das ein (modaler) Dialog?
Ich weiss so auch nicht, wieso die nicht richtig aufgerufen wird.
Vergleich am Besten mal mit der Implementation in dem Beispiel aus dem Tutorial.phlox
-
Nein, das Fenster ist selbst erstellt und nicht modal.
ok, der Klassenname war nicht so gut.
Die beiden Fenster haben sonst nichts mit einander zu tun, nur dass ein "Dialog" Object in der ProjectDlgklasse erzeugt und initialisiert wird.Ich hab genau den Code vom Beispiel übernommen, und ich kann einfach keinen Fehler finden.
-
Füg bitte mal in die EventMethode eine MessageBox ein, um zu sehen ob diese Aufgerufen wird.
Und für die Eventklasse solltest du noch einen Copyconstructor einfügen, dass könnte der Grund für die fehlenden Daten sein.
-
Ich hab bei beiden einen MessageDialog eingefügt.
Der Dialog der SendeMethode wird angezeigt. Der Dialog in der Empfangsmethode nicht. Auch der Debugger von VS2005 geht nur in die SendeMethode.Ich hab mal die EmpfangsMethode in die gleiche Klasse wie die sendeMethode gepackt. Da hat's auch nicht funktioniert.
Den Kopierkonstruktor hab ich auch hinzugefügt.
-
Ich hab jetzt mal ein eigenständiges Testprojekt erstellt, aber auch hier läuft es nicht. Die Sendemethode wird aufgerufen, aber die Empfangsmethode nicht.
Meine ReceiveEvent klasse ist gleich geblieben(ergänzt um den Kopierkonstruktor)
#include "SignalFrame.h" const int SignalFrame::ID_FILE_EXIT = ::wxNewId(); const int SignalFrame::ID_HELP_ABOUT = ::wxNewId(); #define ID_BUTTON 10 BEGIN_EVENT_TABLE( SignalFrame, wxFrame ) EVT_MENU( ID_FILE_EXIT, SignalFrame::OnExit ) EVT_MENU( ID_HELP_ABOUT, SignalFrame::OnAbout ) EVT_BUTTON(ID_BUTTON, SignalFrame::send) END_EVENT_TABLE() SignalFrame::SignalFrame( wxFrame *frame, const wxString& title ): wxFrame( frame, -1, title,wxPoint(100,100),wxSize(200,200) ) { createMenu(); wxButton *auslöser = new wxButton(this,ID_BUTTON,wxT("Signal senden")); Connect(EVT_VECTOR_READY,ReceiveEventHandler(SignalFrame::rec)); } void SignalFrame::send(wxCommandEvent& event) { vector<string> logfiles; wxMessageDialog *g = new wxMessageDialog(this,wxT("Send")); g->ShowModal(); ReceiveEvent * myevent = new ReceiveEvent(logfiles,EVT_VECTOR_READY); myevent->SetEventObject(this); this->GetParent()->AddPendingEvent(*myevent); } void SignalFrame::rec(ReceiveEvent& event) { wxMessageDialog *g = new wxMessageDialog(this,wxT("Läuft!")); g->ShowModal(); } ....
-
Wieso erstellst du eigentlich den Event mit new?
Nach der Methode hast du damit ein Speicherleck...Das ist die Eventklasse aus dem Tutorial:
lass TurnEvent : public wxNotifyEvent { int status; int field; public: TurnEvent(int status, int field, wxEventType eventType = wxEVT_NULL, int id = 0); TurnEvent(const TurnEvent& copy); virtual ~TurnEvent(); virtual TurnEvent* Clone()const {return new TurnEvent(*this);}; };
Dir fehlt da z.B. noch die Clonemethode:
http://wxwidgets.org/manuals/stable/wx_wxevent.html#wxeventclone
-
Ach, das war nur ein Versuch. Es war folgendermaßen:
Bei dem ersten Test bin ich mit dem Debugger durch die sendMethode gegangen. Nachdem das Signal gesendet wurde, hat die Prozessorauslastung plötzlich rapide zugenommen, und nach ein paar Sekunden kam die VS Meldung, dass es einen Stacküberlauf gegeben hat!
Da dachte ich, ich versuchs mal mit new, da das ja dann auf dem Heap landet.Ich hab mal das Beispiel in der wxWidgetsDocu von Eventhadling Overview durchgemacht, aber es hat auch nicht gefunzt.
-
Kompilier doch einfach das Beispiel aus dem Tutorial, das müsste ja funktionieren.
Und deiner Eventklasse fehlt immer noch die Clonemethode.(siehe vorposting)
-
Ok, es läuft.
Ich hatte vergessen, die Daten im Konstruktor an den wxNotifyEvent Konstruktor weiterzuleiten.
Danke für deine Gedult und deine Hilfe.
Mfg