Allgemeine Frage zum Doc/View Modell


  • Mod

    Auch ein neuer Datensatz hat eine visuelle Aktion notwendig. Auch diese Funktion kann in den View gehören. 😉

    Wenn das Dokument auch die Positon bestimmt, und immer nur über einen Datensatz zum editieren verfügt, dann kann auch die Navigations Befehle in den View. 😉

    Es gibt viele Wege nach Rom.



  • Ich übergebe keine GUI Objekte in irgendwelche Datenhaltungsklassen.. Daher verwende ich oftmals einen Mischansatz aus 1 und 2. Lieber lasse ich mir eine typisierte Liste (std::vector/list<Objekt*> füllen (wie in Ansatz 1) und kopiere dann die Items aus der Liste (wie in Ansatz 2) selber in die GUI Objekte (CListCtrl).

    Bedingt zwar den Overhead 2x über die Objektmenge zu iterieren, aber das nehme ich in Kauf.

    Wenn es absolut performant sein soll, man es ganz elegant haben will und Templates liebt, kann man im View einen Functor erstellen der ein Element in das GUI Object (CListCtrl) kopiert, und diesen dann seiner Datenhaltungsklasse übergeben. Anstelle die oben beschriebene Liste zu füllen, ruft die Datenhaltungsklasse dann halt jedesmal den Functor auf an der Stelle wo vorher ein Objekt der Liste hinzugefügt worden wäre.



  • Danke für die Hinweise, ich habe es schlussendlich so wie im Buch Bsp gemacht.

    Dabei trat aber folgende Fragestellung auf:

    In der View-Klasse CEx16aView habe ich einen Diagnoseroutine CEx16aView::DsDiag()
    geschrieben, die TRACE Infos ausgibt. Auf diese Routine möchte ich auch von der Document Klasse aus zugreifen.

    Das bekomme ich leider nur so hin, was ja vollkommen verkorkst ist:

    void CEx16aDoc::OnEditClearAll() 
    {
        //Dump vor dem Loeschen
    	POSITION pos = GetFirstViewPosition(); 
    	CEx16aView* pView = (CEx16aView*) GetNextView(pos); 
    	pView->DsDiag(); 
       //..
    }
    

    Wie kann ich vernünftig zugreifen?

    Danke ..



  • Also unter
    http://www.codeguru.com/forum/showthread.php?t=282338&goto=nextoldest
    findest du allgemein ne Anleitung, wie man zwischen den Klassen auf irgendwelche Dinge zugreifen kann.



  • AndyDD schrieb:

    Also unter
    http://www.codeguru.com/forum/showthread.php?t=282338&goto=nextoldest
    findest du allgemein ne Anleitung, wie man zwischen den Klassen auf irgendwelche Dinge zugreifen kann.

    ja, nach dieser Anleitung bin ich auch vorgegangen:

    POSITION pos = GetFirstViewPosition();
    CEx16aView* pView = (CEx16aView*) GetNextView(pos);
    pView->DsDiag();
    

    Mein Gefühl sagt mir aber, das dies nicht besonders elegant ist
    und ich vermute mal, dass es einen besseren Weg gibt



  • Was meinste denn mit

    ThomasC schrieb:

    Mein Gefühl sagt mir aber, das dies nicht besonders elegant ist
    und ich vermute mal, dass es einen besseren Weg gibt

    Du holst dir einen Zeiger auf deine Viewklasse uns kannst alle public-Elemente ansprechen. Was spricht dagegen? Oft muss die View-Klasse auf Daten des Doc zugreifen, deshalb gibts ja auch GetDocument(). Wenn es andersrum genauso wichtig wäre, dann hätte die Doc-Klasse automatisch auch gleich eine Get-Methode aufs View. Du könntest ja auch vom Doc aus ne Message an das View schicken um damit noch Informationen zu übertragen. Ansonsten gibts ja noch UpdateAllViews oder UpdateWindow.


  • Mod

    ThomasC schrieb:

    AndyDD schrieb:

    Also unter
    http://www.codeguru.com/forum/showthread.php?t=282338&goto=nextoldest
    findest du allgemein ne Anleitung, wie man zwischen den Klassen auf irgendwelche Dinge zugreifen kann.

    ja, nach dieser Anleitung bin ich auch vorgegangen:

    POSITION pos = GetFirstViewPosition();
    CEx16aView* pView = (CEx16aView*) GetNextView(pos);
    pView->DsDiag();
    

    Mein Gefühl sagt mir aber, das dies nicht besonders elegant ist
    und ich vermute mal, dass es einen besseren Weg gibt

    Das ist auch nicht elegant. Damit muss das CDocument wissen wie die Views ticken.

    Für so etwas gibt es UpdateAllViews. Damit wird die OnUpdate Methode in jedem View aufgerufen.
    Man kann sogar ein CObject als weitere Infor mitliefern oder ein DWORD als Hint.



  • Hallo Martin,

    ich benutze UpdateViews natürlich aus dem aktuellen View heraus und aus dem Doc, aber nur wenn sich Daten geändert haben.

    Die Diagnosefunktion möchte ich davon unabhängig nutzen. Ich müsste Sie dann in die überschriebene virtuelle Methode des betreffenden Views einfügen und sie würde dann ständig aufgerufen werden, wenn Daten geändert werden.

    Gruß Thomas


  • Mod

    Warum benutzt Du nicht grundsätzlich UpdateAlViews aber eben mit unterschieldichen Hints?



  • Martin Richter schrieb:

    Warum benutzt Du nicht grundsätzlich UpdateAlViews aber eben mit unterschieldichen Hints?

    OK, habe es geschnallt.


Anmelden zum Antworten