GetDocument();

kerian

Erfahrenes Mitglied
Hallo zusammen,
Code:
GetDocument();
Mit dieser Methode versuche ich auf das Document zuzugreifen. Die Adresse ist die gleiche aber der Inhalt dann nicht mehr.

Also ich habe mir einer (SDI) Applikation eine Methode Switch für das umschalten mehrerer Views gebaut was auch super funktioniert. Jetzt ist mir aufgefallen, dass ich kein Zugriff auf mein Document aus den einzelnen Views habe. D.h. auf die Variablen die ichim Document deklariert habe.

Wo ist mein Fehler?

Code:
 void CMainFrame::SwitchView()
{
    CView *pOldView;
    CView *pNewView;

    // Zeiger auf aktives View holen
    pOldView = GetActiveView();
    // Falls dies der erste Aufruf der Methode ist, ist das erste View
    // das aktive View und der Zeiger darauf muss noch gerettet werden
    if (m_pCFirstView == NULL)
        m_pCFirstView = pOldView;

    // Falls zweites View noch nicht erstellt
   if (m_pCSecondView == NULL)
   {    TRACE("Erstelle View2 \n");
        CRuntimeClass *pCR = RUNTIME_CLASS(CSecondVIew);
        m_pCSecondView = static_cast<CSecondVIew*>(pCR->CreateObject());
        // ID des Views ungleich AFX_IDW_PANE_FIRST setzen!
        m_pCSecondView->Create(NULL,NULL,AFX_WS_DEFAULT_VIEW,rectDefault,
                               this,AFX_IDW_PANE_FIRST+1,NULL);
    }
    // Falls drittes View noch nicht erstellt
    if (m_pCThirdView == NULL)
    {   TRACE("Erstelle View3 \n");
        CRuntimeClass *pCR;
		pCR = RUNTIME_CLASS(CThirdView);
        m_pCThirdView = static_cast<CThirdView*>(pCR->CreateObject());
        // ID des Views ungleich AFX_IDW_PANE_FIRST setzen!
        m_pCThirdView->Create(NULL,NULL,AFX_WS_DEFAULT_VIEW,rectDefault,
                               this,AFX_IDW_PANE_FIRST+1,NULL);
    }
    // Neues aktives View bestimmen

    if (m_ViewActive == 1)
	{
     pNewView = m_pCFirstView;
     m_wndToolBar.LoadToolBar(IDR_MAINFRAME);
	 CMenu menu; 
     CMenu *pmenu;
	 pmenu = &menu;
     menu.LoadMenu(IDR_MAINFRAME);
     SetMenu(pmenu);
     menu.Detach();	 
	 UpdateWindow();

	}	


    if (m_ViewActive == 2)
	{
     pNewView = m_pCSecondView;	 
	 m_wndToolBar.LoadToolBar(IDR_TOOLBAR1);	
	 CMenu menu; 
     CMenu *pmenu;
	 pmenu = &menu;
     menu.LoadMenu(IDR_MENU1);
     SetMenu(pmenu);
     menu.Detach();
	 UpdateWindow();
	}


    if (m_ViewActive == 3)
	{
     pNewView = m_pCThirdView;
//	 m_wndToolBar.LoadToolBar(IDR_TOOLBAR3);
	 m_wndStatusBar.SetPaneText(0,"jj");
	 //LoadFrame(IDR_MENU1, WS_OVERLAPPEDWINDOW, NULL, NULL);
//	 CMenu menu; 
//   CMenu *pmenu;
//	 pmenu = &menu;
//   menu.LoadMenu(IDR_MENU1);
//   SetMenu(pmenu);
//   menu.Detach();
	 UpdateWindow();
	}

    // Aktives View muss die ID AFX_IDW_PANE_FIRST besitzen
    // IDs deshalb austauschen
    int nChildId = pNewView->GetDlgCtrlID();
    pNewView->SetDlgCtrlID(AFX_IDW_PANE_FIRST);
    pOldView->SetDlgCtrlID(nChildId);

    //  UpdateWindow();
    // Zeiger auf Dokument holen
    CDocument *pDoc = pOldView->GetDocument();
    // View mit Dok verbinden
	if(pOldView != pNewView)
	{
    pDoc->AddView(pNewView);
    pDoc->RemoveView(pOldView);
    // Aktives View dem Rahmenfenster mitteilen
    SetActiveView(pNewView);
    // Und Viewgroesse neu berechnen lassen
    RecalcLayout();
    // View anzeigen bzw. verbergen
    pNewView->ShowWindow(SW_SHOW);
    pOldView->ShowWindow(SW_HIDE);
 //   m_ViewActive = !m_ViewActive;
	}
}

In meiner View.h steht dann
Code:
	CTestDoc* GetDocument();

in Der View.cpp

Code:
void CSecondVIew::OnDraw(CDC* pDC)
{
	CDocument* pDoc = GetDocument();
	// ZU ERLEDIGEN: Code zum Zeichnen hier einfügen
	   pDC->TextOut(15,15,"View2");
//	  pDoc->m_int; ?
	   pDC->TextOut(20,20,"View2");
}

.
.
.


CTestDoc* CSecondVIew::GetDocument() // Die endgültige (nicht zur Fehlersuche kompilierte) Version ist Inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CTestDoc)));
	return (CTestDoc*)m_pDocument;
}

Ich hoffe das ist nicht alzu verwirrend!
Gruß
kerian
 
Hallo zusammen,
ich habe in :)

Hab falschen Pointer verwendet!
statt CDocument* pDoc = GetDocument();
muss es CTestDoc* pDoc = GetDocument();
heißen!
 
Zurück