Form2 aus Form1 aufrufen



  • Hey
    Ich arbeite mit wxWidgets. Dort habe ich ein wxMenuItem. Wenn ich auf dieses klicke, soll ein weiteres Fenster aufgehen. Hab schon echt viele Möglichkeiten durchgearbeitet, doch ich schaffe es nicht.

    #include "PersonEintragen.h"
    
    void MDIView::OnNewSelection( wxCommandEvent& event )
    {
    	PersonEintragen *person = new PersonEintragen();
    	person->Show();
    }
    

    Was mache ich falsch?



  • Von welcher/welchen Klassen erbt denn PersonEintragen ? Das wird ja wohl eine selbst geschriebene Klasse sein und da diese hier niemand kennt (ohne das du den Code hinzufügst) wirds auch mit einer vernünftigen Antwort schwierig.



  • Sieht zur Zeit so aus

    PersonEintragen.cpp

    #include "PersonEintragen.h"
    
    PersonEintragen::PersonEintragen( wxDocument* doc, wxView *view, wxDocMDIParentFrame* parent )
    :
    PersonEintragenGUI( doc, view, parent )
    {
    
    }
    
    struct adresse
    {
    	wxString name[30];
    	wxString vorname[30];
    	wxString strasse[30];
    	wxString plz[30];
    	wxString ort[30];
    	wxString land[30];
    	wxString telefon[30];
    	wxString email[30];
    	wxString position;
    	wxString verein;
    };
    

    PersonEintragen.h

    #ifndef __PersonEintragen__
    #define __PersonEintragen__
    
    /**
    @file
    Subclass of PersonEintragenGUI, which is generated by wxFormBuilder.
    */
    
    #include "wxGUI.h"
    
    /** Implementing PersonEintragenGUI */
    class PersonEintragen : public PersonEintragenGUI
    {
    protected:
    	// Handlers for PersonEintragenGUI events.
    	void OnTextName( wxCommandEvent& event );
    	void OnTextVorname( wxCommandEvent& event );
    	void OnTextStrasse( wxCommandEvent& event );
    	void OnTextPLZ( wxCommandEvent& event );
    	void OnTextOrt( wxCommandEvent& event );
    	void OnTextTelnr( wxCommandEvent& event );
    	void OnTextEmail( wxCommandEvent& event );
    	void OnTextLand( wxCommandEvent& event );
    	void OnChoiceVerein( wxCommandEvent& event );
    	void OnChoicePosition( wxCommandEvent& event );
    	void OnOKClick( wxCommandEvent& event );
    	void OnClearClick( wxCommandEvent& event );
    
    public:
    	/** Constructor */
    	PersonEintragen( wxDocument* doc, wxView *view, wxDocMDIParentFrame* parent );
    };
    
    #endif // __PersonEintragen__
    

    MDIView.cpp

    #include "MDIView.h"
    #include <wx/plotctrl/plotprnt.h>
    #include "PersonEintragen.h"
    
    IMPLEMENT_DYNAMIC_CLASS(MDIView, wxView)
    
    /****************************** Konstruktor  *******************************/
    MDIView::MDIView()
    {
    	doc = NULL;
    	kv = NULL;
    }
    MDIView::~MDIView()
    {
    }
    /************************** Ende des Konstruktors **************************/
    
    /******************* Funktionsmember MDIView::OnCreate *********************/
    bool MDIView::OnCreate (wxDocument* doc, long int flags)
    {
    	this ->doc = (MDIDoc*)doc;
    	kv = new ViewFormGUI (doc, this, wxGetApp().frame);
    	wxGetApp ().ConnectUUIDis(false);
    
    	/* UUI Connects */
    	//Connect( wxID_FILE_SOMETHING, wxEVT_UPDATE_UI, wxUpdateUIEventHandler( MDIView::UUIEna ) );
    
    	// Connect( kv->mnuDataNew->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MDIView::OnNewSelection ) );
    	Connect(wxID_NEWDATA, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MDIView::OnNewSelection ));
    
    	kv ->Show (true);
    	SetFrame (kv);
    	Activate (true);
    
    	return true;
    }
    /**************************** Ende des Funktion ****************************/
    
    void MDIView::OnNewSelection( wxCommandEvent& event )
    {
    	PersonEintragen *person = new PersonEintragen();
    	person->Show();
    }
    
    /******************* Funktionsmember MDIView::OnClose  *********************/
    bool MDIView::OnClose (bool termWindow)
    {
    	if ( !GetDocument () ->Close () )
    		return false;
    	SetFrame (NULL);
    	Activate (false);
    	if (termWindow)
    	{
    		delete kv;
    	}
    	wxGetApp ().ConnectUUIDis(true);
    	return true;
    }
    /**************************** Ende des Funktion ****************************/
    
    /******************** Funktionsmember MDIView::OnDraw **********************/
    void MDIView::OnDraw (wxDC* dc)
    {
    
    }
    /**************************** Ende des Funktion ****************************/
    
    /***************** Funktionsmember MDIView::UUIEna **********************/
    void MDIView::UUIEna( wxUpdateUIEvent& event )
    {
    	event.Enable (true);
    }	
    /**************************** Ende des Funktion ****************************/
    


  • AhnungsloserNewbie schrieb:

    Hey
    Ich arbeite mit wxWidgets. Dort habe ich ein wxMenuItem. Wenn ich auf dieses klicke, soll ein weiteres Fenster aufgehen. Hab schon echt viele Möglichkeiten durchgearbeitet, doch ich schaffe es nicht.

    #include "PersonEintragen.h"
    
    void MDIView::OnNewSelection( wxCommandEvent& event )
    {
    	PersonEintragen *person = new PersonEintragen();
    	person->Show();
    }
    

    Was mache ich falsch?

    Du schon wieder :P.

    Grundsätzlich ist der Ansatz richtig, birgt aber Gefahren.
    Erstmal erzeugst du hier ein Memory Leak, weil person nie gelöscht wird per delete.

    class PersonEintragen : public PersonEintragenGUI
    

    Was ist die Basisklasse von PersonEintragenGUI? wxDialog?



  • das mit dem memory leaks ist mir jetzt klar
    ich habs ohne pointer versucht, aber dann geht gar nichts mehr

    Basisklasse ist wxDialog, ja 😉



  • Der Fehler ist übrigens:
    No matching function for call to 'PersonEintragen::PersonEintragen();



  • Wie man in PersonEintragen.cpp sehen kann erwartet der Konstruktor (PersonEintragen::PersonEintragen) deiner Klasse drei Parameter.

    Aber du versuchst das Objekt ohne Parameter zu erstellen.



  • Habs gelöst. Hab ein falsches Fenster genommen, muss ein Dialog- Fenster sein. Dann funktionierte es.

    Danke für eure hilfe



  • Mich würde mal das Gesamt Projekt und Konzept interessieren, denn vieles hier schaut mir ein wenig sehr verschachtelt aus. Warum eine neue Klasse "PersonEintragen" wenn du eh schon eine (PersonEintragenGUI) hast?
    Arbeitest du mit einem FormDesigner? Wenn ja, dann würde ich keinen C++ Code generieren lassen sondern ein wxRC File.


Anmelden zum Antworten