Aufruf einer Methode



  • Hallo,

    habe zwei Klassen (es sind die einzelnen Blätter einer Registerkarte) und möchte eine Membervariable der einen Klasse von der anderen aus benutzten:

    CTabPage5::m_SelfSigned.SetCheck(FALSE);
    

    leider kommt komischer Weise dies Fehlermeldung:

    ...tabpage4.cpp(648) : error C2228: Der linke Teil von '.SetCheck' muss eine Klasse/Struktur/Union sein
    

    Was mach ich falsch? 😕



  • CTabPage5::m_SelfSigned
    

    ist keine Klasse/Struktur/Union.



  • und nu? Irgendwie muß ich doch dieses Controlzugreifen können...



  • hmm was ist m_SelfSigned denn für ein Datentype?

    aja und notfalls: reinterpret_cast<CButton>(GetDlgItem(...))->SetCheck(BST_UNCHECK); ...



  • m_SelfSigned ist ein CButton (Controltyp). Den habe ich mit dem klassen-assi in der Klasse CTabPage5 angelegt. Wie gesagt: CTabPage5 ist eine Klasse, die zu einem Ste von Registerkarten gehört und da muß man nu leider für jede Registerkarte eine eigene Klasse anlegen. Und deshalb muß ich von einer ("Register"-)Klasse auf die Variablen der anderen zugreifen...



  • Kennst Du den Unterschied zwischen einer Klasse und einer Instanz?

    Irgendwo im Code hast du sehr wahrscheinlich eine Instanz erzeugt.

    CTabPage5 myTabPage;
    

    Über

    myTabPage.m_SelfSigned
    

    kannst Du auf den Button zugreifen, wenn dieser als public deklariert wurde.
    Wenn du auf den Button in einer anderen Klasse zugreifen willst, musst du der anderen Klasse die Instanz deines CTabPage5 also myTabPage übergeben, und zwar am besten als Referenz.

    Was du machst

    CTabPage5::m_SelfSigned
    

    funzt nur, wenn dein Button als public und static deklariert wurde, was aber sehr wahrscheinlich nicht der Fall ist.

    Allerdings ist das ein zienlich übler Hack, wenn TabPages untereinander auf ihrer Controls zugreifen. Irgendwo ist dein Design suboptimal.



  • Vielen Dank für die Erklärung - werd's gleich mal ausprobieren. Du hast Recht: Ich kenn mich ganz gut aus mit C, aber nicht unbedingt mit Klassen, Instanzen und was es da sonst noch für merkwürdiges Zeug gibt...

    Retter schrieb:

    Allerdings ist das ein zienlich übler Hack, ...

    Eigentlich ist das ganze Ding eine Einheit - sprich alle Funktionen gehören logisch zusammen. Das ich jetzt mehrere Klasse habe statt einer, in der alles abläuft, ist nicht mein Fehler. Das wird von VC++ (od. MFC?) so vorgegeben. Die Registerkarten erfordern nun mal für jeden Reiter eine eigene Klasse! Was soll man da machen...



  • Hallo Retter,
    leider klappt's net! 😞 Es kompliert zwar, aber es gibt einen RuntimeError!

    CTabPage5 myTabPage;
    

    hab' ich vorher nicht gehabt - hab's scheinbar nicht gebraucht... 😕
    Habe es jetzt im globalen Teil des CCTabPage5.cpp Files eingefügt und dann in CCTabPage4.cpp als globale Variable darauf zugegriffen. Es sieht aber so aus, als wenn myTabPage keinen sinnvollen Wert hat. Wie bekommt es den? Habe es bereits mit

    CTabPage5 myTabPage = this;
    

    versucht, aber das geht nicht - auch

    myTabPage = this;
    

    im OnInitDialog() von CTabPage5 hat nicht funktioniert. Tja was nu? 😕



  • Ähm, Buch kaufen und C++ lernen. Sorry, aber ich kann dir nicht in einer Post Objekt-Orientierte Programmierung in C++ erklären.

    Wozu soll das gut sein?

    CTabPage5 myTabPage = this;
    

    Wenn dann so:

    CTabPage5 myTabPage = *this;
    

    Damit klonst du deine TabPage, aber das macht überhaupt keinen Sinn.

    Bei www.codeproject.com gibt es bestimmt Artikel darüber, wie man TabPages einsetzt.



  • 'scho recht - aber ich brauch C++ ja nur für das GUI (MFC-Dialoge) - der Rest ist schlicht C. Die Sache mit den tabPages klappt ja auch soweit ganz gut. nur von einer TabPage auf eine andere zugreifen halt net. Da fehlt irgendein Pointer oder so. Das ist schon alles was ich wissen müßt... is halt blöd gemacht von MS, daß jede Registerkarte einen eigenen Dialog (mit eigener Klasse) darstellt und man dann nicht auf dessen Elemente zugreifen kann... bräuchte da nur irgendeine Verbindug (Pointer mit entsprechender Initialisierung od. Ähnliches) 😕



  • johanna schrieb:

    is halt blöd gemacht von MS, daß jede Registerkarte einen eigenen Dialog (mit eigener Klasse) darstellt und man dann nicht auf dessen Elemente zugreifen kann... bräuchte da nur irgendeine Verbindug (Pointer mit entsprechender Initialisierung od. Ähnliches) 😕

    Was hindert Dich daran, den Konstruktor Deiner Tabpages um eben diesen Pointer zu erweitern und bei der Instanziierung Deiner Tabpages mit zu übergeben? Die anderen Konstruktoren machst Du ggfs. einfach private, damit keiner den Dialog ohne diesen Pointer benutzen kann.



  • Äh - ist bestimmt 'ne prima Idee, da ich aber leider nichts von "Konstruktoren" verstehe, bräuchte ich ein paar Codezeilen, um zu kapieren, was Du meinst... 😕

    Da die ganze Klassengeschichte vom Klassenassi erledigt wird, weiß ich auch leider nicht, wo die Dialogklassen denn überhaupt instansziert werden (evt. durch den DoModal-Aufruf?), bzw. was ich da wie ändern müßte, damit es funzt... - wie gesagt, ich programmiere eigentlich nur C...

    jencas schrieb:

    ...den Konstruktor Deiner Tabpages um eben diesen Pointer zu erweitern...

    wie denn? 😕

    jencas schrieb:

    bei der Instanziierung Deiner Tabpages mit zu übergeben

    wo und wie genau? 😕

    Aber schon mal vielen Dank für Deine Hilfe! 🙂


Anmelden zum Antworten