[erledigt]von einer selbsterstellten Klasse auf eine form zugreifen



  • Hallo ich möchte gerne von einer selbsterstellten Klasse auf elemente in meiner Form zugreifen. Ich habe auch schon fleißig gegoogelt und auch einen Ansatz gefunden.

    Form1^ f = (Form1^)this->Owner; /* CForm1-Objekt*/
    

    wenn ich nun versuche mit f-> auf die elemente der form zuzugreifen passiert nichts als ob er diese nicht kennen würde.

    könnt ihr mir bitte weiterhelfen ??



  • #include "form1.h"
    

    vergessen?



  • nein das habe ich gemacht

    #include "StdAfx.h"
    #include "server.h"
    #include "Form1.h"
    
    server::server(void)
    {
    }
    server::test()
    {
    
    	Form1^ f = (Form1^)this->Owner; /* CForm1-Objekt*/
    


  • Posthorn schrieb:

    könnt ihr mir bitte weiterhelfen ??

    Könntest du bitte auch die Fehlermeldung mit angeben?

    Und was ist server für ein Typ?



  • hallo ich bekomme noch gar keine fehlermeldung da ich ja an der stelle nicht weiterkomme.

    das ist meine server.h es ist im moment noch nichts richtiges da ich halt an dem zugriff auf die form scheitere. ich möchte halt z.b. über die klasse den Text des Labels ändern ....

    #pragma once
    
    ref class Form1 : server
    {
    public:
    	server(void);
    	void test();
    };
    

    das

    Form1 : server
    

    habe ich auch irgendwo bei meinen googelversuchen gefunden und ob es richtig ist weiß ich leider nicht.



  • Du musst die Form, von der Du auf die Form1 zugreifen willst, mit dem this Zeiger aufrufen.

    Form2^ _newForm = gcnew Form2;
    _newForm->ShowDialog(this);
    

    Du musst auch die Form1.h in Form2.cpp (die Form die auf Form1 zugreift) inkludieren.

    Hier ein kleines Beispiel...

    http://www.rb-softarticle.com/class.rar

    Gruß Doug_HH



  • Posthorn schrieb:

    hallo ich bekomme noch gar keine fehlermeldung da ich ja an der stelle nicht weiterkomme.

    Also mit anderen Worten, du versuchst noch nicht einmal zu compilieren oder wie?
    Deine Beschreibung ist auf jedenfall nicht ausreichend. Vielleicht solltest du dich einmal in die Gedanken derer versetzen, die versuchen deine Probleme zu verstehen - wenn man jemanden alle Informationen aus der Nase ziehen muss, wird selten jemand helfen.

    Und um mal auf den Code einzugehen:

    ref class Form1 : server
    {
    public:
        server(void);
        void test();
    };
    

    Ich kenne C++/CLI nur grundlegend, und bin eigentlich in C++ heimisch. Aber was du hier tust ist eine Ableitung. Du sagt hier, das Form1 ein server ist. Ich bezweifel das dies wirklich deine Intention ist.

    Nimm dir ein Buch oder Tutorial zu Hand, und arbeite es durch - das was man an den Codeausschnitten sieht, ist das dir die Grundlagen fehlen.



  • asc schrieb:

    Deine Beschreibung ist auf jedenfall nicht ausreichend. Vielleicht solltest du dich einmal in die Gedanken derer versetzen, die versuchen deine Probleme zu verstehen - wenn man jemanden alle Informationen aus der Nase ziehen muss, wird selten jemand helfen.

    tut mir leid ich werde nochmal beschreiben was mein Problem ist 🙂

    ich möchte gerne das eine selbstgeschriebene Klasse (nennen wir sie mal ) XY
    die in der Datei XY.h und XY.cpp gespeichert ist auf die Elemente in einer Form zugreifen kann, z.b. ein textfeld oder ein label, und die Klasse dann z.b. den Text des Labels ändern kann oder denn Text eines Textfeldes auslesen.

    und genau da liegt mein problem ich finde leider in meinen Büchern keinen Ansatz dafür und auch googeln brachte mich nicht wirklich weiter.

    ----------------------------------------------

    ich denke aber mal das ich die lösung jetzt gefunden habe dank dem Beispiel von Doug (nur eine vermutung sollte sie falsch sein berichtigt mich bitte)🙂 ich habe nicht daran gedacht das sämtliche Elemente der Form Private sind und so kann ich natürlich nicht aus meiner Klasse auf diese Elemente zu greifen deswegen muß ich dann noch in dem Formblock eine eigene Funktion schreiben die dann z.b. die gewünschte änderung an dem Textfeld durchführt

    hier ein ausschnitt aus der class.rar

    public: void _labelAendern(Color _newColor)
    {
    	label1->ForeColor::set(_newColor);
    }
    

    ist meine aussage so richtig ??

    ← ist noch ein anfänger was c++ angeht 😉 ich bitte um rücksicht



  • Posthorn schrieb:

    ich möchte gerne das eine selbstgeschriebene Klasse (nennen wir sie mal ) XY die in der Datei XY.h und XY.cpp gespeichert ist auf die Elemente in einer Form zugreifen kann,...

    Dann muss die Klasse XY ein Verweis auf die konkrete Instanz der Form besitzen.

    Wie gesagt, bin ich mit C++/CLI kaum vertraut so das folgendes nur ein Beispiel ohne Garantie auf Fehlerfreiheit ist:

    ...
    {
      // Irgendwo musst du ja deine Form anlegen
      Form1 ^ form = new Form1();
      // Um ein anderes Objekt auf diese Instanz Zugriff zu geben, benötigt
      // dies die Kenntnis über die Instanz (sprich "form")
      // Nehmen wir einfach mal an, das der Konstruktor der Klasse XY diese
      // Referenz annimmt:
      XYZ ^ xyz = new XYZ(form);
    }
    ...
    
    ref class XYZ
    {
      private:
         Form1 ^ form; // Referenz auf eine Form1 Instanz
      public:
         XYZ(Form1 ^ form)
         {
             this->form = form;
         }
    
         void _labelAendern(Color _newColor)
         {
             form->label1->ForeColor = _newColor;
         }
    };
    

    cu André



  • danke asc für die hilfe das hab ich jetzt zumindest verstanden.

    jedoch wenn ich das umsetzen möchte bekomme ich folgenden Fehler:

    XYZ.h(7) : error C2143: Syntaxfehler: Es fehlt ';' vor '^'
    

    und das ist mein Code

    #pragma once
    #include "Form1.h"
    
    ref class XYZ
    {
    private:
    	Form1^ form;
    public:
    
    	XYZ(void);
    	void test(void);
    	void form1_zuweisen(Form1^ form);
    
    };
    


  • Posthorn schrieb:

    jedoch wenn ich das umsetzen möchte bekomme ich folgenden Fehler:

    Ich rate jetzt einfach mal wild drauf los:
    a) Heißt deine Form vielleicht anders?
    b) Ist am Ende der Formklasse ein Semikolon gesetzt wurden?

    cu André



  • a) Heißt deine Form vielleicht anders?

    nicht das ich wüßte 😞 zur sicherheit mal meine form1.h gekürzt auf den anfangsbereich.

    namespace Test_prog {
    .......
    
    public ref class Form1 : public System::Windows::Forms::Form
    	{
    	public:
    		Form1(void)
    		{
    ...........
    

    b) Ist am Ende der Formklasse ein Semikolon gesetzt wurden?

    ja das ist gemacht wurden

    };
    }
    


  • Posthorn schrieb:

    nicht das ich wüßte 😞 zur sicherheit mal meine form1.h gekürzt auf den anfangsbereich.

    Wenn deine andere Klasse nicht im gleichen Namensraum liegt musst du diesen auch mit angeben.

    Schreib in deiner Klasse XYZ mal statt "Form1" "Test_prog::Form1".



  • das hatte ich auch schon probiert jedoch gibts auch dabei eine fehlermeldung

    error C2653: 'Test_prog': Keine Klasse oder Namespace
    

    😞 das kann doch nicht so kompliziert sein oder ?? 😞



  • Prüfe auf rekursive Includes. Includiert Form1.h z.B. xyz.h ?



  • du hattest recht vielen dank nachdem ich in der Form1.h den include auf die XYZ.h rausgenommen habe kompiliert er dann ohne probleme aber wie schaffe ich dann den zugriff auf meine klasse in XYZ.h ?? denn sobald ich die ja wieder include habe ich dann wieder das alte problem 😞 danke für eure geduld



  • Google/suche mal nach Vorwärtsdeklaration



  • Doug_HH schrieb:

    Du musst auch die Form1.h in Form2.cpp (die Form die auf Form1 zugreift) inkludieren.

    Gruß Doug_HH



  • Knuddlbaer schrieb:

    Google/suche mal nach Vorwärtsdeklaration

    ok vielen dank für den tipp leider habe ich da nur dürftige informationen gefunden und will mal beschreiben wie ich das aufgefasst habe 🙂

    wenn ich also von der form1.h auf meine klasse in XYZ.h zugreifen möchte muß ich diese Klasse mit

    ref class XYZ;
    

    bekannt machen. (ref deswegen da es ja CLR code ist richtig ??)

    wenn ich das dann versuche zu kompilieren bekomme ich aber die Fehlermeldung :

    error C2512: 'XYZ': Kein geeigneter Standardkonstruktor verfügbar
    

    was ja soweit verständlich ist da ich ja die XYZ nicht include.
    aber setze ich dann nach der Vorwärtsdeklaration wieder das #include "XYZ.h"; bekomme ich wieder die alte fehlermeldung das er die Form nicht kennt 😞

    darauf bin ich auf die Idee gekommen das ich doch noch eine vorwärstdeklaration in die XYZ.h auf die klasse form1 machen könnte. Leider spuckt mir dann der compiler ne ganze menge mehr fehlermeldungen aus die meine XYZ.cpp betreffen:

    error C2027: Verwendung des undefinierten Typs "XYZ"
    

    .
    .
    .
    .

    😞 das verwiirt mich alles ^^ bitte helft mir nocheinmal 🙂

    danke schon einmal im vorraus.

    EDIT: wieso wird v o r r a u s vom Schimpfwortfilter mit sternchen versehen ??? :p



  • Posthorn schrieb:

    EDIT: wieso wird v o r r a u s vom Schimpfwortfilter mit sternchen versehen ??? :p

    Weil es das Wort nicht gibt. Es heißt "voraus".


Log in to reply