Zeiger von CDoc zu CView



  • Heiho

    durch dieses tolle forum hier hab ich rausgefunden wie ich in der Doc klasse zugriff auf die public elemente von der View klasse bekomm

    CView* pView = dynamic_cast<CView*>(((CMainFrame*)AfxGetMainWnd())->GetActiveView());
    

    die frage die sich mir stellt ist aber - wie kann ich diesen pointer in der doc klasse so bekannt machen das ich es nur einmal aufrufen braucht und jede methode es kennt ?



  • Du könntest der Doc-Klasse einen Member CView* m_pMyView; spendieren und diesen an geeigneter Stelle füllen. Anschließend kommst du jederzeit über diesen Zeiger zu deinem View.



  • daran dachte ich auch schon, da ist aber das problem

    das "CView" ist eigentlich die eigene klasse "COwnView" - n bissl bloed ausgedrueckt

    der pointer zur COwnView kann ich nur bekommen wenn ich in der COwnDoc die COwnView klasse inkludier

    aber ich kann diese nicht in der header von COwnDoc includieren

    COwnDoc.h

    // #include "OwnView.h" // error
    Class COwnDoc : public CDocument
    {
        COwnView *view; // error because: unknow
    };
    

    COwnDoc.cpp

    #include "OwnView.h" // ok
    //global
    COwnView gview = ... // error
    
    COwnDoc::SomeMethod()
    {
        COwnView view = ... // ok
    }
    


  • Für sowas verwendet man üblicherweise Forward Deklarationen 😉 (der Präprozessor ist noch dümmer als der Compiler, deshalb führen solche wechselseitigen Includes (fast?) immer zu Problemen)

    PS: Außerdem habe ich nicht von einer globalen Variable gesprochen, sondern von einer Membervariable der Doc-Klasse.

    PPS: Und vermutlich würde ich dem Doc eher eine SetView-Methode übergeben, die das View zuweist:

    class CMyView;
    
    class CMyDoc : public CDocument
    {
      ...
    public:
      //diese Methode wird von der View-Klasse aufgerufen, wenn sie aus irgendeinem Grund ein neues Objekt anlegen muß:
      void setView(CMyView* v) { m_pView=v; }
    private:
      CMyView* m_pView;
      ...
    };
    

  • Mod

    Ich halte es für gar keine gute Idee einen View Zeiger im Dokument so abzulegen. Zudem gibt es das ja schon mit: GetFirstViewPosition/GetNextView!



  • also die suche hier im forum kann man wirklich wegwerfen, ich such die ganze zeit nach den bestimmten artikel wo das mit der MFC erklaert wurde - und zwar such ich die ganze zeit die moeglichkeit wie ich nen pointer zur Doc klasse bekomm, von View aus

    auch wenn ich threads durchsuch find ich nie was, die suche sollte echt mal ueberarbeitet werden


  • Administrator

    Ehm lies mal die MSDN durch zu Doc/View oder schau dir mal deine View an. Hat ne Funktion, welche GetDocument heisst.

    Die Suchfunktion in diesem Forum ist schon seit Ewigkeiten kaputt. Soll anscheinend irgendwann mal repariert werden *g*
    Man kann aber auch mit Google hier suchen, muss einfach die Suche bei Google auf diese Seite einschränken.

    Grüssli


  • Mod

    Mr Evil schrieb:

    also die suche hier im forum kann man wirklich wegwerfen, ich such die ganze zeit nach den bestimmten artikel wo das mit der MFC erklaert wurde - und zwar such ich die ganze zeit die moeglichkeit wie ich nen pointer zur Doc klasse bekomm, von View aus auch wenn ich threads durchsuch find ich nie was, die suche sollte echt mal ueberarbeitet werden

    Warum suchst Du im Forum und nicht in der MSDN? 😕

    Zumdem ist diese Frage en so starkes Grundlagen Wissen, dass man es im ersten Tutorial schon gesagt bekommt!
    Und wenn man seine Englischkenntnisse zusammenkramt kommt man auch drauf.
    - Get: Weil du etwas haben möchtest
    - Document: Weil Du das Dokument möchtest
    - CView: Weil es im View passiert!
    :xmas1:

    Also CView::GetDocument



  • habs mitlerweile gefunden #gg

    CFR3Doc* pDoc = dynamic_cast<CFR3Doc*>(((CMainFrame*)AfxGetMainWnd())->GetActiveDocument());
    pDoc->setView(this);
    

    ans ende von create von View - und Doc nimmt den pointer an, dann hab ich stets zugriff

    vielen dank CStoll {o;


  • Administrator

    MrEvil: Ich rate dir dringends die letzten 2 Post vor deinem letzten zu lesen ^^

    Grüssli


Anmelden zum Antworten