Ein Header in merere Forms einbinden ??



  • Hallo!

    Ich bin recht neu in der Programmierung und versuche mich derzeit in Windows Form.
    Viele Problemchen konnte ich lösen, nur eines macht mir seit längerem zu schaffen!

    Es geht darum das ich es nicht schaffe ohne Fehlermeldungen ein paar Methoden, die in dem Header 'meinem.h' liegen,
    in eine zweite Form 'Form2' zu inkludieren. Wenn ich das in die erste Form 'Form1' inkludiere, dann läuft alles super. Sobald ich das in die zweite übernehme, sagt der VS2022 mir das er den Namespace nicht kennt und der Bezeichner der Methode wurde nicht gefunden. Das Inkludieren gibt noch keinen Fehler erst, wenn ich die Methode aktiviere.

    'meinem.h'

    #pragma once
    #ifndef MEINEM_H
    #define MEINEM_H
    
    #include <limits.h>
    #include <cctype>
    #include <iostream>
    #include "pch.h"
    
    namespace eins
    {
    void meineMethode()
    {
          funzt in Form1 :)
    }
    }
    #endif // !MEINEM_H
    

    'Form1'

    #pragma once
    
    #include "pch.h"
    #include "meinem.h"
    
    private: System::Void btn_meiner_Click(System::Object^ sender, System::EventArgs^ e) {
          eins::meineMethode();
      }
    

    'Form2'

    #pragma once
    
    #include "pch.h"
    #include "meinem.h"
    
    private: System::Void btn_meiner_Click(System::Object^ sender, System::EventArgs^ e) {
          eins::meineMethode();
      }
    

    Ich habe es mal abgekürzt, da ich nichts im Konstruktor verändert habe! Also nur Standard Werte:).

    Die Fehlermeldungen lauten!

    Fehler C2653 "eins": Keine Klasse oder Namespace. Form2

    Fehler C3861 "meine Methode": Bezeichner wurde nicht gefunden. Form2

    Ich möchte darauf hinweisen, dass ich ein Anfänger bin und das als Hobby mache! Also bitte ich darum, den Code so einfach und vor allem erklärend zu formulieren!!! 🙂 Vielen Dank schon mal im Voraus.



  • Hallo,

    das

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

    #ifndef MAIN_HEAD_H

    passt nicht wirklich zu deinem Header-Namen. Kann es sein, dass du das MAIN_HEAD_H nochmal in einer anderen Header-datei definierst und du diese in Form2 inkludierst?
    Du solltest das aber sowieso entfernen oder das #pragma once. Jedenfalls nicht beides nutzen.



  • 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.


Anmelden zum Antworten