OOP + Globale Variablen



  • Hallo,

    In OOP ist es anscheinend nicht möglich auf globale Variablen zuzugreifen, dennoch bräuchte ich dies.

    In meiner Klasse erstelle ich dynamisch eine Form -> und bei einem OnActivate wird eine Funktion aufgerufen die mir das zugehörige Handle speichern soll,...

    Leider kann ich auf keine Variable außerhalb zugreifen ?
    Gibt es hierfür eine Möglichkeit ?



  • Hallo

    - es gibt get- und setmethoden.
    - warum denkst du, dass globale Variablen nicht gehen?
    - du kannst Variablen auch an Klassen via Konstruktor übergeben

    chrische



  • chrische5 schrieb:

    Hallo

    - es gibt get- und setmethoden.

    Und die wären ?



  • Hallo

    Die musst du für die entsprechende Variable schon selber schreiben.

    chrische



  • Achso meinst du das,....
    Ok verständlich, aber das Problem ist dass ich ja eben innerhalb meiner klasse nicht auf die gloabel variable zugreifen kann....
    Da nützt mir doch sogar eine SetFunktion nichts oder ?



  • Hallo

    Das sind ja dann auch keine globalen Variablen mehr. Warum kannst du denn eigentlich nicht auf globale Variablen zugreifen? Was kommt da für eine Fehler?

    chrische



  • [BCC32 Fehler] main.h(57): E2231 Element TForm1::test kann nicht ohne ein Objekt verwendet werden

    class TForm1 : public TForm
    {
    
    public:		// User declarations
    	__fastcall TForm1(TComponent* Owner);
    
    	TForm *ActiveForm;
    	TImage *ActiveImage;
    	AnsiString SavePath;
    	int test;
    
    class Picture{
    	private:
    		void __fastcall aktiv(TObject *Sender)
    		{
    			test=10;
    		}....
    


  • Hallo

    Das ist doch auch keine globale Variable, sondern ein Member von TForm1.

    int test;
    
    class TForm1 : public TForm
    {
    
    public:        // User declarations
        __fastcall TForm1(TComponent* Owner);
    
        TForm *ActiveForm;
        TImage *ActiveImage;
        AnsiString SavePath;
    
    class Picture{
        private:
            void __fastcall aktiv(TObject *Sender)
            {
                test=10;
            }....
    

    Das ist hässlich, aber dürfte funktionieren.

    chrische



  • Stimmt,...
    Doch dann kann ich aus einer anderen Form nicht mehr auf die (jetzt,.. wirklich globale Variable zugreifen!)

    Gibt es keinen Weg von meiner unterklasse picture auf die oberklasse TForm zuzugreifen ?



  • Woher soll die Unterklasse denn wissen, auf welchen Objektes Variablen sie zugreifen soll? Du mußt ihr schon eines übergeben.



  • Hallo

    Du könntest die globale Variable in eine Datei schreiben, die von allen Datein inkludiert wird. Du könntest aber der Klasse picture auch einfach eine Variabel im Konstruktor mitgeben:

    TForm1
    
    -> member int test = 01;
    
    Picture
    
    -> member int _test;
    c'tor: 
    public Picture(int test)
    {
    _test = test;
    }
    

    chrische



  • audacia schrieb:

    Woher soll die Unterklasse denn wissen, auf welchen Objektes Variablen sie zugreifen soll? Du mußt ihr schon eines übergeben.

    Form1->test

    funktioneirt ja leider auch nicht 😞

    Danke für die Vorschläge aber !



  • Hallo

    Übergib' der Klasse doch Picture doch einfach im Konstruktor den Wert den es bekommen soll. Genauso, wie ich es geschrieben habe. Wenn es dabei Probleme gibt, dann helfen wir dir sehr gerne.

    chrische



  • Konstruktor

    Picture(AnsiString dir,TForm *ActiveForm){
    

    und die Funktion

    private:
    
    		void __fastcall aktiv(TObject *Sender)
    		{
    			ActiveForm=Window;
    		}
    

    Würde mir meine Logik nun sagen, der Compiler widerspricht mir leider 😕
    undef. Symbol...



  • Hallo

    Was ist Window und was machst du im Konstruktor mit den Parametern?

    chrische



  • Hier alles...

    class Picture{
    	private:
    
    		void __fastcall aktiv(TObject *Sender)
    		{
    			ActiveForm=Window;
    		}
    
    	public:
    
    		TForm *Window;
    		TImage *Image;
    		TStatusBar *bar;
    		int m_Width;
    		int m_Height;
    
    		__property int Height ={read=m_Height};
    		__property int Width ={read=m_Width};
    		//-------------------------------------------->>>>>>
    
    		Picture(AnsiString dir,TForm *ActiveForm){
    
    		Window = new TForm(Application);
    		Image = new TImage(Window);
    		bar = new TStatusBar(Window);
    
    		Image->Picture->LoadFromFile(dir);
    		Image->AutoSize=true;
    		Image->Width=Image->Picture->Width;
    		Image->Height=Image->Picture->Height;
    		Image->Align=alClient;
    		Image->Parent=Window;
    
    		Window->Caption=ExtractFileName(dir);
    		Window->BorderStyle=bsToolWindow;
    		Window->Width = Image->Picture->Width;
    		Window->Height = Image->Picture->Height;
    		Window->Position=poMainFormCenter;
    
    		Window->OnActivate=aktiv;
    
    		m_Width=Window->Width;
    		m_Height=Window->Height;
    
    		bar->SimpleText=IntToStr(Width)+" x "+IntToStr(Height);
    		bar->SimplePanel=true;
    		bar->Parent=Window;
    
    		Window->Show();
    		}
    
    		//-------------------------------------------->>>>>>
    
    		~Picture(){
        	delete bar;
    		delete Image;
    		delete Window;
    		}
    
    	};
    

    Window ist dass durch die Klasse erzeugte neue Form,..



  • Hallo

    Zuerst solltest du deine Membervariablen private machen, vor allem, wenn du dann noch Properties dafür schreibst. Der zweite Punkt ist der, dass du nun eine Variable an den Konstruktor übergibst, aber gar nichts damit machst. Du solltest dir vielleicht noch einmal die Grundlagen von OOP reinziehen.

    chrische



  • Die Frage ist wohl eher wie ich meinen Übergebene Wert an die Funktion übergebe, da ich bei

    Window->OnActivate=aktiv;
    

    Keine Variablen übergeben darf,...



  • Hallo

    Ich kenne mich mit VCL nicht aus, aber was du machst, ist Quatsch. Du übergibst den Konstruktor einen Parameter und lässt diesen links liegen.

    chrische



  • Global nun richtig:

    TForm *ActiveForm;
    TImage *ActiveImage;

    void __fastcall aktiv(TObject *Sender)
    		{
    			ActiveForm 	= Window;
    			ActiveImage = Image;
    		}
    

    Funktioniert nun 😉
    Lediglich das Zugreifen auf die MEthoden von TForm bzw. TImage der beiden funktioniet nicht 😕

    Der Debugger z.B. liest schön und gut die richtige Caption raus, verändere ich diese und quittiere ich die änderung mit einem
    ActiveForm->Update();
    Kommt eine FEhlermeldung

    Zugrissverletzung bei Adresse 20139079 in Modul vcl100.bpl
    Lesen von Adresse 0000 004C nicht möglich... 😕
    Find ich skuril!


Anmelden zum Antworten