Zugriff auf Dokumentklasse


  • Mod

    maRKus23 schrieb:

    Ich kann nun den nicht-modalen dialog erstellen und zerstören, wenn ich aber eine Textausgabe mache, stürzt mein Programm ab und ich bekomme ein ASSERT.

    void CError::RuntimeError(void)
    {	
    	BOOL bCancel=FALSE;
    	CError* pError;
    	MSG Msg;
    
    	/*creates the non-modal dialog*/
    	pError=CError::Instance(&bCancel, AfxGetMainWnd());		
    	pError->InitialDialog();
    	pError->ShowWindow(false);
    	pError->UpdateData(FALSE);
       
    	while(bCancel == FALSE)
    	{
    		while(::PeekMessage(&Msg, NULL,0,0,PM_NOREMOVE))
    		{
    			if (!AfxGetApp()->PumpMessage())
    			{
    				::PostQuitMessage(0); 
    				break;
    			}
    		}
    	CSipromTDoc* pDoc = (CSipromTDoc*)(((CMainFrame*)AfxGetMainWnd())->GetActiveDocument());
    	m_ActualRuntimeFunction.SetWindowText(pDoc->CastInt2String(m_nActualRuntimeFunction));
    	
    	pError->ShowWindow(true);
    	pError->UpdateData(FALSE);
    	}
    	pError->Done();
    }
    

    Weiß jemand wo der Fehler liegt?

    1. Warum verwendest Du nicht DoModal, wenn Du schon eine eigene Nachrichtenschleife implementierst?
    2. Du solltest den Dokument-Zeiger den Du erhälst auf NULL testen und durch DYNAMIC_DOWNCAST umwandeln.



  • maRKus23 schrieb:

    m_nActualRuntimeFunction wird in der Funktion gefüllt die den Fehler verursacht.

    CError MyError;
    MyError.SetActualRuntimeFunction(xxxx);
    

    Du machst es dir nur unnötig kompliziert 😉 Und außerdem besteht (vermutlich) kein direkter Kontakt zwischen diesem MyError und dem, dessen RuntimeError()-Methode du später aufrufen willst.



  • Wie würdest du es denn machen?
    Ich muss doch auf eine Methode zugreifen die in einer anderen Klasse implementiert ist.
    Das geht doch mit

    CError MyError;
    MyError.SetActualRuntimeFunction(xxxx);
    

    oder nicht?



  • Ja, technisch geht es so. Allerdings überleben die Member eines Objekts nicht, wenn es zerstört wird. D.h. wenn du woanders einen CError anlegst, weiß der überhaupt nichts von diesem Aufruf.

    Ich würde gleich dort, wo der Fehler aufgetreten ist, die entsprechende Meldung anzeigen lassen (und im Bestfall die beiden Methoden SetActualRuntimeFunction() und RuntimeError() zu einer verschmelzen).


Anmelden zum Antworten