Formularnamensraum problem



  • Hallo ihr,

    Was tue ich wenn ich zwei Formulare habe.
    Auf jedem der beiden Formulare befindet sich ein Button.
    Wenn ich auf den Button des einen Formulares klicke, soll eine Inztanz des anderen erstellt und angezeigt werden.

    Das selbe soll fuer das andere Formular jedoch auch passieren.
    Ich muss jetzt Form1.h in Form2.h einbinden und Form2.h in Form1.h.

    Allerdings bekomme ich den Fehler:

    Fehler 1 error C2039: 'Form1': Ist kein Element von 'Form2' c:\documents and settings\user\my documents\visual studio 2008\projects\includieren\includieren\frmincludieren.h 61

    Es scheint also ein Namensraumproblem zu geben.
    Und vor allem muesste es auch eine Includeschleife oder sowas geben...

    Wie kann ich das Problem loesen?

    cya
    Davidδ





  • Hat es - danke 😉



  • Also ich habe auf meiner Suche durch das Forum und google nach einigem Herumprobieren die Loesung auf mein Problem gefunden und will sie jetzt hier mal posten, weil mir sonst hier nie ein komplett funktionierender Quelltext, der zu meiner Frage passt nie begegnet ist.
    Die Frage selbst jedoch habe ich schon oft im Netz gefunden und vllt hilfts ja wem, der sie bald wieder hat:

    Gegenseitiges_instanzieren.cpp:

    #include "stdafx.h"
    #include "Form1.h"
    
    using namespace Gegenseitiges_instanzieren;
    
    [STAThreadAttribute]
    int main(array<System::String ^> ^args)
    {
    	Application::EnableVisualStyles();
    	Application::SetCompatibleTextRenderingDefault(false); 
    	Application::Run(gcnew Form1());
    	return 0;
    }
    

    Form1.h:

    #pragma once
    #include "Form2.h"
    
    namespace Gegenseitiges_instanzieren {
    ref class Form2; //Vorwaertzdeklaration von Form2, damit man einen Zeiger von Form2 in Form1 benutzen kann.
    	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();
    			//
    			//TODO: Konstruktorcode hier hinzufügen.
    			//
    		}
    
    	protected:
    		~Form1()
    		{
    			if (components)
    			{
    				delete components;
    			}
    		}
    	private: System::Windows::Forms::Button^  button1;
    	protected: 
    
    	private:
    		System::ComponentModel::Container ^components;
    
    #pragma region Windows Form Designer generated code
    		void InitializeComponent(void)
    		{
    			this->button1 = (gcnew System::Windows::Forms::Button());
    			this->SuspendLayout();
    			// 
    			// button1
    			// 
    			this->button1->Location = System::Drawing::Point(12, 12);
    			this->button1->Name = L"button1";
    			this->button1->Size = System::Drawing::Size(95, 23);
    			this->button1->TabIndex = 0;
    			this->button1->Text = L"Erstelle Form2";
    			this->button1->UseVisualStyleBackColor = true;
    			this->button1->Click += gcnew System::EventHandler(this, &Form1::button1_Click);
    			// 
    			// Form1
    			// 
    			this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
    			this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
    			this->ClientSize = System::Drawing::Size(115, 45);
    			this->Controls->Add(this->button1);
    			this->Name = L"Form1";
    			this->Text = L"Form1";
    			this->ResumeLayout(false);
    
    		}
    #pragma endregion
    		private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e); //Deklaration der Funktion button_Click, die an das Click-Event gebunden ist.
    	};
    }
    

    Form2.h:

    #pragma once
    #include "Form1.h"
    using namespace System;
    using namespace System::ComponentModel;
    using namespace System::Collections;
    using namespace System::Windows::Forms;
    using namespace System::Data;
    using namespace System::Drawing;
    
    namespace Gegenseitiges_instanzieren {
    ref class Form1;//Vorwaertzdeklaration von Form1, damit man einen Zeiger von Form1 in Form2 benutzen kann.
    	public ref class Form2 : public System::Windows::Forms::Form
    	{
    	public:
    		Form2(void)
    		{
    			InitializeComponent();
    			//
    			//TODO: Konstruktorcode hier hinzufügen.
    			//
    		}
    
    	protected:
    		~Form2()
    		{
    			if (components)
    			{
    				delete components;
    			}
    		}
    	private: System::Windows::Forms::Button^  button1;
    	protected: 
    	private:
    		System::ComponentModel::Container ^components;
    
    #pragma region Windows Form Designer generated code
    		void InitializeComponent(void)
    		{
    			this->button1 = (gcnew System::Windows::Forms::Button());
    			this->SuspendLayout();
    			// 
    			// button1
    			// 
    			this->button1->Location = System::Drawing::Point(12, 12);
    			this->button1->Name = L"button1";
    			this->button1->Size = System::Drawing::Size(89, 23);
    			this->button1->TabIndex = 0;
    			this->button1->Text = L"Erstelle Form1";
    			this->button1->UseVisualStyleBackColor = true;
    			this->button1->Click += gcnew System::EventHandler(this, &Form2::button1_Click);
    			// 
    			// Form2
    			// 
    			this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
    			this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
    			this->ClientSize = System::Drawing::Size(120, 43);
    			this->Controls->Add(this->button1);
    			this->Name = L"Form2";
    			this->Text = L"Form2";
    			this->ResumeLayout(false);
    
    		}
    #pragma endregion
    	private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e); //Deklaration der Funktion button_Click, die an das Click-Event gebunden ist.			 
    	};
    }
    

    Form1.cpp:

    #include "StdAfx.h"
    #include "Form2.h"
    //Definition des Click-Events in CPP-Datei:
    System::Void Gegenseitiges_instanzieren::Form2::button1_Click(System::Object ^sender, System::EventArgs ^e)
    {
    	Gegenseitiges_instanzieren::Form1 ^frm = gcnew Gegenseitiges_instanzieren::Form1; //Hier wird Form1 dann instanziert.
    	frm->Show(); //Anzeigen des Formulares
    }
    

    Form2.cpp:

    #include "StdAfx.h"
    #include "Form1.h"
    //Definition des Click-Events in CPP-Datei:
    	System::Void Gegenseitiges_instanzieren::Form1::button1_Click(System::Object ^sender, System::EventArgs ^e)
    	{
    		Gegenseitiges_instanzieren::Form2^ form = gcnew Gegenseitiges_instanzieren::Form2; //Hier wird Form1 dann instanziert.
    		form->Show();//Anzeigen des Formulares
    	}
    

    Ergebnis: Beim Starten des Programmes wird ein Formular mit Button sichtbar.
    Klickt man auf den Button wird Form2 mit einem Button instanziert und angezeigt.
    Klickt man dann auf den Button von Form2 wird wieder Form1 instanziert und angezeigt... und so weiter.

    Hoffe es hilft wem beim Verstehen - ich hab naemlich lange genug rumprobieren muessen, bis ich das zusammen hatte... :xmas1: :xmas1: :xmas1: :xmas1:

    Frohes Fest allen! ^^ 😋 😋 😋



  • Mit einem einfach dahin geklatschten Quellcode wird kaum jemand was anfangen können. Sinnvoll wäre es, die stellen die wichtig sind durch Kommentare hervorzuheben und zu erklären. So ist es einfach nur ein Beitrag mehr zu dem Thema - ohne Mehrwert.



  • Also wenn ich diesen Beitrag vorher gehabt haette waere es um einiges einfacher fuer mich geworden.
    Aber vllt haste recht - ich schreib mal noch was dran...



  • Bei einem vollständigen Quellcode ist das Problem vllt. schneller gelöst, aber nicht verstanden. Ich persönlich finde es besser, wenn jemand in einem solchen Falle nur mit dem Stichwort Vorwärtzdeklaration los geschickt wird und sich einarbeiten muss. Das wissen sitzt dann viel besser.



  • Also ich selbst hatte das Stichwort auch und hab dann halt bei google irgendwann die Loesung gefunden.
    Man lernt es dann schon schneller ... naja ^^


Anmelden zum Antworten