MDI-Zugriffsproblem !



  • Ich möchte von CMainFrame aus auf CDocument des aktiven Child-Fensters zugreifen:

    void CMainFrame::OnADown() 
    {
    	CDocument *pDoc;
    
    	pDoc = GetActiveDocument();
    	// Z.B.: int i = pDoc->Variable;
    }
    

    Soweit funktioniert das Ganze, ABER: Ich komme nicht an die Variablen in Cdocument!! Und genau die brauche ich! Was mache ich falsch?



  • Die Funktion gibt dir einen Zeiger auf CDocument - du wirst wohl deine selbst angelegten Variablen meinen - die kennt er so nicht.

    Du musst casten:

    CMyDocument *pDoc; 
    pDoc = dynamic_cast<CMyDocument*>(GetActiveDocument());
    

    Dabei muss CMyDocument durch deine Dokumentklasse ersetzt werden.

    Das wird dir bei vielen Funktionen passieren, dass die nur die MFC eigene Klasse kennen - aber jetzt weißt du ja wie mn castet. 😉

    (Vergiss bitte die Prüfung auf != NULL nicht...) 🙂



  • Ich habe das Casten versucht. Zunächst erhielt ich eine Warnung:

    warning C4541: 'dynamic_cast' fuer polymorphen Typ 'class CDocument' mit /GR- verwendet; unvorhersehbares Verhalten moeglich

    void CMainFrame::OnADown() 
    {
    	CMyAppDoc *pDoc;
    
    	pDoc = dynamic_cast<CMyAppDoc*>(GetActiveDocument()); // Warnung
    	CString String;
    	String = pDoc->MySheet[1][1].sCellString; // Hier tritt der Fehler auf
    
    	MessageBox(String, NULL, NULL);
    }
    

    Und dann, zur Laufzeit, stürzte das Programm beim Aufruf der Funktion ab.
    😕 Warum? 😕



  • Du musst in den Projekteinstellungen RTTI aktivieren.



  • OK, habe ich gemacht. Der Fehler ist aber immer noch nicht behoben! 🙄



  • Welchen Wert hat pDoc?



  • NULL ! - Und zwar immer. Dass kann doch garnicht sein! 😮



  • Kann schon, deswegen solltest du den Zeiger ja prüfen.

    Wenn ein dynamic_cast fehlschlägt, kommt NULL raus.

    Es stimmt also irgendwas nicht. Was kann ich dir vielleicht mit mehr Informationen sagen.



  • Was für Infos brauchst du?



  • Hmm, wenn ich das so genau wüßte... 😞

    Am bestem wäre, wenn ich mal direkt per Debugger einen Blick in deinen Quelltext werfen könnte.

    Ich habe mittlerweile eine brauchbare Technik entwickelt, um Fehler zu finden, nur leider kann ich sie schlecht beschreiben, sorry.



  • Nun, dass ist nett gemeint, aber ich glaube das der Fehler nicht in meinem übrigen Quelltext liegen kann.
    Ich habe mit dem MFC-Anwendungs-Assistenten (Ich verwende MSVC++ 6.0) eine neune MDI-Anwendung erstellt (alle Einstellungen gleich). Dann habe ich versucht in der neunen Anwendung, in der ich noch nichts verändert hatte, auf Variablen von C...Doc zuzugreifen. Und wieder war der Wert des Pointer NULL !! 😞

    Könnte es sein, dass der Assistent da irgendwo Unsinn macht? Oder müsste ich vielleicht noch irgendeine weitere Einstellung verändern? "RTTI" habe ich auch nachträglich aktiviert ...



  • So, ich hab mir mal eine meiner MDI-Anwendungen geschnappt - ich kriege auch keinen Zeiger. Dafür habe ich aber eine Vermutung, woran es liegen könnte.

    Beim Debuggen habe ich diese Funktion hier gefunden:

    CDocument* CFrameWnd::GetActiveDocument()
    {
    	ASSERT_VALID(this);
    	CView* pView = GetActiveView();
    	if (pView != NULL)
    		return pView->GetDocument();
    	return NULL;
    }
    

    Da ging mir ein halber Kronleuchter auf: Hast du überhaupt einen aktiven View? Funktioniert das GetDocument von dem richtig?

    Ansonsten muss ich hier erstmal aufgeben, finde ich komisch, dass die Funktion nicht geht. 😞



  • Wenn du mit Aktiven-View ein untergeordnetes Child-Fenster meinst, zudem je ein View und ein Doc Objekt gehören, dann ja!
    Trotzdem: Danke für deine Hilfe! 🙂 🙂 🙂
    Ich muss mal sehen ob ich das Problem anderweitig lösen kann. Vielleicht finde ich ja irgendwo ein MDI-Beispiel, das den Zugriff hinbekommt ...



  • Guck mal, ein paar Tage später gibt es auch eine Lösung.

    http://www.c-plusplus.net/forum/viewtopic.php?t=57015

    Ist wohl eine beliebte Frage. 😃


Log in to reply