Globale Variable oder CDoc?



  • Ich wollte eine Variable global anlegen, nur WO soll ich sie anlegen?
    Sie MUSS in CView.cpp und MainFrm.cpp ansprechbar sein.

    Das Problem:
    wenn ich sie in der CView global speichere, ist sie in der MainFrm nicht ansprechbar und umgekehrt.

    Wenn ich die Variable ins Document schreibe, kann ich sie zwar mit GetDocument(usw.) im CView ansprechen, aber im MainFrm gibts keine Methode Namens GetDocument.

    Hat jemand einen Lösungsvorschlag???

    PS.: Im CView brauche ich sie für OnDraw. Im MainFrm brauche ich sie für die Zugriffstasten(Ressourcen/Accelerator)

    mfg (c)h



  • wieso muss sie global sein mach dir Set und Get Funktionen. Da wo du die Variable öfter veränderst und brauchst legst du sie an. An die andere Klasse übergibst du si in dem du eine lokale Variable auf den ÜbergabeWert setzt der von der ersten Klasse übergeben wird.
    Klar??



  • Im Mainframe gibt es eine schöne Funktion: GetActiveDocument. 🙂
    Von überall kommt du mit AfxGetMainWnd an den Mainframe.
    Das musst du nur noch casten und schon hast du deine Variable.

    Btw.: Was meinst du mit "global".



  • gut, aber wie kann ich auf die GET bzw. SET funktion der jeweils anderen zugreifen?

    // ***.cpp
    class ***
    {
    private:
    ...
    public:
    void movedown();
    void draw();
    ...
    }s;
    
    // MainFrame.cpp
    void CMainFrame::OnKeyDown()
    {
    ...
       s.movedown;
    }
    
    // asdfView.cpp
    void CasdfView::OnDraw(CDC* pDC) 
    {
    ...
       s.draw();
    }
    

    nehmen wir an ich HÄTTE in CasdfView eine Memberfunktion Get(), wie würde ich die dann aufrufen???

    mfg (c)h



  • ups, hab den letzten beitrag davor nicht gesehen.
    Ich meinte mit global, dass die Variable global ebn angelegt wird, und im gesamten Programm angesprochen werden kann.

    GetActiveDocument und AfxGetMainWnd werde ich jetzt mal versuchen...

    mfg (c)h



  • Pack die Variable bitte mal als public in die Klasse, auf die deine Wahl dann fällt.
    Weil dann geht meine Lösung von oben - mit global wohl eher nicht.



  • gut...
    meine Klasse ist in der MainFrm.h
    ich versuchte das MainFrame anzusprechen. Du hast etwas von Casten gesagt - Nach welchen Typ?

    void CSNAKE3View::OnDraw(CDC* pDC) 
    {
    	CWnd* a=AfxGetMainWnd();
    	// casten nach welchen typ?
    }
    

    mfg (c)h



  • Nach CMainFrame*, denn darauf willst du ja zugreifen. 😉



  • dachte ich mir auch... nur:

    void CSNAKE3View::OnDraw(CDC* pDC) 
    {
    	CMainFrame* a=(CMainFrame*)AfxGetMainWnd();
    
    }
    
    error C2065: 'CMainFrame' : nichtdeklarierter Bezeichner
    

    😞

    mfg (c)h



  • CMainframe* pFrame =dynamic_cast<CMainframe*>(AfxGetMainWnd());
    Assert(pFrame)
    

    So! 😉



  • Dann musste in deiner View.cpp noch MainFrm.h includen.

    Also einfach ganz oben hin:

    [cpp]#include "MainFrm.h"[/cpp]
    

    Edit: Oh, dynamic_cast hab ich ja no nie benutzt... Gleich mal ausprobieren... 🙂



  • Und für das von Polofreak musst du in den Projekteinstellungen noch RTTI einschalten.
    Es ist aber die sauberere Lösung.



  • static_cast tuts auch. du weißt ja von welchem typ der zeiger ist.



  • DANKE!!! Funktioniert! 👍 🙂
    (habs aber ohne dynamic-cast gemacht - die include hat geholfen)

    mfg (c)h


Anmelden zum Antworten