(C++.Net) von einem Dialog auf den andern zugreifen
-
Hallo
ich habe zwei Forms. Beim erzeugen des zweiten Objektes übergebe ich im Konstruktor die Adresse des ersten Dialogs, damit ich später in diesem Änderungen vornehmen kann. Leider habe ich noch Probleme:es sieht jetzt bei mir so aus:
Code:private: Form1* m_form1; public: myClass2(Form1* form) { m_form1 = form; InitializeComponent(); }
Der Aufruf:
Code:myClass2* testclass; this->testclass= new myClass2(this); testclass->ShowDialog();
wenn ich jetzt in myClass2 auf m_form1 zugreifen will bekomm ich immer ein Fehler:
Code:m_form1->testvar = 10;
error C2027: use of undefined type 'TestProjekt::Form1'
error C2227: left of '->testvar must point to class/struct/union*Wie kann ich das abfgangen? An was liegt das?
Vielen Dank
-
Ich kann Dir jetzt zwar nicht direkt bei Deinem Problem helfen, da ich nicht Managed C++ programmiere. Ich habe habe aber gesehen, dass Du den zweiten Dialog Modal aufrufst. Von daher kann ich Dir einen Tipp geben wie Du das umgehst.
Nimm statt einem Zeiger eine Instanz vom zweiten Dialog her.
Lege eine public Variable im zweiten Form an.
Nachdem Du aus dem modalen Aufruf zurück in den ersten Form kommst, greifst Du über die Instanz auf die public Variable (testVar) zu. Im C# würde das ungefähr so aussehen.Button1Click(object sender, SystemEventArgs e) { Form2 myForm = new Form2(); myForm.ShowDialog(); this.myTargetVar = myForm.testVar; }
Damit kannst Du Dein Problem nur umgehen. Warum das bei Dir jetzt nicht funktioniert, kann ich Dir einfach nicht sagen, weil ich nichts mit Zeigern am Hut habe (C# sei Dank :p ), und nicht genau über deren Verwendung bescheid weiß.
Gruß
Markus Seidl
-
danke geht.
Warum hab ich das so kompliziert gemacht?
-
Weil man auf die einfachsten Lösungen immer zuletzt kommt ;), und weil Du im C++ mit Zeigern arbeiten kannst ;).
Rein Theoretisch wäre es bei einem Modalen Aufruf sogar über return Funktion möglich. Wenn man aus der zweiten Form Klasse den Aufruf ShowDialog überläd (bzw. wenn Du keine Paramete Liste angibst, wirst Du das normale Show Dialog verdecken), und dann statt einem Void einen Integer "ShowDialog" erzeugt. Dann kann man sich sogar diese öffentliche Variable sparen. Du kannst aber auch einen Alternativen ShowDialog erzeugen (z.B. ShowDialogInt). Würde im C# ungefähr so aussehen.
//zusätzliche Funktion in der Klasse des aufzurufenden Dialogs (Form2) public int ShowDialogInt() { this.ShowDialog();//erst wenn der Dialog geschlossen wird, springt er weiter zum "return" return testVar; }
Und der Aufruf der Funktion würde so aussehen. Damit kannst Du Dir sogar eine instanzierte Variable sparen
//Kurze Schreibweise public void Button1Click(object o, SystemEventArgs e) { this.myTargetVar = (new Form2()).ShowDialogInt(); } //In der Normalform sieht das so aus :) public void Button1Click(object o, SystemEventArgs e) { Form2 testForm = new Form2(); this.myTargeVar = testForm.ShowDialogInt(); }
Gruß
Markus Seidl