Zeiger auf Doc jedes Mal neu initialisieren?


  • Mod

    Und warum machst Du das mit dem OnCommand Handling dann nicht im Dokument?
    Man setzt die Command-Handler dorthin wo man es benötigt...



  • Martin Richter schrieb:

    Und warum machst Du das mit dem OnCommand Handling dann nicht im Dokument?
    Man setzt die Command-Handler dorthin wo man es benötigt...

    Ich hatte das so aus einem Tutorial. Hast Recht, das geht so auch. Ok, trotzdem hätte ich gern noch eine Antwort auf meine Frage, wenn wir jetzt das mit den Handlern mal ausblenden....


  • Mod

    Auf welche Frage willst Du nun eine Antwort?



  • Martin Richter schrieb:

    Auf welche Frage willst Du nun eine Antwort?

    Hole ich mir diesen Zeiger jedes Mal neu, in dem ich in der Methode diesen Zeiger instanziere (nach Beenden der Methode wird ja dessen Destruktor aufgerufen) oder legt man hier besser eine Membervariable?

    Diese Frage bezieht sich allgemein auf irgendeine Klasse, von der aus ich auf Daten des Docs zurückgreifen will....


  • Mod

    AndyDD schrieb:

    Diese Frage bezieht sich allgemein auf irgendeine Klasse, von der aus ich auf Daten des Docs zurückgreifen will....

    Und warum solltest Du das wollen? 😉

    Sollte das nötig sein, würde ich Dein Klassen Konzept in Frage stellen.

    Aber es gibt 1000 Möglichkeiten an das "aktive" Dokument zu kommen. Die muss klar, sein, dass es noch andere Formen als SDI gibt.

    Ansonsten
    - CFrameWnd::GetActiveView und über den View an das Dokument.
    - Dann gibt es die Doc-Templates. im CWinApp kann man die enumerieren, in jedem Doc Template steht eine Liste der erzeugten Docs.

    Diese Wege sollten eigentlich immer gehen...



  • Martin Richter schrieb:

    AndyDD schrieb:

    Diese Frage bezieht sich allgemein auf irgendeine Klasse, von der aus ich auf Daten des Docs zurückgreifen will....

    Und warum solltest Du das wollen? 😉

    Sollte das nötig sein, würde ich Dein Klassen Konzept in Frage stellen.

    Aber es gibt 1000 Möglichkeiten an das "aktive" Dokument zu kommen. Die muss klar, sein, dass es noch andere Formen als SDI gibt.

    Ansonsten
    - CFrameWnd::GetActiveView und über den View an das Dokument.
    - Dann gibt es die Doc-Templates. im CWinApp kann man die enumerieren, in jedem Doc Template steht eine Liste der erzeugten Docs.

    Diese Wege sollten eigentlich immer gehen...

    Ich hab ja den Weg nicht angezeifelt. Für das Warum kann ich dir nur die vielen Tutorial-Autoren nennen, die auch teilweise solche Konstrukte verwenden. Und da ich ja was lernen will frage ich halt nach. Als Beispiel für eine andere Klasse wäre z.B. nochmal das MainFrame. In einem Beispiel wird dort eine Methode implementiert, die einen Eintrag in der Statuszeile aktualisiert. Die Daten dafür stehen in der Dokumentenklasse, der Zeiger darauf wird in der Methode über GetActiveView-GetDocument geholt. Und hier stellte sich mir nun die Frage, ob es aus Performance-Gründen sinnvoller ist, im Mainframe den Zeiger einmal zu holen und in einer Membervariablen abzuspeichern oder jedesmal diese Aufrufe in der Methode in eine lokale Variable zu legen, die nach dem Durchlauf der Methode logischerweise vernichtet wird.


  • Mod

    Ich bezweifle massiv die Qualität solcher Tutorien und ich gebe zu, ich lese diese nie!

    Warum sollte man diesen solchen Command-Handler in das Mainframe packen, wenn er das "aktive"-Dokument/View betrifft?



  • Martin Richter schrieb:

    Ich bezweifle massiv die Qualität solcher Tutorien und ich gebe zu, ich lese diese nie!

    Warum sollte man diesen solchen Command-Handler in das Mainframe packen, wenn er das "aktive"-Dokument/View betrifft?

    Naja, für mich sind sie oft der erste Anlaufpunkt wenn man was noch nie gemacht hat. Klar, dass Du bei Deinem Wissen das nicht mehr brauchst. Vielleicht sollten wir mal neue Tuts schreiben, wäre doch mal ein Anreiz.
    In meinem letzten Post ging es nicht um die Command-Handler, sondern ganz allgemein. Das Beispiel (hab ich aus einem Tutorial, also nicht übers Design schimpfen):

    void CMainFrame::SetStatus()
    {
       CMyDocument* pDoc=reinterpret_cast<CMyDoc*>(((CMainFrame*)AfxGetMainWnd())->GetActiveDocument());
       CString str;
       str.Format ("aktueller Status: %s, Fehler: %s", pDoc->m_sStatus, pDoc->m_sFehler);
       m_wndStatusBar.SetPaneText (0, str);
    }
    

    Hier war jetzt die Frage, ob es notwendig ist, bei jedem Aufruf diesen Zeiger zu holen oder den in einer Membervariablen des MainFrame zu speichern und nur einmal zu initialisieren?


  • Mod

    Dieser Code muss immer GetActiveDocument ausführen, denn bei einer MDI Awedung kann dieses sehr wohl wechseln.

    1. Dieser Code crashed in einer MDI ANwednugn wen der letzte View geschlossen wird.
    Dito kann es im einem SDI mit mehreren Splittern auch mehrere Docs geben. Auch in diesem Fall wäre es notwendig.
    2. Warum wird nicht der typsichere catst aus der MFC verwendet?
    3. Warum wird im Mainframe AfxGetMainWnd ausgeführt WENN es schon das CMainFrame ist?
    4. Warum gibt es hier CMyDoc und CMyDocument?

    CMyDocument* pDoc=STATIC_DOWNCAST(CMyDocument,GetActiveDocument()));
    

    Sch<zensiert>...</zensiert> Code!

    Tutorials die sowas zeigen sollten auf die Wiederverwendbarkeit von Code hinweisen und die Unterschiede von SDI/MDI frühzeitig zeigen!

    PS:
    1. Warum sollte man Tutorials schreiben, wenn alles schon überall geschrieben steht?
    2. Warum sollte man Tutorials schreiben, wenn man schon nicht gegen den existierenden Schund ankommt? ;?
    3. Warum sollte man Tutorials schreben, wenn die meisten "Fragenden" nicht auf "Wissen" aus sind sondern nur auf schnelle Lösungen?

    Just my 2 cents!



  • Martin Richter schrieb:

    2. Warum wird nicht der typsichere catst aus der MFC verwendet?

    CMyDocument* pDoc=STATIC_DOWNCAST(CMyDocument,GetActiveDocument());
    

    Siehste, wieder was gelernt, kannte ich so noch nicht (war aber übrigens eine Klammer zu viel).

    Martin Richter schrieb:

    4. Warum gibt es hier CMyDoc und CMyDocument?

    Schreibfehler von mir, würde so ja gar nicht gehen, da nicht definiert....

    Martin Richter schrieb:

    1. Warum sollte man Tutorials schreiben, wenn alles schon überall geschrieben steht?
    2. Warum sollte man Tutorials schreiben, wenn man schon nicht gegen den existierenden Schund ankommt? ;?
    3. Warum sollte man Tutorials schreben, wenn die meisten "Fragenden" nicht auf "Wissen" aus sind sondern nur auf schnelle Lösungen?

    Just my 2 cents!

    zu 1.) Hab ich in diesem Falle nicht gefunden.
    zu 2.) Vielleicht weil jeder so denkt...
    zu 3.) Ich speziell bin da anders. Ich hinterfrage alle, was auch meine Kollegen manchmal nervt. Aber nur so lernt man.


  • Mod

    Doch! Deine Ursprüngliche Frage wird durch den Source-Code beantwortet!
    1. Ist GetDocument inline
    2. Gibt es MDI und SDI und eine "bewusst" lose Kopplung zwischen FRame und View/Doc!
    3. Spricht der OOP Ansatz dafür.
    4. Gibt es Bücher, die besser sind als Tutorials!

    😉


Anmelden zum Antworten