WXFormBuilder und Visual Studio 2019 Tutorial?



  • Hab jetzt mal neue noname.cpp und noname.h erstellt und den Text hineinkopiert und die alten gelöscht.
    Hier mein Output Teil

    1>------ Erstellen gestartet: Projekt: WinInfosC++, Konfiguration: Debug Win32 ------
    1>MainWindow.cpp
    1>C:\wxWidgets-3.1.4\include\wx\chkconf.h(88,1): fatal error C1189: #error:  "wxUSE_ANY must be defined, please read comment near the top of this file."
    1>noname.cpp
    1>C:\wxWidgets-3.1.4\include\wx\chkconf.h(88,1): fatal error C1189: #error:  "wxUSE_ANY must be defined, please read comment near the top of this file."
    1>Code wird generiert...
    1>Die Erstellung des Projekts "WinInfosC++.vcxproj" ist abgeschlossen -- FEHLER.
    ========== Erstellen: 0 erfolgreich, 1 fehlerhaft, 0 aktuell, 0 übersprungen ==========
    
    


  • @humbidu sagte in WXFormBuilder und Visual Studio 2019 Tutorial?:

    read comment near the top of this file



  • Das habe ich gemacht, doch verstehe ich nicht warum? Habe das ganze doch heute erst erstellt. Damit dürfte die Setup.h doch aktuell sein?

    Soll ich die jetzt einfach löschen und neu kompilieren?



  • @humbidu Hast du mal eins der Samples kompiliert? Das ist erstmal ein guter Startpunkt ob wxWidgets insgesamt ordentlich kompiliert ist und funktioniert.

    Insgesamt klingt das für mich nach wie vor als ob wxWidgets nicht richtig in dein Projekt eingebunden ist. Hast du die wxwidgets.propsimportiert?



  • Habe jetzt zu Hause an meinem Rechner, das gleiche nochmal eingefügt. Jetzt sind die oben genannten Fehler verschwunden, allerdings bekomme ich beim kompilieren folgende Meldung:

    1>------ Erstellen gestartet: Projekt: WXWidgetsTest, Konfiguration: Debug Win32 ------
    1>MainWindow.cpp
    1>C:\Users\User\source\repos\WXWidgetsTest\MainWindow.h(13,18): error C2065: "noname": nichtdeklarierter Bezeichner
    1>C:\Users\User\source\repos\WXWidgetsTest\MainWindow.h(13,7): error C2923: "std::shared_ptr": "noname" ist kein gültiges Vorlage-Typargument für den _Ty-Parameter.
    1>C:\Users\User\source\repos\WXWidgetsTest\MainWindow.cpp(6,16): error C2672: "std::make_shared": keine übereinstimmende überladene Funktion gefunden
    1>C:\Users\User\source\repos\WXWidgetsTest\MainWindow.cpp(6,36): error C2974: "std::make_shared": Ungültiges Vorlage-Argument für "_Ty", Typ erwartet.
    1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.27.29110\include\memory(2071): message : Siehe Deklaration von "std::make_shared"
    1>C:\Users\User\source\repos\WXWidgetsTest\MainWindow.cpp(7,2): error C2065: "nonmae": nichtdeklarierter Bezeichner
    1>Die Erstellung des Projekts "WXWidgetsTest.vcxproj" ist abgeschlossen -- FEHLER.
    ========== Erstellen: 0 erfolgreich, 1 fehlerhaft, 0 aktuell, 0 übersprungen ==========
    
    


  • was mit deiner nonamekaputt ist, können wir dir erst sagen, wenn du uns den entsprechenden code zeigst. Das scheint es so nicht zu geben.
    Für den shared_ptr fehlt der include include <memory>.



  • Die noname.cpp und noname.h Datei ist die, welcher mit der WxFormBuilder ausgespuckt hat.
    Hier die noname.cpp

    ///////////////////////////////////////////////////////////////////////////
    // C++ code generated with wxFormBuilder (version Oct 26 2018)
    // http://www.wxformbuilder.org/
    //
    // PLEASE DO *NOT* EDIT THIS FILE!
    ///////////////////////////////////////////////////////////////////////////
    
    #include "noname.h"
    
    ///////////////////////////////////////////////////////////////////////////
    
    MyFrame1::MyFrame1(wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style) : wxFrame(parent, id, title, pos, size, style)
    {
    	this->SetSizeHints(wxDefaultSize, wxDefaultSize);
    
    	wxBoxSizer* bSizer1;
    	bSizer1 = new wxBoxSizer(wxVERTICAL);
    
    	m_textCtrl1 = new wxTextCtrl(this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0);
    	bSizer1->Add(m_textCtrl1, 0, wxALL, 5);
    
    	m_textCtrl2 = new wxTextCtrl(this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0);
    	bSizer1->Add(m_textCtrl2, 0, wxALL, 5);
    
    	m_textCtrl3 = new wxTextCtrl(this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0);
    	bSizer1->Add(m_textCtrl3, 0, wxALL, 5);
    
    	m_textCtrl4 = new wxTextCtrl(this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0);
    	bSizer1->Add(m_textCtrl4, 0, wxALL, 5);
    
    	m_textCtrl5 = new wxTextCtrl(this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0);
    	bSizer1->Add(m_textCtrl5, 0, wxALL, 5);
    
    
    	this->SetSizer(bSizer1);
    	this->Layout();
    
    	this->Centre(wxBOTH);
    }
    
    MyFrame1::~MyFrame1()
    {
    }
    
    

    und hier die noname.h

    ///////////////////////////////////////////////////////////////////////////
    // C++ code generated with wxFormBuilder (version Oct 26 2018)
    // http://www.wxformbuilder.org/
    //
    // PLEASE DO *NOT* EDIT THIS FILE!
    ///////////////////////////////////////////////////////////////////////////
    
    #pragma once
    
    #include <wx/artprov.h>
    #include <wx/xrc/xmlres.h>
    #include <wx/string.h>
    #include <wx/textctrl.h>
    #include <wx/gdicmn.h>
    #include <wx/font.h>
    #include <wx/colour.h>
    #include <wx/settings.h>
    #include <wx/sizer.h>
    #include <wx/frame.h>
    
    ///////////////////////////////////////////////////////////////////////////
    
    
    ///////////////////////////////////////////////////////////////////////////////
    /// Class MyFrame1
    ///////////////////////////////////////////////////////////////////////////////
    class MyFrame1 : public wxFrame
    {
    private:
    
    protected:
    	wxTextCtrl* m_textCtrl1;
    	wxTextCtrl* m_textCtrl2;
    	wxTextCtrl* m_textCtrl3;
    	wxTextCtrl* m_textCtrl4;
    	wxTextCtrl* m_textCtrl5;
    
    public:
    
    	MyFrame1(wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize(500, 300), long style = wxDEFAULT_FRAME_STYLE | wxTAB_TRAVERSAL);
    
    	~MyFrame1();
    
    };
    
    
    
    #include <memory> 
    

    habe ich eingefügt, doch die Ausgabe ist die gleich wie oben beim kompilieren



  • Deine Klasse heißt ja auch nicht nonamesondern MyFrame1

    Also änder mal alle <noname>in <MyFrame1>.

    Im FormBuilder kannst du bestimmt auch die Dateinamen ändern, das klingt mir sehr nach einem unbenannten Projekt oder so was.



  • @humbidu sagte in WXFormBuilder und Visual Studio 2019 Tutorial?:

    noname = std::make_shared<noname>();
    
    std::shared_ptr<noname> noname;
    

    Da passen die Bezeichner aber nicht. Man kann nicht für den Typen und den Variablennamen denselben Bezeichner benutzen. Sollte da nicht MyFrame1 als Typ stehen?

    PS: Und woher kommen die Falschschreibungen #include "nomame.h" und nonmae ->Show();? Ist das wirklich der generierte Code oder hast du den hier für's Forum verändert?



  • @Th69
    Das mit den Typen habe ich verändert.

    Wegen den unterschiedlichen Schreibweisen. Mein Tutorial wo ich hatte, nahm andere Namen (da hieß es editor) und beim Umschreiben habe ich mich vertippt.

    Die Meldungen sind alle weg, jetzt bekomme ich nur noch die Meldung:

    1>------ Erstellen gestartet: Projekt: WXWidgetsTest, Konfiguration: Debug Win32 ------
    1>MainWindow.cpp
    1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.27.29110\include\xmemory(230,12): error C2512: "MyFrame1::MyFrame1": Kein geeigneter Standardkonstruktor verfügbar
    1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.27.29110\include\memory(1427): message : Siehe Verweis auf die gerade kompilierte Instanziierung "void std::_Construct_in_place<_Ty,>(_Ty &) noexcept(false)" der Funktions-Vorlage.
    1>        with
    1>        [
    1>            _Ty=MyFrame1
    1>        ]
    1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.27.29110\include\memory(2071): message : Siehe Verweis auf die gerade kompilierte Instanziierung "std::_Ref_count_obj2<_Ty>::_Ref_count_obj2<>(void)" der Funktions-Vorlage.
    1>        with
    1>        [
    1>            _Ty=MyFrame1
    1>        ]
    1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.27.29110\include\memory(2072): message : Siehe Verweis auf die gerade kompilierte Instanziierung "std::_Ref_count_obj2<_Ty>::_Ref_count_obj2<>(void)" der Funktions-Vorlage.
    1>        with
    1>        [
    1>            _Ty=MyFrame1
    1>        ]
    1>C:\Users\User\source\repos\WXWidgetsTest\MainWindow.cpp(7): message : Siehe Verweis auf die gerade kompilierte Instanziierung "std::shared_ptr<MyFrame1> std::make_shared<MyFrame1,>(void)" der Funktions-Vorlage.
    1>Die Erstellung des Projekts "WXWidgetsTest.vcxproj" ist abgeschlossen -- FEHLER.
    ========== Erstellen: 0 erfolgreich, 1 fehlerhaft, 0 aktuell, 0 übersprungen ==========
    
    


  • @humbidu MyFrame1erwartet einen Pointer auf ein Parent Fenster. Wenn das ein Toplevel Window ist kannst du

    std::make_shared<noname>(nullptr);
    

    verwenden. Die anderen Parameter haben einen Default Wert.
    Mich beschleicht das Gefühl, dass du noch nicht genug Ahnung von c++ hast um sinnvoll Oberflächenprogrammierung zu betreiben.

    Edit: Woher hast du die Idee mit dem shared_ptr? Prinzipiell ist es zwar richtig nicht mit rohen besitzenden Pointern zu arbeiten, aber wxWidgets sorgt eigentlich dafür, dass es die Fenster richtig aufräumt (solange die Parent struktur stimmt).

    Daher eigentlich:

    noname = new MyFrame1(nullptr);
    noname->Show(true);
    

    und

    private:
    	MyFrame1* noname;
    


  • @Schlangenmensch
    Die Idee habe ich von hier:
    https://developer-blog.net/wxwidgets-mit-c-teil-1/

    Habe das ganze mal nach deiner Methode gemacht und bekomme jetzt die Meldung:

    1>------ Erstellen gestartet: Projekt: WXWidgetsTest, Konfiguration: Debug Win32 ------
    1>MainWindow.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: __thiscall MainWindow::MainWindow(void)" (??0MainWindow@@QAE@XZ)" in Funktion ""class wxAppConsole * __cdecl wxCreateApp(void)" (?wxCreateApp@@YAPAVwxAppConsole@@XZ)".
    1>C:\Users\User\source\repos\WXWidgetsTest\Debug\WXWidgetsTest.exe : fatal error LNK1120: 1 nicht aufgelöste Externe
    1>Die Erstellung des Projekts "WXWidgetsTest.vcxproj" ist abgeschlossen -- FEHLER.
    ========== Erstellen: 0 erfolgreich, 1 fehlerhaft, 0 aktuell, 0 übersprungen ==========
    
    

    Allerdings sind die Libs richtig verknüpft und unter Subsystem habe ich Windows ausgewählt



  • @humbidu Der Link geht nicht.

    Das heißt jetzt kompiliert es, jetzt beschwert sich noch der Linker. Das klingt so, als ob die Pfade zu den Libraries falsch sind / die Projektkonfigs nicht stimmen.



  • Hab die Pfade nochmals kopiert, hatte ein "c" vergessen, aber nun bekomme ich diese folgende Meldung:

    1>------ Erstellen gestartet: Projekt: WXWidgetsTest, Konfiguration: Debug Win32 ------
    1>LINK : fatal error LNK1104: Datei "wxbase31ud.lib" kann nicht geöffnet werden.
    1>Die Erstellung des Projekts "WXWidgetsTest.vcxproj" ist abgeschlossen -- FEHLER.
    ========== Erstellen: 0 erfolgreich, 1 fehlerhaft, 0 aktuell, 0 übersprungen ==========
    
    

    PS: Der richtige Link:
    https://developer-blog.net/wxwidgets-mit-c-teil-2/



  • @humbidu Da wird die wxWidgets lib nicht gefunden. Steht doch im Prinzip da. Wenn du die wxwidgets.props importiert hast, wunder mich das aber etwas.

    Es kann sein, dass die nach einer Umgebungsvariable auflöst, die nicht gesetzt wurde.

    Überprüf doch mal was in den "Projekteigenschaften -> Linker -> Zusätzliche Bibliotheksverzeichnisse" was da als Pfad zu den wxWidgets Libs steht.

    Edit: In dem Tutorial steht, dass man für die Verwendung von Smartpointern im Zusammenhang mit wxWidgtes den delete operator überschreiben muss. Das ist etwas von dem ich dringend abrate. Denn hinterher will man für richtige Pointer Smartpointer nutzen und dann arbeiten die nicht mehr wie erwartet. Aber es steht da und hättest du dich an das Tutorial gehalten, hätte es funktioniert.



  • @Schlangenmensch sagte in WXFormBuilder und Visual Studio 2019 Tutorial?:

    Libs

    Habe jetzt die libs neu kompiliert aber immer noch bekomme ich die Fehlermeldung.
    Habe die Umgebungsvariablen auch angeschaut und lösen richtig auf (kann man ja gut überprüfen).



  • Ein anderes Projekt wurde richtig kompiliert und nun habe ich mal alle Einstellungen mit diesem abgeglichen, doch das neue bringt weiterhin den Fehler.



  • @humbidu joa, du könntest versuchen den Pfad zu der lib manuell hinzuzufügen. Aber irgendwas stimmt in deinem Setting nicht, aber das ist via Ferndiagnose so nicht feststellbar.



  • Warum es nicht ging weiß ich immer noch nicht, der Pfad usw. stimmte. Habe das andere Projekt welches funktioniert, einfach den Code aus dem neuen eingefügt und damit funktioniert es ja.



  • @humbidu Hast Du bedacht daß es mindestens 4 verschiedene Konfigurationen gibt (debug x86, debug x64, release x86 und release x64) und alle ihr eigenes Set Einstellungen haben?


Anmelden zum Antworten