wxWidgets: vector zwischen Fenstern versenden
-
Hi,
zuerst erkläre ich am besten die Ausgangssituation:
Ich habe ein Hauptfenster, aus dem ich durch einen Button ein kleines neues Fenster starte.
In diesem neuen Fenster werden verschiedene Aktionen ausgeführt. Zum Schluss wird ein string vector befüllt. Diese Strings benötige ich nun im Hauptfenster.Nun zu meiner Frage: Gibt es in wxWidgets einen Weg, den vector direkt an das Hauptfenster zu senden?
Falls nicht, hab ich mir folgenden Umweg zur Lösung ausgedacht:
Wenn das kleine Fenster fertig ist, soll es ein benutzerdefiniertes Signal senden.
Daraufhin macht das Hautfenster ://in einer SignalHandlerMethode: vector <string> vec; vec = smallWindow->returnStrings(vec);//smallWindow ist das Object für das neue Fenster! //der Vector von smallWindow ist bereits mit strings befüllt, und schreibt diese nun in den Übergebenen
Mfg
-
Gibt verschiedene Wege.
Einmal kannst du deinen eigene Eventklasse implementieren, was hier sicherlich auch sinnvoll ist, der dann als Member einen vector mit den Strings hat.
Alternativ könntest du natürlich irgendwelche Übergabefunktionen machen, oder falls das Fenster nur sachen in den Vector hinzufügt,
evtl. dem Fenster einfach nur eine Referenz auf den zu füllenden Vector geben, wobei du hier wohl auch einen Event für das Updaten der Ansicht im Hauptfenster bräuchtest.phlox
-
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