In OnInitDialog Fenster schließen



  • hi,
    ich möchte wie der titel schon sagt in OnInitDialog() das Fenster was gerade geöffnet wird wieder schließen falls ein Fehler auftritt.

    BOOL CDlgTumblerDaten::OnInitDialog()
    {
    	CDialog::OnInitDialog();
    	SetIcon(m_hIcon, true);			// Großes Symbol verwenden
    	//Variablen NUll setzen
            ....
    	if(g_DatenObjekt.m_2DDatenArray.getYLength()== 12)
    	{
    		g_DatenObjekt.GeraeteTypTumblerDatei=false;
    	}
    
    	if (g_DatenObjekt.GeraeteTypeTumblerRadioAuswahl == g_DatenObjekt.GeraeteTypTumblerDatei)
    	{
    	...
    	return TRUE;  // return TRUE unless you set the focus to a control
    	}
    	else
    	{
    		AfxMessageBox(_T("Device and GDB-File does not agree"));
    //		m_CProgress.SetCancel();
    		EndDialog(IDOK);
    		return TRUE; 
    	}
    
    	// AUSNAHME: OCX-Eigenschaftenseite muss FALSE zurückgeben.
    }
    

    wenn ich den dialog mittels EndDialog(IDOK); schließen möchte kommt ein fehler:

    ASSERT(::IsWindow(m_hWnd) || (m_pCtrlSite != NULL));
    

    Ich hoffe mir kann jemand sagen wie ich das Fenster schließen kann und mir den Fehler erklären.

    Danke schonmal


  • Mod

    Das Fenster ist bereits zerstört.
    m_hWnd ist vermutlich schon NULL...

    Oder m_hWnd wurde überschrieben.



  • wenn ich aber EndDialog(IDOK); auskommentier geht das fenster ganz normal ohne probleme auf.



  • thecown schrieb:

    wenn ich aber EndDialog(IDOK); auskommentier geht das fenster ganz normal ohne probleme auf.

    z.b CloseWindow() funktioniert. aber da wird das fenster ja leider nur mimnimiert


  • Mod

    Und was steht in m_hWnd bzw. m_pCtrlSite?
    Was ist auf dem Callstack?
    Wer wirft diesen ASSERT?



  • 1. vor EndDialog(IDOK); -->CDialog {CDialog hWnd=0x003e0820} CDialog
    danach 0x0000...
    m_pCtrlSite 0x00000000 {COleControlSite} COleControlSite *

    2. meinst du mit callstack die aufrufliste ? wenn ja:
    Tumbler Dataanalyzer.exe!AfxWinMain(HINSTANCE__ * hInstance=0x00400000, HINSTANCE__ * hPrevInstance=0x00000000, wchar_t * lpCmdLine=0x0002097c, int nCmdShow=1) Zeile 37 + 0xd Bytes C++
    Tumbler Dataanalyzer.exe!wWinMain(HINSTANCE__ * hInstance=0x00400000, HINSTANCE__ * hPrevInstance=0x00000000, wchar_t * lpCmdLine=0x0002097c, int nCmdShow=1) Zeile 29 C++
    Tumbler Dataanalyzer.exe!__tmainCRTStartup() Zeile 315 + 0x35 Bytes C
    Tumbler Dataanalyzer.exe!wWinMainCRTStartup() Zeile 187 C

    3. BOOL CWnd::ShowWindow(int nCmdShow)



  • leider den callstack von unten kopiert 😞

    > Tumbler Dataanalyzer.exe!CWnd::ShowWindow(int nCmdShow=5) Zeile 329 + 0x2d Bytes C++
    Tumbler Dataanalyzer.exe!CDlgDatenLaden::OnBnClickedOk() Zeile 111 C++
    Tumbler Dataanalyzer.exe!_AfxDispatchCmdMsg(CCmdTarget * pTarget=0x0012f7a8, unsigned int nID=1, int nCode=0, void (void)* pfn=0x004f0d89, void * pExtra=0x00000000, unsigned int nSig=56, AFX_CMDHANDLERINFO * pHandlerInfo=0x00000000) Zeile 82 C++
    Tumbler Dataanalyzer.exe!CCmdTarget::OnCmdMsg(unsigned int nID=1, int nCode=0, void * pExtra=0x00000000, AFX_CMDHANDLERINFO * pHandlerInfo=0x00000000) Zeile 381 + 0x27 Bytes C++
    Tumbler Dataanalyzer.exe!CDialog::OnCmdMsg(unsigned int nID=1, int nCode=0, void * pExtra=0x00000000, AFX_CMDHANDLERINFO * pHandlerInfo=0x00000000) Zeile 85 + 0x18 Bytes C++
    Tumbler Dataanalyzer.exe!CWnd::OnCommand(unsigned int wParam=1, long lParam=1443894) Zeile 2300 C++
    Tumbler Dataanalyzer.exe!CWnd::OnWndMsg(unsigned int message=273, unsigned int wParam=1, long lParam=1443894, long * pResult=0x0012e688) Zeile 1755 + 0x1e Bytes C++
    Tumbler Dataanalyzer.exe!CWnd::WindowProc(unsigned int message=273, unsigned int wParam=1, long lParam=1443894) Zeile 1741 + 0x20 Bytes C++
    Tumbler Dataanalyzer.exe!AfxCallWndProc(CWnd * pWnd=0x0012f7a8, HWND__ * hWnd=0x0016083c, unsigned int nMsg=273, unsigned int wParam=1, long lParam=1443894) Zeile 240 + 0x1c Bytes C++
    Tumbler Dataanalyzer.exe!AfxWndProc(HWND__ * hWnd=0x0016083c, unsigned int nMsg=273, unsigned int wParam=1, long lParam=1443894) Zeile 389 C++



  • ok ich habs mit GetLastActivePopup()->PostMessageW(WM_COMMAND,IDCANCEL); lässt sich das fenster ohne probleme schließen.


  • Mod

    Ich verstehe Deinen Callstack nicht. Das ist doch nicht der Callstack wenn der ASSERT kommt. Zudem: Warum auf einmal IDCANCEL und vorher IDOK?



  • Ab VS2012 gab's Probleme, wenn EndDialog() in OnInitDialog() aufgerufen wurde. Wenn ich mich recht erinnere, wurde in diesem Fall OnInitDialog ein zweites mal aufgerufen. Sollte eigentlich inzwischen gefixed sein.

    Beschreibung und Workaraound: http://connect.microsoft.com/VisualStudio/feedback/details/772859/calling-enddialog-within-oninitdialog-causes-the-dialog-to-be-displayed-twice#details

    Gruß,
    Matthias


Anmelden zum Antworten