von mainfenster daten aus textbox von dialog bekommen c++

fretrunner

Grünschnabel
hallo zusammen

ich habe folgendes problem:
hauptfenster ruft dialog mit textbox auf.
bei drücken eines buttons sollen die eingaben im dialog in der hauptfensterklasse gehalten werden.

wie geht das?

vielen dank im vorraus
 
danke für die antwort.
hab mir das entsprechende tutorial (kommunikation zwischen fenstern) durchgelesen und für c++ nachgebaut.
das problem ist, dass es beimir in c# klappt und in c++ nicht.

ich habe ein form1 mit textfeld und button (generiert form2) und ein form 2mit button gemacht (soll in form1 schreiben).
nun mus ich ja den konstruktor von form 2 umschreiben und ihm ein form 1 übergeben.
da meckert aber dauernd de3r kompiler.

form2(Form1^ f)
{
...
}

er kennt Form1 nicht :-(

vielen dank im vorraus...
 
Also hier mal mein Code:
Code:
// TestTwoForms.cpp: Hauptprojektdatei.

#include "stdafx.h"

#include "Form1.h"
#include "Form2.h"



using namespace TestTwoForms;

[STAThreadAttribute]
int main(array<System::String ^> ^args)
{
	// Aktivieren visueller Effekte von Windows XP, bevor Steuerelemente erstellt werden
	Application::EnableVisualStyles();
	Application::SetCompatibleTextRenderingDefault(false); 

	// Hauptfenster erstellen und ausführen
	Application::Run(gcnew Form1());
	return 0;
}

Code:
#pragma once


namespace TestTwoForms {

	using namespace System;
	using namespace System::ComponentModel;
	using namespace System::Collections;
	using namespace System::Windows::Forms;
	using namespace System::Data;
	using namespace System::Drawing;

	/// <summary>
	/// Zusammenfassung für Form1
	///
	/// Warnung: Wenn Sie den Namen dieser Klasse ändern, müssen Sie auch
	///          die Ressourcendateiname-Eigenschaft für das Tool zur Kompilierung verwalteter Ressourcen ändern,
	///          das allen RESX-Dateien zugewiesen ist, von denen diese Klasse abhängt.
	///          Anderenfalls können die Designer nicht korrekt mit den lokalisierten Ressourcen
	///          arbeiten, die diesem Formular zugewiesen sind.
	/// </summary>
	public ref class Form1 : public System::Windows::Forms::Form
	{
	public:
		Form1(void)
		{
			InitializeComponent();
			//
			//TODO: Konstruktorcode hier hinzufügen.
			//
		}

	protected:
		/// <summary>
		/// Verwendete Ressourcen bereinigen.
		/// </summary>
		~Form1()
		{
			if (components)
			{
				delete components;
			}
		}
	private: System::Windows::Forms::Button^  button1;
	private: System::Windows::Forms::TextBox^  textBox1;
	
	protected: 

	private:
		/// <summary>
		/// Erforderliche Designervariable.
		/// </summary>
		System::ComponentModel::Container ^components;

#pragma region Windows Form Designer generated code
		/// <summary>
		/// Erforderliche Methode für die Designerunterstützung.
		/// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden.
		/// </summary>
		void InitializeComponent(void)
		{
			this->button1 = (gcnew System::Windows::Forms::Button());
			this->textBox1 = (gcnew System::Windows::Forms::TextBox());
			this->SuspendLayout();
			// 
			// button1
			// 
			this->button1->Location = System::Drawing::Point(122, 33);
			this->button1->Name = L"button1";
			this->button1->Size = System::Drawing::Size(75, 23);
			this->button1->TabIndex = 0;
			this->button1->Text = L"button1";
			this->button1->UseVisualStyleBackColor = true;
			this->button1->Click += gcnew System::EventHandler(this, &Form1::button1_Click);
			// 
			// textBox1
			// 
			this->textBox1->Location = System::Drawing::Point(139, 136);
			this->textBox1->Name = L"textBox1";
			this->textBox1->Size = System::Drawing::Size(100, 20);
			this->textBox1->TabIndex = 1;
			// 
			// Form1
			// 
			this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
			this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
			this->ClientSize = System::Drawing::Size(292, 266);
			this->Controls->Add(this->textBox1);
			this->Controls->Add(this->button1);
			this->Name = L"Form1";
			this->Text = L"Form1";
			this->ResumeLayout(false);
			this->PerformLayout();

		}
#pragma endregion
	private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
				 Form2^ form2 = gcnew Form2(this);
				 form2->ShowDialog();
			 }
	public: void setTextBox(System::String^str)
	{
		this->textBox1->Text =str;
	}
				
	};
}

Code:
//Form2.cpp

#include "StdAfx.h"
#include "Form1.h"
#include "Form2.h"

Code:
//Form2.h
#pragma once

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 TestTwoForms {

	/// <summary>
	/// Zusammenfassung für Form2
	///
	/// Warnung: Wenn Sie den Namen dieser Klasse ändern, müssen Sie auch
	///          die Ressourcendateiname-Eigenschaft für das Tool zur Kompilierung verwalteter Ressourcen ändern,
	///          das allen RESX-Dateien zugewiesen ist, von denen diese Klasse abhängt.
	///          Anderenfalls können die Designer nicht korrekt mit den lokalisierten Ressourcen
	///          arbeiten, die diesem Formular zugewiesen sind.
	/// </summary>
	public ref class Form2 : public System::Windows::Forms::Form
	{
	public:
		Form2(Form1^ f)
		{
			InitializeComponent();
			//
			//TODO: Konstruktorcode hier hinzufügen.
			//
			this->form1 = f;

		}

	protected:
		/// <summary>
		/// Verwendete Ressourcen bereinigen.
		/// </summary>
		~Form2()
		{
			if (components)
			{
				delete components;
			}
		}
	private: System::Windows::Forms::Button^  button1;
	private: Form1^ form1;
	protected: 

	private:
		/// <summary>
		/// Erforderliche Designervariable.
		/// </summary>
		System::ComponentModel::Container ^components;

#pragma region Windows Form Designer generated code
		/// <summary>
		/// Erforderliche Methode für die Designerunterstützung.
		/// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden.
		/// </summary>
		void InitializeComponent(void)
		{
			this->button1 = (gcnew System::Windows::Forms::Button());
			this->SuspendLayout();
			// 
			// button1
			// 
			this->button1->Location = System::Drawing::Point(161, 116);
			this->button1->Name = L"button1";
			this->button1->Size = System::Drawing::Size(75, 23);
			this->button1->TabIndex = 0;
			this->button1->Text = L"button1";
			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(292, 266);
			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) {
				 this->form1->setTextBox("TEST");
			 }
	};
}

Bitte dringend um Hilfe :-(

Vielen Dank
 
Ich hab mal ein bisschen rumprobiert. Mit managed c++ hab ich noch nicht so viel gemacht. Aber eines ist mir gleich aufgefallen. Es gibt eindeutig eine Rückkopplung in den Klassendefinitionen:
In Form1 verwendest du Form2. In Form2 verwendest du Form1. Wenn du jetzt versuchst eine entsprechende Reihenfolge der Include-Direktiven wirst du scheitern: Um Form1.h zu inkludieren muss bereits Form2 davor definiert deklariert werden, sprich Form2.h inkludiert sein. Nur dass kannst du nicht da für Form2 die Klasse Form1 benötigt wird.

Lösung:
Die Methoden werden in den Headerdateien nur deklariert (bis auf De- & Konstruktoren). Und die Definition in die CPP Files ausgelagert. Das Coding schön aufgefäumt würde das dann wie folgt aussehen. Ich finde es extrem wie schlecht dass der GUI-Designer im C++ Code die Sichtbarkeitsoperatoren setzt. Vor jedes Element einzeln, Horror.

Form1.h
C++:
#pragma once

namespace TestTwoForms 
{

    using namespace System;
    using namespace System::ComponentModel;
    using namespace System::Collections;
    using namespace System::Windows::Forms;
    using namespace System::Data;
    using namespace System::Drawing;

    /// <summary>
    /// Zusammenfassung für Form1
    ///
    /// Warnung: Wenn Sie den Namen dieser Klasse ändern, müssen Sie auch
    ///          die Ressourcendateiname-Eigenschaft für das Tool zur Kompilierung verwalteter Ressourcen ändern,
    ///          das allen RESX-Dateien zugewiesen ist, von denen diese Klasse abhängt.
    ///          Anderenfalls können die Designer nicht korrekt mit den lokalisierten Ressourcen
    ///          arbeiten, die diesem Formular zugewiesen sind.
    /// </summary>
    public ref class Form1 : public System::Windows::Forms::Form
    {
    private:
        System::Windows::Forms::Button ^button1;
        System::Windows::Forms::TextBox ^textBox1;
        /// <summary>
        /// Erforderliche Designervariable.
        /// </summary>
        System::ComponentModel::Container ^components;        

        /// <summary>
        /// Erforderliche Methode für die Designerunterstützung.
        /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden.
        /// </summary>
        void InitializeComponent(void);

        System::Void button1_Click(System::Object ^sender, System::EventArgs ^e);
    public:
        Form1(void)
        {
            InitializeComponent();
        }
        
        /// <summary>
        /// Legt den Text in der TextBox fest.
        /// </summary>
        void setTextBox(System::String ^str);

    protected:
        /// <summary>
        /// Verwendete Ressourcen bereinigen.
        /// </summary>
        ~Form1()
        {
            if (components)
            {
                delete components;
            }
        }                
    };
}

Form1.cpp
C++:
#include "StdAfx.h"
#include "Form1.h"
#include "Form2.h" 

System::Void TestTwoForms::Form1::InitializeComponent(void) 
{
    this->button1 = (gcnew System::Windows::Forms::Button());
    this->textBox1 = (gcnew System::Windows::Forms::TextBox());
    this->SuspendLayout();
    // 
    // button1
    // 
    this->button1->Location = System::Drawing::Point(122, 33);
    this->button1->Name = L"button1";
    this->button1->Size = System::Drawing::Size(75, 23);
    this->button1->TabIndex = 0;
    this->button1->Text = L"button1";
    this->button1->UseVisualStyleBackColor = true;
    this->button1->Click += gcnew System::EventHandler(this, &Form1::button1_Click);
    // 
    // textBox1
    // 
    this->textBox1->Location = System::Drawing::Point(139, 136);
    this->textBox1->Name = L"textBox1";
    this->textBox1->Size = System::Drawing::Size(100, 20);
    this->textBox1->TabIndex = 1;
    // 
    // Form1
    // 
    this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
    this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
    this->ClientSize = System::Drawing::Size(292, 266);
    this->Controls->Add(this->textBox1);
    this->Controls->Add(this->button1);
    this->Name = L"Form1";
    this->Text = L"Form1";
    this->ResumeLayout(false);
    this->PerformLayout();
}

System::Void TestTwoForms::Form1::setTextBox(System::String ^str)
{
    this->textBox1->Text =str;
}

System::Void TestTwoForms::Form1::button1_Click(System::Object^  sender, System::EventArgs^  e) 
{
    Form2^ form2 = gcnew Form2(this);
    form2->ShowDialog();
}

Form2.h
C++:
//Form2.h
#pragma once

using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;
#include "Form1.h"

namespace TestTwoForms {

    /// <summary>
    /// Zusammenfassung für Form2
    ///
    /// Warnung: Wenn Sie den Namen dieser Klasse ändern, müssen Sie auch
    ///          die Ressourcendateiname-Eigenschaft für das Tool zur Kompilierung verwalteter Ressourcen ändern,
    ///          das allen RESX-Dateien zugewiesen ist, von denen diese Klasse abhängt.
    ///          Anderenfalls können die Designer nicht korrekt mit den lokalisierten Ressourcen
    ///          arbeiten, die diesem Formular zugewiesen sind.
    /// </summary>
    public ref class Form2 : public System::Windows::Forms::Form
    {
    private:
        /// <summary>
        /// Erforderliche Designervariable.
        /// </summary>
        System::ComponentModel::Container ^components;
        System::Windows::Forms::Button ^button1;
        Form1^ form1; // Referenz auf das Hauptfenster

        /// <summary>
        /// Erforderliche Methode für die Designerunterstützung.
        /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden.
        /// </summary>
        void InitializeComponent(void);
        System::Void button1_Click(System::Object ^sender, System::EventArgs ^e);
    public:
        Form2(TestTwoForms::Form1 ^f)
        {
            InitializeComponent();
            this->form1 = f;
        }

    protected:
        /// <summary>
        /// Verwendete Ressourcen bereinigen.
        /// </summary>
        ~Form2()
        {
            if (components)
            {
                delete components;
            }
        }
    };
}

Form2.cpp
C++:
//Form2.cpp

#include "StdAfx.h"
#include "Form1.h"
#include "Form2.h"

System::Void TestTwoForms::Form2::InitializeComponent(void)
{
    this->button1 = (gcnew System::Windows::Forms::Button());
    this->SuspendLayout();
    // 
    // button1
    // 
    this->button1->Location = System::Drawing::Point(161, 116);
    this->button1->Name = L"button1";
    this->button1->Size = System::Drawing::Size(75, 23);
    this->button1->TabIndex = 0;
    this->button1->Text = L"button1";
    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(292, 266);
    this->Controls->Add(this->button1);
    this->Name = L"Form2";
    this->Text = L"Form2";
    this->ResumeLayout(false);
}

System::Void TestTwoForms::Form2::button1_Click(System::Object^  sender, System::EventArgs^  e) 
{
    this->form1->setTextBox("TEST");
}

Einstiegspunkt wie gehabt.

Getestet und Funktioniert. Ich hoffe es bringt was und du findest eine optimalere Lösung die mit dem GUI-Designer zusammenarbeitet. Aber jetzt weist du wo das Problem liegt.

Gruß Daniel
 
Zurück