Eigenschaften von Steuerelemente in Form2 ändern



  • Jochen Kalmbach schrieb:

    Das IMHO beste ist in dem entsprechenden Form ein public-property zu machen, welches dann die geünschte Aktion durchführt. Vom Form1 aus wird nun dieses Property angesprochen und im Form2 wird es dann intern auf das entsprechende Control weitergeleitet.

    Ich verstehe das so:
    Ich deklariere eine public-Variable z.B vom Typ 'bool'(um bei meinem Bsp. von oben zu bleiben) und weise ihr in Form1 einen Wert zu. In Form2 lese ich dann diese Variable aus und ändere die Eigenschaft, richtig?

    Dann hab ich die Frage:
    An welcher Stelle in meinem Code muss ich die Variable deklarieren, damit ich sie auch in Form2 verwenden kann.



  • Nein,

    die Variable erstellst Du als private und erstellst daraus ein property:

    ref class A
    {
    private: System::String ^ m_eigenschaft;
    property System::String ^ eigenschaft
    {
       System::String ^ get(){return m_eigenschaft;}
       void             set(System::String ^ t){m_eigenschaft = t;}
    }
    };
    A a;
    a.eigenschaft = "Hallo Welt";
    

    Eventuell macht es sinn bei get ein const zurück zu geben (wo wäre sonst der vorteil ?) , ich hab es aber nie probiert.



  • Sorry, wenn meine Fragen nerven (Newbie halt 🙄 ), aber wo muss ich das in den Code schreiben.
    Kannst Du mir evtl. mal den Code von beiden Header-Dateien schreiben?
    Wäre echt super nett! 🙂

    Vielleich trotzdem nochmal die Frage:

    An welcher Stelle in meinem Code muss ich eine Variable deklarieren, damit ich sie auch in Form2 verwenden kann.

    Das brauche ich nämlich trotzdem für was anderes... 😃



  • Such Dir mal die Stelle in Deinem Buch, die sich mit Klassen und Objekten beschäftigt und lies dann ein wenig über public und private .

    Ansonsten fällt mir nur ein: Die Deklaration der Variable sollte im Header innerhalb der Klasse stehen und die Definition (und somit deklaration) des Properties ebenfalls innerhalb der Klasse im Header (ich weiß nicht wie ich beim property definition und deklaration trennen kann).

    Eventuell verstehe ich auch Deine Frage nicht.



  • In deinem "Form2.h" machst Du folgendes ganz ans Ende der Klasse rein:

    public:
      property bool MyBoolProperty
      {
        bool get() { return this->label1->Enabled; }
        void set(bool val) { this->label1->Enabled = val; }
      }
    

    Dann kannst Du direkt vom Form1 auf dieses Property einer Form2-Instanzu zugreifen.



  • Hi noch mal!

    Eine Frage hab ich aber immer noch:
    Wie kann ich eine globale Variable deklarieren? Also eine Variable, die ich in jeder Form verwenden kann.

    Ich stell mir das irgendwie so vor:

    //Form1.h
    
    public: 
    	int Name_der_Variable;
    
    //Form2.h
    
    Name_des_Projekts::Name_der_Form::Name_der_Variablen = 7;
    

    Dann kommt aber der Fehler: „error C2597: Ungültiger Verweis auf nicht-statischen Member“.

    Habt ihr da 'ne Idee???



  • ref class Globals sealed abstract
    {
    public:
      static String ^MyGlobalVariable;
    };
    

    Und zugreifen z.B. via:

    Console::WriteLine(Globals::MyGlobalVariable);
    

    PS: Aber wenn man globale Variablen hat, dann ist i.d.R. irgendwas am Design schief...



  • ja,

    die globale Variable als solche ansprechen und nicht der Form zuweisen. Am besten keine globalen Variablen verwenden (und sich mit dem Thema sichtbarkeitsbereiche auseinander setzen).

    Zudem: Bitte nicht das extern vergessen wenns schon global sein muss und vorweg: Mit managed Klassen geht keine globale Variable, hier musst Du ein wenig den Gedankenweg eines Singelton folen. (statische Variable in eine Klasse legen, die Du als solche verwenden kannst).



  • Jochen Kalmbach schrieb:

    ref class Globals sealed abstract
    {
    public:
      static String ^MyGlobalVariable;
    };
    

    ...hab ich in mein Programm in Form1 eingebunden. Kann in Form1 auch die Variable auslesen und editieren.

    Aber wenn ich in Form2 schreibe:

    Console::WriteLine(Globals::MyGlobalVariable);
    

    ...dann kommt:
    "error C2653: 'Globals': Keine Klasse oder Namespace" 😞



  • Vllt dafür sorgen, das die Klasse Globals auch überall bekannt ist ?

    Wo hast Du denn Globals deklariert ?



  • Knuddlbaer schrieb:

    Vllt dafür sorgen, das die Klasse Globals auch überall bekannt ist ?

    Wo hast Du denn Globals deklariert ?

    In Form1.h:

    #pragma region Windows Form Designer generated code
    		void InitializeComponent(void)
    		{ ...}
    
    ref class Globals sealed abstract 
         { 
             public: 
                static String ^MyGlobalVariable; 
         };
    
    #pragma endregion
         ...
    

    Falsch?



  • ja, so ist es auch nur in Form1 sichtbar bzw. Du müsstest Form1.h in Form2.h includieren.

    Evnetuell wäre es sinvoller, die Klasse in einen eigenen Header zu packen und diesen in Form1.h UND Form2.h zu includieren (oder in die stdafx.h, womit die Deklaration auch überall sichtbar wäre, die stdafx.h wird ja automatisch beim Anlegen von Klassen includiert).

    Hinzu kommt noch, das die Klasse als <unbekannt, vermutlich private> in Form1 liegt. Du müsstest also mit

    Form1::Globals darauf zugriefen, sofern diese dann public wird. Nimm die Deklaration aus der Form raus.

    Wenn Du dann noch ein

    ref struct Globals ... daraus machst, kannst Du Dir das public innerhalb der Klasse sogar sparen.


Anmelden zum Antworten