Globale Variable in Windows Forms



  • Hallo,
    Ich habe eine Windows Forms Anwendung (C++) erstellt, in der es 2 Forms gibt. Form1 und Form2. Form2 lasse ich über einen Button in Form1 starten. Jetzt wollte ich diese beiden Forms miteinander kommunizieren lassen. Mein erster Gedanke war es, eine globale Variable zu erstellen, auf die beide Forms zugriff haben. Aber egal, wo ich die globale Variable hinsetze, für eine der beiden Form bekomme ich immer die Fehlermeldung, dass die Variable undeklared wäre. Wo muss also eine globale Variable plaziert sein, sodass alle Form-Anwendungen darauf zugreifen können 😕



  • Ich habe das Problem nun beinahe gelöst. Mein Ansatz ist folgender:
    Ich habe eine "globals.h" erstellt, in der ich die globalen Variablen speichere:

    //global.h
    class globals
    {
    public:
    static long double main_opacity;
    };
    

    in Form1.h inkludiere ich die Klasse und initialisiere main_opacity.

    //Form1.h
    #include "global.h"
    long double globals::main_opacity = 0;
    
    //using anweisungen und namespace
    
    public ref class Form1 : public System::Windows::Forms::Form
    {
        //...
        private: System::Void Load_b_Click(System::Object^  sender, System::EventArgs^  e) {
    
            globals::main_opacity = this->Opacity; //opacity von Form1 speichern
    
            Form2^ testDialog = gcnew Form2(); //neue Form erzeugen
            testDialog->ShowDialog(this);
    
    		 }
    };
    

    Bei Form2.h habe ich wieder den header inkludiert und benutze meine globale variable so:

    //Form2.h
    #include "global.h"
    
    public ref class Form2 : public System::Windows::Forms::Form
    {
        void InitializeComponent(void)
        {
            //...
            this->Opacity = globals::main_opacity;
        }
    };
    

    Zusätzlich verwende ich eine Forwad Deklaration der Klasse in der Projekt.cpp:

    //Projekt cpp
    class globals;
    
    #include "stdafx.h"
    
    #include "Form2.h"
    #include "Form1.h"
    
    [STAThreadAttribute]
    int main(array<System::String ^> ^args)
    {
        //...
    }
    

    Das ganze funktioniert auch (Form2 wird mit der richtigen Opacity erstellt). Bloß wenn ich in das Ansichtsfenster von Form2 gehen will, bekomme ich Folgende Fehlermeldung:

    Um mögliche Datenverluste zu verhindern, müssen vor dem Laden des Designers folgende Fehler behoben werden:
    Das Feld main_opacity konnte nicht im Zielobjekt gefunden werden. Stellen Sie sicher, dass das Feld als Instanzenvariable für das Zielobjekt definiert ist und den richtigen Bereich hat.
    
    bei System.ComponentModel.Design.Serialization.CodeDomSerializerBase.Error(IDesignerSerializationManager manager, String exceptionText, String helpLink)
    bei System.ComponentModel.Design.Serialization.CodeDomSerializerBase.DeserializeExpression(IDesignerSerializationManager manager, String name, CodeExpression expression)
    bei System.ComponentModel.Design.Serialization.CodeDomSerializerBase.DeserializePropertyAssignStatement(IDesignerSerializationManager manager, CodeAssignStatement statement, CodePropertyReferenceExpression propertyReferenceEx, Boolean reportError)
    bei System.ComponentModel.Design.Serialization.CodeDomSerializerBase.DeserializeAssignStatement(IDesignerSerializationManager manager, CodeAssignStatement statement)
    bei System.ComponentModel.Design.Serialization.CodeDomSerializerBase.DeserializeStatement(IDesignerSerializationManager manager, CodeStatement statement)
    

    Wie löst man dieses Problem richtig 😕



  • Ändere nichts im void InitializeComponent(void) ! Das mag der Designer nicht - egal wie beschissen der Code darin aussieht!

    Füde den gewünschten Code nach dem InitializeComponent() -Aufruf im Konstruktor von Form2 ein.



  • Du hattest recht, danke! jetzt funktioniert alles



  • Ich habe eine Verständnisfrage:

    Ich hab bemerkt, daß man auf die gleiche Art eine globale Variable definieren kann - also ohne das 'Klassenkonstrukt' des Vorredners.

    Vorgehensweise war: Die entsprechende Variablendeklaration in eine ".h" Datei packen, das ganze eingeschlossen in eine "namespace"-Klammer, und diese Datei dann in alle Files inkludieren, in denen man gedenkt, diese Variable zu benutzen.

    Spasseshalber habe ich sie also in die Haupt-CPP (Hauptprojektdatei) eingebunden und in die "Form1.h", und konnte auf die Variable aus beiden Files heraus zugreifen - also Daten hin- und herschubsen.

    Warum funktioniert das? Die Variablen werden doch gefühlsmäßig "doppelt" deklariert, einmal in der CPP durch das include, einmal in der form1.h durch das include.
    Form1.h wird doch aus der CPP aufgerufen (oder mißverstehe ich da was)?

    Trotz dieser gefühlt "doppelten" Deklaration hat ein "int testvariable=0" in der "doppelt" eingebunden header-Datei nicht zur Folge, daß durch den Aufruf in forms.h ("zweite initialisierung") dann wieder 0 in diese Variable geschrieben würde. Warum nicht? Wo liegt mein Denkfehler?

    Danke für jegliche Erhellung 🙂

    Maugli


Log in to reply