Ein Header in merere Forms einbinden ??



  • Hallo Jockelx!

    Vielen Dank f├╝r den Hinweis! Ich habe es korrigiert. Hab mich fatal verschrieben! ­čÖé
    Das Problem ist allerdings noch nicht behoben. ­čÖé


  • Mod

    Mach nur eines von beidem, #pragma once oder die ifndef-Methode. Au├čerdem hat das #pragma once in deinen Form-Quelldateien nichts verloren. Dies zusammen mit deinem vorherigen Schreibfehler gesehen, macht es recht wahrscheinlich, dass das Problem irgendein anderer Schreib- oder Fl├╝chtigkeitsfehler ist. Ist das wirklich 1:1 der Code, der bei dir nicht funktioniert? Copy&Paste? Kann ja irgendwie nicht sein, denn die Form1 und Form2 sind identisch. Also hast du wahrscheinlich die Fehlerursache hier f├╝r das Forum herausgek├╝rzt. Reduziere deinen Code auf ein absolut minimales Beispiel, von dem du aber getestet hast, dass es gerade noch den Fehler zeigt. Dann zeig uns diesen Code. Wenn du Gl├╝ck hast, kommst du aber bereits beim Erstellen des Minimalbeispiels auf die L├Âsung, wenn du irgendetwas wegk├╝rzt und der Code dann pl├Âtzlich unerwarteterweise funktioniert.



  • Form1

    #include "meinPaket.h"
    #include "pch.h"
    
    namespace Frm1 {
    
    private: System::Void btn_1_Click(System::Object^ sender, System::EventArgs^ e) {
          Paket::loadForm();
      }
    

    Form2

    #include "meinPaket.h"
    #include "pch.h"
    
    namespace Frm2 {
    
    private: System::Void btn_2_Click(System::Object^ sender, System::EventArgs^ e) {
    		Paket::loadForm2();
    	}
    }
    

    meinPaket.h

    #pragma once
    #include "pch.h"
    
    namespace Paket
    {
    	using namespace std;
    	using namespace System;
    	using namespace System::Windows::Forms;
    
    	extern void loadForm()
    	{		
    	}
    	 extern void loadForm2()
    	{	
    	}
    }
    

    meinPaket.cpp

    #include "meinPaket.h"
    #include "Form1.h"
    #include "Form2.h"
    #include "pch.h"
    
    using namespace std;
    using namespace System;
    using namespace System::Windows::Forms;
    using namespace Paket;
    
    void loadForm()
    {
    	Frm2::Form2^ form = gcnew(Frm2::Form2);
    	form->ShowDialog();
    	delete form;
    }
    void loadForm2()
    {
    	Frm1::Form1^ form = gcnew(Frm1::Form1);
    	form->ShowDialog();
    	delete form;
    }
    

    Der einfach halber habe ich nur die Eventh├Ąndler Methoden hier eingef├╝gt. Der Rest wurde mit dem Designer gemacht. Paket::loadForm2() funktioniert nicht, aber das Programm l├Ąsst dich ausf├╝hren. Ich komme nach wie vor nicht darauf :(.


  • Mod

    @Gnaa77 sagte in [Ein Header in merere Forms einbinden ??](/forum

    Paket::loadForm2() funktioniert nicht, aber das Programm l├Ąsst dich ausf├╝hren.

    Woah, was? Was meinst du damit genau? Was funktioniert nicht und wie ├Ąu├čert sich das?

    PS: Ich kenne mich mit den precompiled Headern von VS nicht so aus, aber irgendwie habe ich aus anderen Threads hier im Hinterkopf, dass das Include vom PCH Header immer ganz vorne stehen muss. Kann das jemand kommentieren, der sich damit auskennt?



  • Das passt zwar nicht zu deiner Fehlermeldung, aber dass du loadForm zwei mal definierst, ist schon mal falsch
    (Im Header durch {} und im cpp wird die Funktion definiert). loadForm2 genauso.
    Das extern brauchst du auch nicht.



  • Also erstmal zu SeppJ! Die Funktion kann irgendwie nicht funktionieren! Das war unlogisch. Da sie ja nicht geschlossen wurde, kann ich sie ja nicht ├Âffnen. Ich habe sie durch diese ersetzt. Die Pch.h ist leer da ist nichts drin. Aber guter Tipp mit der pch.h, damit hab ich mich noch nicht besch├Ąftigt :).

    void test(TextBox^ a)
    {
    	a->AppendText("Huhu");
    }
    

    funzt ebenfalls nicht.

    Nun zu Jocklx, nein es sind zwei verschiedene. LoadForm und LoadForm2. Beide definiert in cpp und deklariert mit {} in der Header.



  • Die Fehlerliste ist ziemlich lang und es handelt sich um Fehler wie ; fehlt, obwohl es da ist usw.

    Schweregrad Code Beschreibung Projekt Datei Zeile Unterdr├╝ckungszustand
    Fehler C2059 Syntaxfehler: ";" Test_Gui F:\C++Programmierer\C++_Projekte\Test_Gui\meinPaket.cpp 15
    Fehler C2059 Syntaxfehler: ";" Test_Gui F:\C++Programmierer\C++_Projekte\Test_Gui\meinPaket.cpp 22
    Fehler C2871 "Paket": Es ist kein Namespace mit diesem Namen vorhanden Test_Gui F:\C++Programmierer\C++_Projekte\Test_Gui\meinPaket.cpp 10
    Fehler C2653 "Frm2": Keine Klasse oder Namespace Test_Gui F:\C++Programmierer\C++_Projekte\Test_Gui\meinPaket.cpp 15
    Fehler C2653 "Frm2": Keine Klasse oder Namespace Test_Gui F:\C++Programmierer\C++_Projekte\Test_Gui\meinPaket.cpp 15
    Fehler C2653 "Frm1": Keine Klasse oder Namespace Test_Gui F:\C++Programmierer\C++_Projekte\Test_Gui\meinPaket.cpp 22
    Fehler C2653 "Frm1": Keine Klasse oder Namespace Test_Gui F:\C++Programmierer\C++_Projekte\Test_Gui\meinPaket.cpp 22
    Fehler C2065 "Form2": nichtdeklarierter Bezeichner Test_Gui F:\C++Programmierer\C++_Projekte\Test_Gui\meinPaket.cpp 15
    Fehler C2065 "Form2": nichtdeklarierter Bezeichner Test_Gui F:\C++Programmierer\C++_Projekte\Test_Gui\meinPaket.cpp 15
    Fehler C2065 "Form1": nichtdeklarierter Bezeichner Test_Gui F:\C++Programmierer\C++_Projekte\Test_Gui\meinPaket.cpp 22
    Fehler C2065 "Form1": nichtdeklarierter Bezeichner Test_Gui F:\C++Programmierer\C++_Projekte\Test_Gui\meinPaket.cpp 22
    Fehler C2065 "form": nichtdeklarierter Bezeichner Test_Gui F:\C++Programmierer\C++_Projekte\Test_Gui\meinPaket.cpp 15
    Fehler C2065 "form": nichtdeklarierter Bezeichner Test_Gui F:\C++Programmierer\C++_Projekte\Test_Gui\meinPaket.cpp 16
    Fehler C2065 "form": nichtdeklarierter Bezeichner Test_Gui F:\C++Programmierer\C++_Projekte\Test_Gui\meinPaket.cpp 17
    Fehler C2065 "form": nichtdeklarierter Bezeichner Test_Gui F:\C++Programmierer\C++_Projekte\Test_Gui\meinPaket.cpp 22
    Fehler C2065 "form": nichtdeklarierter Bezeichner Test_Gui F:\C++Programmierer\C++_Projekte\Test_Gui\meinPaket.cpp 23
    Fehler C2065 "form": nichtdeklarierter Bezeichner Test_Gui F:\C++Programmierer\C++_Projekte\Test_Gui\meinPaket.cpp 24
    Fehler C2541 "delete": Objekte, die keine Zeiger sind, k├Ânnen nicht gel├Âscht werden Test_Gui F:\C++Programmierer\C++_Projekte\Test_Gui\meinPaket.cpp 17
    Fehler C2541 "delete": Objekte, die keine Zeiger sind, k├Ânnen nicht gel├Âscht werden Test_Gui F:\C++Programmierer\C++_Projekte\Test_Gui\meinPaket.cpp 24



  • Tue dir selbst einen Gefallen und verwende C#, falls du bei WinForms bleiben willst, s. Windows Forms und Visual C++ MACHT KEINEN SINN!!

    Oder alternativ verwende natives C++ mit einem dazu passenden UI-Framework (wie z.B. Qt oder ImGui).

    Du solltest zuerst aber die Basics der Sprache (egal ob C++ oder C#) anhand von Konsolenprogrammen lernen, bevor du dich mit GUI besch├Ąftigst.


  • Mod

    @Gnaa77 sagte in Ein Header in merere Forms einbinden ??:

    Also erstmal zu SeppJ! Die Funktion kann irgendwie nicht funktionieren! Das war unlogisch. Da sie ja nicht geschlossen wurde, kann ich sie ja nicht ├Âffnen. Ich habe sie durch diese ersetzt. Die Pch.h ist leer da ist nichts drin. Aber guter Tipp mit der pch.h, damit hab ich mich noch nicht besch├Ąftigt :).

    Es geht nicht darum, was da drin steht. Dieser Header dient als eine Art Markierung ab wo die Compilierung los gehen soll. Das soll meistens halt ganz vorne sein, au├čer man hat irgendwelche Sonderbed├╝rfnisse und wei├č was man da tut. Oder man schaltet Precompiled Header besser ab, wenn man ├╝berhaupt keine Ahnung hat, was man da tut. PCH ist sowieso nur f├╝r Projekte mit tausenden Dateien relevant.

    @Gnaa77 sagte in Ein Header in merere Forms einbinden ??:

    Nun zu Jocklx, nein es sind zwei verschiedene. LoadForm und LoadForm2. Beide definiert in cpp und deklariert mit {} in der Header.

    Bitte tu unsere Ratschl├Ąge nicht einfach ab, ohne sie genau zu lesen und ├╝ber sie nachzudenken! Was meinst du warum Jockelx im n├Ąchsten Satz "loadForm2 genauso." geschrieben hat? Wir wissen schon, was wir warum sagen (nun ja, meistens jedenfalls ­čÖé ). Dein Code:

    	extern void loadForm()
    	{		
    	}
    	 extern void loadForm2()
    	{	
    	}
    
    ....
    void loadForm()
    {
    	Frm2::Form2^ form = gcnew(Frm2::Form2);
    	form->ShowDialog();
    	delete form;
    }
    void loadForm2()
    {
    	Frm1::Form1^ form = gcnew(Frm1::Form1);
    	form->ShowDialog();
    	delete form;
    }
    

    Bist du immer noch der Meinung, dass du da nichts doppelt definiert hast?


  • Mod

    @Gnaa77 sagte in Ein Header in merere Forms einbinden ??:

    Fehler C2059 Syntaxfehler: ";" Test_Gui F:\C++Programmierer\C++_Projekte\Test_Gui\meinPaket.cpp 15
    Fehler C2059 Syntaxfehler: ";" Test_Gui F:\C++Programmierer\C++_Projekte\Test_Gui\meinPaket.cpp 22

    Das w├Ąren oben im gezeigten Code

    delete form;
    

    und

    }
    

    .

    Zweifel.

    Ich verweise noch einmal auf die Notwendigkeit, uns den exakten Code zu zeigen, der den Fehler verursacht. Nicht das, was du denkst, was den Fehler verursacht. Denn wenn du das schon w├╝sstest, br├Ąuchtest du ja nicht mehr fragen.

    Anleitung aus dem C++-Forum, die auch auf C++/CLI ├╝bertragbar ist:
    https://www.c-plusplus.net/forum/topic/200753/bitte-lesen-du-brauchst-hilfe
    Besonders der zweite Teil, "Wie man Probleme nachstellbar und nachvollziehbar macht", denn da hakt es gerade.

    Die restlichen Fehlermeldungen kannst du erst einmal vergessen. Wenn der Compiler diese omin├Âsen Zeilen 15 und 22 nicht verstehen konnte, dann ist er danach total durcheinander und gibt evtl. jede Menge Fehldiagnosen, z.B. wenn in diesen Zeilen wichtige Definitionen standen. Meistens ist daher nur der erste Fehler in so einer Liste relevant.



  • @SeppJ
    Ich gebe dir recht! Ich Honk .



  • Dank eurer Denkanst├Â├če habe ich es geschafft, das Problem zu l├Âsen! Als Erstes habe ich die Vorkompilierten Header abgeschaltet und die Pch.h include entfernt. Dadurch waren die Fehlermeldungen verschwunden, aber die Methoden funktionierten noch nicht. Da habe ich die Incldudes in die Cpp Datei kopiert und v├Âllig aus der Header entfernt! In den Form1 und Form 2 steht nur noch meineForm.h. Alles l├Ąuft jetzt wie geplant. Ich gebe dennoch den Quellcode bekannt f├╝r andere, die demselben Problem gegen├╝berstehen.

    Form1

    #include "meinPaket.h"
    
    
    namespace Frm1 {
    
      using namespace System;
      using namespace System::ComponentModel;
      using namespace System::Collections;
      using namespace System::Windows::Forms;
      using namespace System::Data;
      using namespace System::Drawing;
    
      
      public ref class Form1 : public System::Windows::Forms::Form
      {
      public:
        Form1(void)
        {
          InitializeComponent();
        }
    
      protected:   
        ~Form1()
        {
          if (components)
          {
            delete components;
          }
        }
      private: System::Windows::Forms::Button^ btn_1;
      private: System::Windows::Forms::TextBox^ tb1;
    
      private:
        System::ComponentModel::Container^ components;
    
    #pragma region Windows Form Designer generated code    
        void InitializeComponent(void)
        {
            this->btn_1 = (gcnew System::Windows::Forms::Button());
            this->tb1 = (gcnew System::Windows::Forms::TextBox());
            this->SuspendLayout();
            // 
            // btn_1
            // 
            this->btn_1->Location = System::Drawing::Point(89, 80);
            this->btn_1->Name = L"btn_1";
            this->btn_1->Size = System::Drawing::Size(75, 23);
            this->btn_1->TabIndex = 0;
            this->btn_1->Text = L"button1";
            this->btn_1->UseVisualStyleBackColor = true;
            this->btn_1->Click += gcnew System::EventHandler(this, &Form1::btn_1_Click);
            // 
            // tb1
            // 
            this->tb1->Location = System::Drawing::Point(111, 171);
            this->tb1->Name = L"tb1";
            this->tb1->Size = System::Drawing::Size(100, 20);
            this->tb1->TabIndex = 1;
            // 
            // Form1
            // 
            this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
            this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
            this->ClientSize = System::Drawing::Size(284, 261);
            this->Controls->Add(this->tb1);
            this->Controls->Add(this->btn_1);
            this->Name = L"Form1";
            this->Text = L"Form1";
            this->ResumeLayout(false);
            this->PerformLayout();
    
        }
      private: System::Void btn_1_Click(System::Object^ sender, System::EventArgs^ e) {
          Paket::loadForm();
          Paket::test(tb1);
      }
      }; // end of class Form1
    } // end of namespace Frm1
    

    Form2

    #include "meinPaket.h"
    
    
    namespace Frm2 {
    
    	using namespace System;
    	using namespace System::ComponentModel;
    	using namespace System::Collections;
    	using namespace System::Windows::Forms;
    	using namespace System::Data;
    	using namespace System::Drawing;
    
    	
    	public ref class Form2 : public System::Windows::Forms::Form
    	{
    	public:
    		Form2(void)
    		{
    			InitializeComponent();
    			
    		}
    
    	protected:
    	
    		~Form2()
    		{
    			if (components)
    			{
    				delete components;
    			}
    		}
    	private: System::Windows::Forms::Button^ btn_2;
    	private: System::Windows::Forms::TextBox^ tb2;
    
    	private:
    		
    		System::ComponentModel::Container ^components;
    
    #pragma region Windows Form Designer generated code
    		
    		void InitializeComponent(void)
    		{
    			this->btn_2 = (gcnew System::Windows::Forms::Button());
    			this->tb2 = (gcnew System::Windows::Forms::TextBox());
    			this->SuspendLayout();
    			// 
    			// btn_2
    			// 
    			this->btn_2->Location = System::Drawing::Point(95, 120);
    			this->btn_2->Name = L"btn_2";
    			this->btn_2->Size = System::Drawing::Size(75, 23);
    			this->btn_2->TabIndex = 0;
    			this->btn_2->Text = L"button1";
    			this->btn_2->UseVisualStyleBackColor = true;
    			this->btn_2->Click += gcnew System::EventHandler(this, &Form2::btn_2_Click);
    			// 
    			// tb2
    			// 
    			this->tb2->Location = System::Drawing::Point(104, 219);
    			this->tb2->Name = L"tb2";
    			this->tb2->Size = System::Drawing::Size(100, 20);
    			this->tb2->TabIndex = 1;
    			// 
    			// Form2
    			// 
    			this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
    			this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
    			this->ClientSize = System::Drawing::Size(284, 261);
    			this->Controls->Add(this->tb2);
    			this->Controls->Add(this->btn_2);
    			this->Name = L"Form2";
    			this->Text = L"Form2";
    			this->ResumeLayout(false);
    			this->PerformLayout();
    
    		}
    #pragma endregion
    	private: System::Void btn_2_Click(System::Object^ sender, System::EventArgs^ e) {
    		tb2->AppendText(Paket::pForm(this).ToString() + "\r\n");
    		
    	}
    	};
    }
    

    meinPaket.h

    #pragma once
    
    
    namespace Paket
    {
    	using namespace std;
    	using namespace System;
    	using namespace System::Windows::Forms;
    
    	void loadForm();
    	void loadForm2();
    	int pForm(Form^ form);
    	void test(TextBox^ a);
    }
    

    meinPaket.cpp

    #include "meinPaket.h"
    #include "Form1.h"
    #include "Form2.h"
    
    
    using namespace std;
    using namespace System;
    using namespace System::Windows::Forms;
    using namespace Paket;
    
    
    void Paket::loadForm()
    {
    	Frm2::Form2^ form = gcnew(Frm2::Form2);
    	form->ShowDialog();
    	delete form;	
    }
    //void Paket::loadForm2()
    //{
    //	Frm1::Form1^ form = gcnew(Frm1::Form1);
    //	form->ShowDialog();
    //	delete form;
    //}
    
    void Paket::test(TextBox^ a)
    {
    	a->AppendText("Huhu\r\n");
    }
    
    int Paket::pForm(Form^ form)
    {
    	int a = form->Width;
    	return a;
    }
    
    

    So, das ist alles :). Ich hoffe, das wird so gemacht! Es funzt auf jeden Fall :). F├╝r Kritik und Erkl├Ąrungen bin ich gerne dankbar.


Log in to reply