Zugriff von MainFrame auf FormView



  • Hello again,

    habe eine SDIApp, als View eine FormView mit einigen Controls.

    Kurze Frage: Wie kann ich eine eigene Funktion in der FormView aus CMainFrame aufrufen?

    grüssle 🙂



  • Ich bin mal so frei und schicke dich weiter ins Magazin.



  • Danke erstmal, aaaaber:

    5 C...View

    Den View bekommt man mit
    C/C++ Code:
    C...View* pView = dynamic_cast<C...View*>(((CMainFrame*)AfxGetMainWnd())->GetActiveView());
    ASSERT(pView);

    Soweit war ich auch schon. Damit komme ich an die View, aber nicht an meine 😞

    Wenn ich jetzt C...View durch meine CMyView ersetze, kommt ein Fehler 'error C2065: 'CMyView' : nichtdeklarierter Bezeichner'.
    Also Header einbinden.
    Danach muckt er aber im Header von CMyView, und zwar hier:

    // Attribute
    public:
    	CMyDoc* GetDocument();
    

    🙄 😮

    Da hab ich doch was übersehen, gelle? Aber was???
    grüssle 🙂



  • Und wie äußert dieses "muckt"?



  • CStoll schrieb:

    Und wie äußert dieses "muckt"?

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

    😕

    grüssle 🙂



  • Der Compiler kennt den Bezeichner "CMyDoc" nicht und kommt deshalb aus dem Tritt - vermutlich hast du noch einen Header (oder Forward-Deklaration) vergessen.



  • Stimmt, der Header der *Doc muss noch vor dem *View Header in die MainFrame.cpp.
    Allerdings kommt jetzt:

    MainFrm.cpp(129) : warning C4541: 'dynamic_cast' für polymorphen Typ 'class CView' mit /GR- verwendet; unvorhersehbares Verhalten moeglich
    

    Und bei Ausführung an dieser Stelle eine Exception 😮

    /GR ist doch ein Compilerschalter, oder liege ich da falsch?

    grüssle 🙂



  • Ja, GR ist ein Compilerschalter - und unter "/GR-" werden einige Daten, die dynamic_cast benötigt, nicht angelegt. (umstellen kannst du das in den Projektoptionen unter C/C++ -> "C++ Language" -> "Enable Run-Time Type Information (RTTI)")

    PS:

    estartu schrieb:

    Vom Mainframe aus kann man das AfxGetMainWnd weglassen.



  • Schwere Geburt, aber jetzt isses raus 😃

    Danke & grüssle 🙂


  • Mod

    Aus einerm SDI CFormView liefert GetParentFrame das Mainframe, ansonsten AfxGetMainWindow.

    BTW: Der DYNAMIC_CAST macht auch was Du möchtest, ohne RTTI.


Anmelden zum Antworten