Pointer auf CDocument in Dialog & Ringinclude-Lösung



  • Hallo!

    Hätte mal eine Frage zu meiner SDI-Anwendung.

    Und zwar folgendes Problem: ich öffne aus der Doc-Klasse meiner SDI-Anwendung ein Dialogfeld (abgeleitet von CDialog).
    Jetzt möchte ich aus dem Dialogfeld heraus auf eine Membervariable der Doc-Klasse zugreifen. Dazu bräuchte ich ja sicherlich einen Pointer auf diese Klasse.

    Wie kann ich diesen erzeugen? Habs u.a. versucht mit GetParent(), ist aber Quatsch, weil das Dialogfeld in diesem Sinne keinen Parent besitzt 😉

    Vielen Dank schonmal!

    Grüße
    JoSsiF



  • Was Du da genau machst habe ich zwar nicht verstanden, aber mir haben die Views immer einen Member m_pDocument der auf das Document zeigt.
    Wenn Das Document in der App-Klasse definiert hast kommt man vielleicht mit AfxGetApp()->m_myDoc
    dahin.
    Hilft das ?

    Freudi



  • Entweder gibst du den Zeiger vor DoModal an eine Membervariable im Dialog, oder du hangelst dich mit

    CDocument* pDoc = AfxGetMainWnd()->GetActiveDocument();
    

    rüber. Dann musst du nur noch casten. 🙂



  • Danke erstmal!

    Aus der View heraus auf Doc zuzugreifen ist kein Problem - dafür bietet CView ja die Funktion GetDocument().
    Über AfxGetApp() hat's leider nicht funktioniert. Ich definiere das Document auch nicht in der App. Das übernimmt ja alles der Wizard *g*

    Sorry, beschäftige mich noch nicht allzu lang mit der Thematik. Wenn das bei dir gut funzt mit der AfxGetApp()-Sache, wie krieg ich dann die Definition des Documents in der App hin, ohne dass hier gleich nichts mehr funktioniert? 😉

    Oder gibt's noch eine andere Möglichkeit des Zugriffs?

    Vielen Dank!
    JoSsiF



  • @estartu_de:
    Das klingt gut! Ich hab mich mal für die 1. Variante entschieden.

    Habe im Header der Dialog-Klasse die Membervariable angelegt, und diese wird im Doc initialisiert.
    Da muss ich allerdings jetzt nochmal ganz dumm ranfragen: die Membervariable muss ja vom Typ meiner Doc sein (abgeleitet von CDocument). Wo muss ich nun welche Header-Datei einbinden, damit der mit dieser Klasse auch was anfangen kann? Bisher hagelt's massig Fehlermeldungen, die darauf zurückzuführen sind, dass der die Klasse nicht kennt. Habe probehalber die Header-Datei der Doc in die Header-Datei des Dialogs geschrieben - bringt aber leider nichts.

    Vielen Dank für eure Hilfe und eure Geduld 🙂
    JoSsiF



  • Na wenn du im Dialog ne Membervariable vom Typ deines Doc erszeugen möchtest, musst du vorher im Dialog-Header auch deinen Doc-Header includen.



  • Tow-B.de schrieb:

    Na wenn du im Dialog ne Membervariable vom Typ deines Doc erszeugen möchtest, musst du vorher im Dialog-Header auch deinen Doc-Header includen.

    Falsch, genau das ist ja bei ihm schief gegangen - das wird ein Ringinclude. ⚠

    Sorry, ich hatte nicht daran gedacht, aber so kennst du den Fehler jetzt auch. 🙂

    Also, im Header des Dialoges schreibst du statt

    #include "MeinDoc.h"
    

    einfach

    class CMeinDoc;
    

    das ist eine Forwarddeklaration.
    Nun kannst du allerdings nur Zeiger auf die Klasse im Header verwenden.
    Im Cpp kannst du dann

    #include "MeinDoc.h"
    

    machen und ganz normal mit der Klasse arbeiten. 🙂


Anmelden zum Antworten