System::EventHandler



  • Einen wunderschönen guten Tag die Herrschaften,

    Quähle mich schon seit 2 Tagen auf den Microsoft-Sites herum und versuche näheres über den EventHandler herauszufinden.

    Mein Problem ist wie folgt:

    In Meiner Form1 deklariere ich einen Button, welchen ich zur Form2 (Instanz(newMDIChild)) sende und ihn dort sichtbar machen möchte. Dies gelingt auch super.

    Nun, dem Button fehlt jetzt leider noch das Click- Ereignis. Mein Code ist wie folgt:

    Button^ button1 = gcnew Button();
    					button1->Text = L"OK";
    					button1->Name = L"btnSenden";					
    					button1->Location = Point(515,104);
    					button1->Size = System::Drawing::Size(45,45);
    					button1->Cursor = System::Windows::Forms::Cursors::Hand;
    					button1->Click += gcnew System::EventHandler(this, &newMDIChild::button1_Click);
    

    Meine Fehlermeldung ist wie folgt:

    Fehler		error C2825: "newMDIChild": Muss eine Klasse oder ein Namespace sein, wenn gefolgt von "::".		
    
    Fehler		error C2065: 'button1_Click': nichtdeklarierter Bezeichner
    Fehler		error C2039: 'button1_Click': Ist kein Element von '`global  namespace''		
    Fehler		error C3924: Fehler in Argument #2 des Delegatkonstruktoraufrufs "System::EventHandler":
    

    Könnt ihr mir helfen?

    Ich sage schon vorab DANKESCHÖN 🙂

    phil74



  • Hallo Phil74

    ist das Thema noch aktuell?
    Wenn ja, lege mal ein Projekt an und nenne es Button und überschreibe den kompletten Code der Form1 mit diesem...

    #pragma once
    
    namespace Button1 {
    
    	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:
    		Button^ button1;
    
    	public:
    		Form1(void)
    		{
    			InitializeComponent();
    			//
    			//TODO: Konstruktorcode hier hinzufügen.
    			//
    			this->button1 = gcnew Button();
    			this->button1->Bounds = Rectangle(Point(200,100),System::Drawing::Size(100,50));
    			this->button1->Text = "Beenden";
    			this->Controls->Add(button1);
    			this->button1->Click += gcnew System::EventHandler(this, &Form1::button1_Click);
    			this->button1->MouseMove += gcnew System::Windows::Forms::MouseEventHandler(this, &Form1::button1_MouseMove);
    		}
    
    	protected:
    		/// <summary>
    		/// Verwendete Ressourcen bereinigen.
    		/// </summary>
    		~Form1()
    		{
    			if (components)
    			{
    				delete components;
    			}
    		}
    
    	protected: 
    	protected: 
    	protected: 
    	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->SuspendLayout();
    			// 
    			// Form1
    			// 
    			this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
    			this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
    			this->ClientSize = System::Drawing::Size(370, 264);
    			this->Name = L"Form1";
    			this->Text = L"Form1";
    			this->ResumeLayout(false);
    
    		}
    #pragma endregion
    	private: System::Void  button1_Click(System::Object^ sender, System::EventArgs^ e)
    		{
    			Close();
    		}
    
    	private: System::Void button1_MouseMove(System::Object^ sender, System ::Windows::Forms::MouseEventArgs^ e)
            {
    			button1->Text = "Close();";
    		}
    	};
    }
    

    Dieser Code legt zur Laufzeit einen Button sowie das Click Ereignis und MouseMove Ereignis an, welches mit der Funktion Close hinterlegt ist.

    Gruß, Doug_HH



  • Guten Morgen Doug HH,

    Danke erstmals für Deine Hilfe...

    Ja, das ist noch aktuell.

    Mein Problem besteht darin, das ich von Form1 (MDIcontainer) einen Button deklariere und diesen dem MDIChild(Form2) senden will. Dieser Button wird in Form2 gezeichnet. Auch Seinen EventHandler(Button_Click) wird übergeben.

    Sobald ich aber den "button1->Click += gcnew System::EventHandler(this, &newMDIChild::button1_Click);" bei der Button-Deklaration anfüge, bekomme ich diese Fehlermeldung:

    Fehler        error C2825: "newMDIChild": Muss eine Klasse oder ein Namespace sein, wenn gefolgt von "::".        
    
    Fehler        error C2065: 'button1_Click': nichtdeklarierter Bezeichner
    Fehler        error C2039: 'button1_Click': Ist kein Element von '`global  namespace''        
    Fehler        error C3924: Fehler in Argument #2 des Delegatkonstruktoraufrufs "System::EventHandler":
    

    Phil74



  • Sieht so aus als wäre "newMDIChild" keine Klasse sondern ein Objekt.



  • Form2^ newMDIChild = gcnew Form2

    Objekt?, Instanz?



  • Wenn Du es genau nehmen willst eine Referenz, die auf eine Instanz (oder ein Objekt) verweist. Ist aber auch egal, da vor :: ein Typ stehen muss, kein Variablenbezeichner. Also müsste dort &Form2::button1_Click stehen, aber dann beschwert sich der Compiler, dass eine Methode aus Form2 nicht mit einem Objekt aus Form1 aufgerufen werden kann. Leider weiss ich nicht, wie man ein Objekt an einen Delegaten in C++/CLI bindet...

    EDIT:
    Quatsch, doch, weiss ich 🤡

    So müsste es lauten:

    button1->Click += gcnew System::EventHandler(newMDIChild, &Form2::button1_Click);
    


  • Könnte es vielleicht mit einer generischen Klasse des Buttons gehen, die ich in Form1 include?

    Gruss


Log in to reply