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 übergebenchrische
-
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 FEhlermeldungZugrissverletzung bei Adresse 20139079 in Modul vcl100.bpl
Lesen von Adresse 0000 004C nicht möglich...
Find ich skuril!