Von mainForm den EventHandler von Form2 Button_Click definieren und auch ausführen.



  • Hi liebe Community
    bin schon seit Tagen am Googeln und habe leider nichts "brauchbares" gefunden.

    Also zu meinem Prog-Problem:
    Ich öffne aus der Form1 (mainForm) von dem MenuStripItem1 die Form2. Dies klappt soweit wunderbar.

    Auf dem Form2 habe ich Textfelder und einen Button1. Damit ich für die Form2 alle includes nicht nochmals laden muss (da sie ja in der mainForm geladen wurden), möchte ich von mainForm aus den EventHandler btnSuchen_Click ausführen und abarbeiten. Das ist aber gar nicht so einfach.

    Ich poste mal die mainForm.h

    #pragma once
    
    #include "Form2.h"
    
    #include <windows.h>
    
    #using <System.dll>
    #using <System.Drawing.dll>
    #using <System.Windows.Forms.dll>
    #using <mscorlib.dll>
    
    namespace MeinProg {
    
    	using namespace System;
    	using namespace System::Net;
    	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 main
    	/// </summary>
    	public ref class main : public System::Windows::Forms::Form
    	{
    	public:
    		main(void)
    		{
    			InitializeComponent();
    			//
    			//TODO: Konstruktorcode hier hinzufügen.
    			//
    		}
    
    	protected:
    		/// <summary>
    		/// Verwendete Ressourcen bereinigen.
    		/// </summary>
    		~main()
    		{
    			if (components)
    			{
    				delete components;
    			}
    		}
    	private: System::Windows::Forms::MenuStrip^  menuStrip1;
    	protected:
    	private: System::Windows::Forms::ToolStripMenuItem^  dateiToolStripMenuItem;
    	private: System::Windows::Forms::ToolStripMenuItem^  neueForm2ToolStripMenuItem;
    
    	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->menuStrip1 = (gcnew System::Windows::Forms::MenuStrip());
    			this->dateiToolStripMenuItem = (gcnew System::Windows::Forms::ToolStripMenuItem());
    			this->neueForm2ToolStripMenuItem = (gcnew System::Windows::Forms::ToolStripMenuItem());
    			this->menuStrip1->SuspendLayout();
    			this->SuspendLayout();
    			// 
    			// menuStrip1
    			// 
    			this->menuStrip1->ImageScalingSize = System::Drawing::Size(20, 20);
    			this->menuStrip1->Items->AddRange(gcnew cli::array< System::Windows::Forms::ToolStripItem^  >(1) { this->dateiToolStripMenuItem });
    			this->menuStrip1->Location = System::Drawing::Point(0, 0);
    			this->menuStrip1->Name = L"menuStrip1";
    			this->menuStrip1->Size = System::Drawing::Size(590, 28);
    			this->menuStrip1->TabIndex = 0;
    			this->menuStrip1->Text = L"menuStrip1";
    			// 
    			// dateiToolStripMenuItem
    			// 
    			this->dateiToolStripMenuItem->DropDownItems->AddRange(gcnew cli::array< System::Windows::Forms::ToolStripItem^  >(1) { this->neueForm2ToolStripMenuItem });
    			this->dateiToolStripMenuItem->Name = L"dateiToolStripMenuItem";
    			this->dateiToolStripMenuItem->Size = System::Drawing::Size(57, 24);
    			this->dateiToolStripMenuItem->Text = L"Datei";
    			// 
    			// neueForm2ToolStripMenuItem
    			// 
    			this->neueForm2ToolStripMenuItem->Name = L"neueForm2ToolStripMenuItem";
    			this->neueForm2ToolStripMenuItem->Size = System::Drawing::Size(181, 26);
    			this->neueForm2ToolStripMenuItem->Text = L"Neue Form2";
    			this->neueForm2ToolStripMenuItem->Click += gcnew System::EventHandler(this, &main::neueForm2ToolStripMenuItem_Click);
    			// 
    			// main
    			// 
    			this->AutoScaleDimensions = System::Drawing::SizeF(8, 16);
    			this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
    			this->ClientSize = System::Drawing::Size(590, 477);
    			this->Controls->Add(this->menuStrip1);
    			this->MainMenuStrip = this->menuStrip1;
    			this->Name = L"main";
    			this->Text = L"main";
    			this->menuStrip1->ResumeLayout(false);
    			this->menuStrip1->PerformLayout();
    			this->ResumeLayout(false);
    			this->PerformLayout();
    
    		}
    #pragma endregion
    	private: System::Void neueForm2ToolStripMenuItem_Click(System::Object^  sender, System::EventArgs^  e) {
    
    		Form2^ dlgfrm = gcnew Form2();
    
    		dlgfrm->btnSuchen->Click += gcnew System::EventHandler(this, &MeinProg::main::OnClick);
    
    		dlgfrm->ShowDialog();
    
    	}
    	};
    }
    [code="cli"]
    

    und die Form2.h:

    [code]
    #pragma once
    
    namespace MeinProg {
    
    	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 Form2
    	/// </summary>
    	public ref class Form2 : public System::Windows::Forms::Form
    	{
    	public:
    		Form2(void)
    		{
    			InitializeComponent();
    			//
    			//TODO: Konstruktorcode hier hinzufügen.
    			//
    		}
    
    	protected:
    		/// <summary>
    		/// Verwendete Ressourcen bereinigen.
    		/// </summary>
    		~Form2()
    		{
    			if (components)
    			{
    				delete components;
    			}
    		}
    	public: System::Windows::Forms::TextBox^  txtIpAdresse;
    	protected:
    
    	protected:
    	private: System::Windows::Forms::Label^  label1;
    	public: System::Windows::Forms::Button^  btnSuchen;
    	private:
    
    	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->txtIpAdresse = (gcnew System::Windows::Forms::TextBox());
    			this->label1 = (gcnew System::Windows::Forms::Label());
    			this->btnSuchen = (gcnew System::Windows::Forms::Button());
    			this->SuspendLayout();
    			// 
    			// txtIpAdresse
    			// 
    			this->txtIpAdresse->Location = System::Drawing::Point(74, 88);
    			this->txtIpAdresse->Name = L"txtIpAdresse";
    			this->txtIpAdresse->Size = System::Drawing::Size(262, 22);
    			this->txtIpAdresse->TabIndex = 0;
    			// 
    			// label1
    			// 
    			this->label1->AutoSize = true;
    			this->label1->Location = System::Drawing::Point(71, 68);
    			this->label1->Name = L"label1";
    			this->label1->Size = System::Drawing::Size(39, 17);
    			this->label1->TabIndex = 1;
    			this->label1->Text = L"IPv4 ";
    			// 
    			// btnSuchen
    			// 
    			this->btnSuchen->Location = System::Drawing::Point(157, 163);
    			this->btnSuchen->Name = L"btnSuchen";
    			this->btnSuchen->Size = System::Drawing::Size(179, 34);
    			this->btnSuchen->TabIndex = 2;
    			this->btnSuchen->Text = L"PC im Netzwerk suchen";
    			this->btnSuchen->UseVisualStyleBackColor = true;
    			// 
    			// Form2
    			// 
    			this->AutoScaleDimensions = System::Drawing::SizeF(8, 16);
    			this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
    			this->ClientSize = System::Drawing::Size(419, 232);
    			this->Controls->Add(this->btnSuchen);
    			this->Controls->Add(this->label1);
    			this->Controls->Add(this->txtIpAdresse);
    			this->Name = L"Form2";
    			this->Text = L"Form2";
    			this->ResumeLayout(false);
    			this->PerformLayout();
    
    		}
    #pragma endregion
    	};
    }
    
    [code="cli"]
    

    Fehlermeldung1:

    Schweregrad	Code	Beschreibung	Projekt	Datei	Zeile	Unterdrückungszustand
    Fehler (aktiv)		ungültiger Delegatinitialisierer -- Funktion stimmt nicht mit dem Delegattyp überein	MeinProg	f:\Projekte\MeinProg\MeinProg\main.h	117
    

    Fehlermeldung2:

    Schweregrad	Code	Beschreibung	Projekt	Datei	Zeile	Unterdrückungszustand
    Fehler	C3352	"void System::Windows::Forms::Control::OnClick(System::EventArgs ^)": Die angegebene Funktion stimmt nicht mit dem Delegattyp "void (System::Object ^,System::EventArgs ^)" überein.	MeinProg	f:\projekte\meinprog\meinprog\main.h	117
    

    Freue mich riesig auf Eure Expertenmeinung und sage jetzt schon im Voraus Danke schön.

    Lieben Gruss aus der Schweiz



  • Hi zusammen,

    Kann mir Jemand helfen, wie dieses Problem hier gelöst werden muss, damit es funktioniert?

    Habe es gestern noch ein paarmal versucht aber leider ohne Glück. 😞

    Für jede Hilfe bin ich sehr dankbar.

    Danke schön.



  • In der Fehlermeldung wird main.h erwähnt, ich gehe davon aus, dass du es hier im Forum fälschlicherweise als mainForm.h bezeichnest.

    In der folgenden Zeile wird versucht eine Methode ( ...OnClick ) mit einem Delegaten ( ...EventHandler ) zu verbinden und diesen dann dem Click-Event hinzuzufügen. Offenbar passt die Signatur von ...OnClick nicht zur Signatur des Delegaten.

    dlgfrm->btnSuchen->Click += gcnew System::EventHandler(this, &MeinProg::main::OnClick);
    

    Die korrekte Signatur von ...OnClick muss sein:

    System::Void ...OnClick(System::Object^ sender, System::EventArgs^ e)
    {
    }
    

    Die "..." vor OnClick musst du natürlich mit dem konkreten Namespace bzw. der Klasse ersetzen.



  • Hallo Theta,

    Vielen Dank für Deine rasche Antwort. Ups, ja da hast Du recht. Habe mich da vertan 🙂 Muss ich diese Korrektur in der Form2 vornehmen?

    Gruss und Danke



  • Nein, die Korrektur musst du in der Klasse main vornehmen, und zwar bei der Methode main::OnClick(...) .



  • Nochmals vielen Dank für Deine Hilfe. Ich komme aber leider dennoch nicht weiter.

    Wo sollte ich diese Korrektur vornehmen?

    Hier drin?

    public ref class main : public System::Windows::Forms::Form
        {
        public:
            main(void)
            {
                InitializeComponent();
                //
                //TODO: Konstruktorcode hier hinzufügen.
                //
            }
    

    Könntest Du mir sei so nett etwas genauer beschreiben wo und wie?

    Besten Dank nochmals im Voraus.



  • public ref class main : public System::Windows::Forms::Form
        {
        public:
            main(void)
            {
                InitializeComponent();
                //
                //TODO: Konstruktorcode hier hinzufügen.
                //
            }
    
            // mehr Code ...
    
            // So sieht die OnClick-Methode jetzt aus:
            System::Void OnClick(System::EventArgs^ e)
            { 
            }
    
            // So sollte die OnClick-Methode aussehen (mit sender als zusätzliches Argument):
            System::Void OnClick(System::Object^ sender, System::EventArgs^ e)
            {
                // Code, der das Ereignis behandelt
            }
    
            // mehr Code ...
        };
    


  • @Kaffetrinker: Lies dir auch mal den hier im Subforum als "wichtig" markierten Artikel durch (du machst mir nicht den Eindruck, als ob du ein professioneller Entwickler bist, der mit C++/CLI + WinForms klarkommt).



  • Nochmals besten Dank für Deine Hilfe Theta und Th69.

    Ich bin Anfänger, das ist so. 🙂

    Ich hatte alles genauso in meine main kopiert, wie es mir Theta erklärt hat. Aber die Fehlermeldungen vom Compiler waren genauso da und auch im Code waren die gleichen Stellen rot unterwellt. 😞

    @Th69: Welchen markierten Artikel meinst Du genau?

    Meine Fragerei tut mir leid. Bin auch Neuling wie viele hier drin auch.

    Lieben Gruss und Danke vielmals für Eure Geduld mit mir.



  • Guten Morgen zusammen, vielen vielen lieben Dank für Eure Hilfe. Ich hab es doch mit dem Code-Ausschnitt von Theta geschaft.

    Ich poste die Lösung mal wie es bei mir ohne meckern des Compilers geht.

    Die komplette main.h: (Alles farbige ist Theta's Lösungsweg)

    #pragma once

    #include "Form2.h"

    #include <windows.h>

    #using <System.dll>
    #using <System.Drawing.dll>
    #using <System.Windows.Forms.dll>
    #using <mscorlib.dll>

    namespace MeinProg {

    using namespace System;
    using namespace System::Net;
    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 main
    /// </summary>
    public ref class main : public System::Windows::Forms::Form
    {
    public:
    main(void)
    {
    InitializeComponent();
    //
    //TODO: Konstruktorcode hier hinzufügen.
    //
    }

    public:
    		void btnSuchenOnClick(Object ^ sender, EventArgs ^ e)
    		{
    			MessageBox::Show(L"Bla bla bla"
    				L"\nUps bla bla nla",
    				L"Test",
    				MessageBoxButtons::OK, MessageBoxIcon::Information);
    		}
    

    protected:
    /// <summary>
    /// Verwendete Ressourcen bereinigen.
    /// </summary>
    ~main()
    {
    if (components)
    {
    delete components;
    }
    }
    private: System::Windows::Forms::MenuStrip^ menuStrip1;
    protected:
    private: System::Windows::Forms::ToolStripMenuItem^ dateiToolStripMenuItem;
    private: System::Windows::Forms::ToolStripMenuItem^ neueForm2ToolStripMenuItem;

    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->menuStrip1 = (gcnew System::Windows::Forms::MenuStrip());
    this->dateiToolStripMenuItem = (gcnew System::Windows::Forms::ToolStripMenuItem());
    this->neueForm2ToolStripMenuItem = (gcnew System::Windows::Forms::ToolStripMenuItem());
    this->menuStrip1->SuspendLayout();
    this->SuspendLayout();
    //
    // menuStrip1
    //
    this->menuStrip1->ImageScalingSize = System::Drawing::Size(20, 20);
    this->menuStrip1->Items->AddRange(gcnew cli::array< System::Windows::Forms::ToolStripItem^ >(1) { this->dateiToolStripMenuItem });
    this->menuStrip1->Location = System::Drawing::Point(0, 0);
    this->menuStrip1->Name = L"menuStrip1";
    this->menuStrip1->Size = System::Drawing::Size(590, 28);
    this->menuStrip1->TabIndex = 0;
    this->menuStrip1->Text = L"menuStrip1";
    //
    // dateiToolStripMenuItem
    //
    this->dateiToolStripMenuItem->DropDownItems->AddRange(gcnew cli::array< System::Windows::Forms::ToolStripItem^ >(1) { this->neueForm2ToolStripMenuItem });
    this->dateiToolStripMenuItem->Name = L"dateiToolStripMenuItem";
    this->dateiToolStripMenuItem->Size = System::Drawing::Size(57, 24);
    this->dateiToolStripMenuItem->Text = L"Datei";
    //
    // neueForm2ToolStripMenuItem
    //
    this->neueForm2ToolStripMenuItem->Name = L"neueForm2ToolStripMenuItem";
    this->neueForm2ToolStripMenuItem->Size = System::Drawing::Size(181, 26);
    this->neueForm2ToolStripMenuItem->Text = L"Neue Form2";
    this->neueForm2ToolStripMenuItem->Click += gcnew System::EventHandler(this, &main::neueForm2ToolStripMenuItem_Click);
    //
    // main
    //
    this->AutoScaleDimensions = System::Drawing::SizeF(8, 16);
    this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
    this->ClientSize = System::Drawing::Size(590, 477);
    this->Controls->Add(this->menuStrip1);
    this->MainMenuStrip = this->menuStrip1;
    this->Name = L"main";
    this->Text = L"main";
    this->menuStrip1->ResumeLayout(false);
    this->menuStrip1->PerformLayout();
    this->ResumeLayout(false);
    this->PerformLayout();

    }
    #pragma endregion
    private: System::Void neueForm2ToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e) {

    Form2^ dlgfrm = gcnew Form2();

    dlgfrm->btnSuchen->Click += gcnew System::EventHandler(this, &MeinProg::main::btnSuchenOnClick);
    

    dlgfrm->ShowDialog();

    }
    };
    }

    Nun Meine Form2

    #pragma once
    
    namespace MeinProg {
    
    	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 Form2
    	/// </summary>
    	public ref class Form2 : public System::Windows::Forms::Form
    	{
    	public:
    		Form2(void)
    		{
    			InitializeComponent();
    			//
    			//TODO: Konstruktorcode hier hinzufügen.
    			//
    		}
    
    	protected:
    		/// <summary>
    		/// Verwendete Ressourcen bereinigen.
    		/// </summary>
    		~Form2()
    		{
    			if (components)
    			{
    				delete components;
    			}
    		}
    	public: System::Windows::Forms::TextBox^  txtIpAdresse;
    	protected:
    
    	protected:
    	private: System::Windows::Forms::Label^  label1;
    	public: System::Windows::Forms::Button^  btnSuchen;
    	private:
    
    	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->txtIpAdresse = (gcnew System::Windows::Forms::TextBox());
    			this->label1 = (gcnew System::Windows::Forms::Label());
    			this->btnSuchen = (gcnew System::Windows::Forms::Button());
    			this->SuspendLayout();
    			// 
    			// txtIpAdresse
    			// 
    			this->txtIpAdresse->Location = System::Drawing::Point(74, 88);
    			this->txtIpAdresse->Name = L"txtIpAdresse";
    			this->txtIpAdresse->Size = System::Drawing::Size(262, 22);
    			this->txtIpAdresse->TabIndex = 0;
    			// 
    			// label1
    			// 
    			this->label1->AutoSize = true;
    			this->label1->Location = System::Drawing::Point(71, 68);
    			this->label1->Name = L"label1";
    			this->label1->Size = System::Drawing::Size(39, 17);
    			this->label1->TabIndex = 1;
    			this->label1->Text = L"IPv4 ";
    			// 
    			// btnSuchen
    			// 
    			this->btnSuchen->Location = System::Drawing::Point(157, 163);
    			this->btnSuchen->Name = L"btnSuchen";
    			this->btnSuchen->Size = System::Drawing::Size(179, 34);
    			this->btnSuchen->TabIndex = 2;
    			this->btnSuchen->Text = L"PC im Netzwerk suchen";
    			this->btnSuchen->UseVisualStyleBackColor = true;
    
    			// 
    			// Form2
    			// 
    			this->AutoScaleDimensions = System::Drawing::SizeF(8, 16);
    			this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
    			this->ClientSize = System::Drawing::Size(419, 232);
    			this->Controls->Add(this->btnSuchen);
    			this->Controls->Add(this->label1);
    			this->Controls->Add(this->txtIpAdresse);
    			this->Name = L"Form2";
    			this->Text = L"Form2";
    			this->ResumeLayout(false);
    			this->PerformLayout();
    
    		}
    #pragma endregion
    
    	};
    }
    

    Funktioniert suuper.

    Nochmals vielen herzlichen Dank.

    Wenn ich wieder Fragen habe zum Coden komme ich wieder hier her. Da wird einem tatsächlich geholfen.

    Schönen Tag und viele Grüsse





  • Hallo Th69, besten Dank für den Link.

    Aber um dies beurteilen zu können bin ich noch ein zu grosser Anfänger in Sachen Programmieren. Werde mir diesen Artikel aber sehr gerne mal zur Brust nehmen.

    Im Moment bin ich da aber mit der WindowsForms und c++/cli .net zu stark beschäftigt.

    Aber andere Frage: Wenn nicht WinForms und c++, wie sollte ich dann deiner Meinung nach mein Programm weiterziehen?

    Lieben Gruss und nochmals Danke



  • Wenn es dir um WinForms geht, dann nimm C# als Sprache.
    Ansonsten benutze natives C++ (ohne CLI) und ein dafür vorgesehenes UI-Framework, s. [HOWTO] Welches Toolkit für GUIS? (aus dem entsprechendem Subforum: Andere GUIs - Qt, GTK+, wxWidgets).

    C++/CLI ist nur als Interop-Sprache gedacht (um native C++ Bibliotheken und .NET zusammenzubringen).