Anfängerproblem mit Propertys



  • Hallo,

    ich würde gerne von einer cpp aus auf die Steuerelemente in Form1 zugreifen. Wie ich gelesen habe ist der sauberste Weg über Propertys. Ich mach also folgendes:

    In der Form1.h

    public ref class Form1 : public System::Windows::Forms::Form
    	{
    
    	public: 
    		property String ^MyProperty 
    		{ 
    			String^ get(){ return this->label1->Text; } 
    			void set(String^ val) { this->label1->Text = val; } 
    		}
    
          //...
          //...
    

    Über einen Button wird mymain() in der cpp aufgerufen, in der ich auf das Property zugreifen will:

    #include "stdafx.h"
    #include "Form1.h"
    
    using namespace myproject;
    
    [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;
    }
    
    void mymain()
    {
    	Form1 f1;
    	f1.MyProperty = "123";
    
    }
    

    Das liefert mir keinen Fehler, aber es funktioniert auch nicht..mein Label ändert sich nicht.

    Vielen Dank im Voraus für eure Hilfe,

    Konrad



  • Weil Du ein neues Form1 erstellst ... und dort änderst Du das Label ... da aber die neue Formnicht angezeigt wird, siehst Du nix

    nimm Dir mal bitte ein Handbuch für OOP



  • ..ein Handbuch werd' ich mir besorgen. Aber als Hobby-Programmierer finde ich es motivierender, ein eigenes Projekt zu starten als Kapitel durchzuarbeiten.

    Weil Du ein neues Form1 erstellst ..

    Ok, dann muss ich wohl auf das bestehende Form zugreifen.. aber wie?
    Wenn ich mal ganz naiv versuche, mein Form1 in der cpp oben zu deklarieren mit

    Form1 fo1;
    

    oder

    Form1 ^ f1 = gcnew Form1;
    

    dann heißt es:

    Eine globale oder statische Variable darf nicht den verwalteten Typ "myproject::Form1" aufweisen.

    Ok, meine Form-Klasse ist also (speicher?)verwaltet und darf deshalb nicht global sein..macht Sinn. Aber wie kann ich dann global auf ein Property von Form1 zugreifen?

    Gruß,

    Konrad



  • @Mogel super Hilfe 🙄

    Wie und wo greifst Du auf void mymain() zu?
    Du kommst nie in den Code, nimm mal den Debugger!

    Aber nanun, nimm mal ein Button auf Deine Form und lege diesen Code rein.

    MyProperty::set("123");
    

    Gruß,

    Doug_HH



  • Das mit dem Button funktioniert schon mal, danke!

    Auf void mymain() wird schon korrekt zugegriffen, der restliche Code wird
    definitiv ausgeführt (ein Sound mit fmod wird abgespielt).

    Das mach ich über einen weiteren header, in dem void mymain() deklariert
    wird (und der in Form1.h includiert wird).



  • myproject.cpp

    // myproject.cpp: Hauptprojektdatei.
    
    #include "stdafx.h"
    #include "Form1.h"
    
    using namespace myproject;
    
    [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;
    }
    
    System::Void Form1::mymain() 
    { 
    	this->MyProperty::set("123"); 
    }
    

    Form1.h

    #pragma once
    namespace myproject {
    
    	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:
    		property String ^MyProperty 
            { 
                String^ get()
    			{ 
    				return this->label1->Text; 
    			} 
                void set(String^ val) 
    			{ 
    				this->label1->Text = val; 
    			} 
            }
    
    	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;
    	protected: 
    	private: System::Windows::Forms::Label^  label1;
    	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->label1 = (gcnew System::Windows::Forms::Label());
    			this->SuspendLayout();
    			// 
    			// button1
    			// 
    			this->button1->Location = System::Drawing::Point(350, 81);
    			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);
    			// 
    			// label1
    			// 
    			this->label1->AutoSize = true;
    			this->label1->Location = System::Drawing::Point(154, 91);
    			this->label1->Name = L"label1";
    			this->label1->Size = System::Drawing::Size(35, 13);
    			this->label1->TabIndex = 1;
    			this->label1->Text = L"label1";
    			// 
    			// Form1
    			// 
    			this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
    			this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
    			this->ClientSize = System::Drawing::Size(715, 430);
    			this->Controls->Add(this->label1);
    			this->Controls->Add(this->button1);
    			this->Name = L"Form1";
    			this->Text = L"Form1";
    			this->ResumeLayout(false);
    			this->PerformLayout();
    		}
    #pragma endregion
    private: void mymain();
    private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) 
    		{
    			mymain();
    		}
    	};
    }
    


  • Ok, so geht's, Danke!


Log in to reply