Pointer von CDialog zu PropertyPage



  • Hallo erstmal.

    Ich habe da also ein Programm mit diversen Tabs. Aus einem dieser Tabs rufe ich mit Hilfe von DoModal einen CDialog auf. Darin befinden sich verschiedene Eingabefelder die auf Knopfdruck sich verändernde Daten von meinem Tab, aus dem ich den neuen Dialog aufgerufen habe, neu initialisiert. Hierzu habe ich eine Methode in meiner Klasse des Tabs erstellt. Quasi eine get-Funktion. Diese möchte ich nun von meinem Dialog aufrufen. Um dies zu ermöglichen wollte ich einen Pointer vom Typ

    CMyTab* pMyTab;
    

    erstellen und ihm dann die Adresse meines Tabs übergeben.
    Problem: in meinem Dialog kennt er anscheinend meine Klasse CMyTab nicht. Da kommen dann solche tollen Kompilierungsfehlermeldungen:

    error C2143: Syntaxfehler : Fehlendes ';' vor '*'
    error C2501: 'CMyTab' : Fehlende Speicherklasse oder Typspezifizierer
    

    Kann mir irgendjemand helfen? 😞



  • Gut erkannt - wenn die PropertyPage-Klasse erst nach dem Dialog definiert wird, ist sie im Dialog noch nicht bekannt (und der C++-Compiler arbeitet sich sequentiell durch den Quelltext). Also mußt du deinem Compiler mitteilen, daß es diese Klasse gibt - Stichwort "forward declaration".



  • Wie kann das denn sein, wenn ich doch erst einmal meinen Tab erstellen musste, um von da aus mit DoModal meinen Unterdialog aufzurufen 😕

    P.S. bin noch nicht wirklich mit C++ vertraut



  • Du hast die Klassen PropertyPage bzw. CMyTab und CMyDialog, die sich gegenseitig kennen müssen (der Tab, um einen Dialog erzeugen zu können, der Dialog benötigt Zugriff auf seinen Erzeuger). Und um das bewerkstelligen zu können, benötigst du Forward-Deklarationen (d.h. hier reicht vermutlich ein include an der richtigen Stelle:

    //Tab.h
    class CMyTab : public CPropertyPage
    {
      ...
    public:
      void OnButton1();
    };
    
    //Tab.cpp
    #include "Tab.h"
    #include "Dlg.h"
    
    ...
    
    void CMyTab::OnButton1()
    {
      CMyDialog dlg(this);
      dlg.doModal();
      ...
    }
    
    //Dlg.h
    #include "Tab.h"
    
    class CMyDialog : public CDialog
    {
      CMyTab* pMyTab;
    public:
      CMyDialog(CMyTab* caller)
      : CDialog(IDD_MYMIALOG,caller)
      , pMyTab(caller)
      {}
      ...
    };
    


  • hmm,

    error C2039: 'doModal' : Ist kein Element von 'CMyDialog'
    

    achso, weiß nicht ob das wichtig ist, aber ich programmiere in C++.



  • r0bb3n schrieb:

    hmm,

    error C2039: 'doModal' : Ist kein Element von 'CMyDialog'
    

    Sorry, mein Fehler - DoModal() schreibt sich mit großem D.

    achso, weiß nicht ob das wichtig ist, aber ich programmiere in C++.

    Also das hätte ich jetzt nicht erwartet 😃



  • Boar, ich danke dir so sehr!!! Es geht!1 😮

    Viele vielen Dank für deine Hilfe. Und wenn ich wieder was habe, dann melde ich mich wieder. 😉


Anmelden zum Antworten