Create bei CFormView / CFormView als Unterfenster von CDialog



  • Hallo,

    ich habe eine SDI Anwendung die erweitert werden soll. Hierzu soll von einem Hauptfenster (CDialog) aus ein Nebenfenster (CFormView) geöffnet werden. Ich arbeite hierzu mit dem Befehl Create von Cwnd.
    BOOL Create (LPCTSTR lpszClassName,
    LPCTSTR lpszWindowName,
    DWORD dwStyle = WS_OVERLAPPEDWINDOW,
    const RECT& rect = rectDefault,
    CWnd* pParentWnd = NULL,
    LPCTSTR lpszMenuName = NULL,
    DWORD dwExStyle = 0,
    CCreateContext* pContext = NULL );

    Ich habe die Attribute folgend ausgefüllt:

    CString strFenstername = "Fenstername";
    m_pKlasseCFormView = new CKlasseCFormView();
    RECT R;
    this->GetWindowRect(&R);

    m_pKlasseCFormView->Create(NULL, strFenstername, WS_OVERLAPPEDWINDOW, R, NULL, IDD_CFormView_FORM);

    Das ganze wird fehlerfrei kompiliert, bei der Ausführung kommt aber eine Fehlermeldung. Der Debugger springt in die Datei Viewform.cpp der MFC und zeigt folgene Stelle an: ASSERT(pParentWnd != NULL);

    Es wäre nett falls jemand eine Idee hat, Martin



  • Erm ... Also bitte ... Da kommt man wohl selber drauf ... Man schaue sich die Parameter von Create an und dann nochmals den Ausdruck in ASSERT. Und dann passiert das: 😕 ➡ 💡 und gut is ...



  • Lies die Zeile mit dem ASSERT, lies die MSDN zu dem Befehl, schau dir an, was du Create für Parameter gibst, besonders der 3. von hinten. Und dann denk mal nach...

    Wenns immer noch nicht klingelt, sag nochmal Bescheid.



  • Ich habe den Code nun folgend geändert:

    CString strFenstername = "Fenstername";
    m_pKlasseCFormView = new CKlasseCFormView();
    CRect R;
    GetClientRect(R);
    m_pKlasseCFormView->Create(NULL, strFenstername, WS_OVERLAPPEDWINDOW, R, NULL, IDD_CFormView_FORM);

    Allerdings hängt sich das Programm immernoch in der Datei Viewform.cpp der MFC auf. Und dies geschieht an dieser Stelle (m_lpszTemplateName=0x000000a8):

    // dialog template must exist and be invisible with WS_CHILD set
    if (!_AfxCheckDialogTemplate(m_lpszTemplateName, TRUE))
    {
    ➡ ASSERT(FALSE); // invalid dialog template name
    PostNcDestroy(); // cleanup if Create fails too soon
    return FALSE;
    }

    Martin



  • An der fehlerhaften Stelle hast du nichts geändert... 🙄



  • Da ich im Moment nicht richtig weiterweis, schreib ich mal meine Deutung zu den Parametern auf:
    1. NULL : Klassenname, kann laut MSDN auch NULL sein
    2. strFenstername : Name des zu erzeugenden Fensters
    3. WS_OVERLAPPEDWINDOW : Darstellungsstill, WS_OVERLAPPEDWINDOW soll eine Art Defaultwert sein. Habe ich auch schon mit WS_CHILD ergänzt.
    4. R : Größe und Standort des neuen Fensters, jetzt über CRect R(10,20,100,130); festgelegt
    5. NULL : Zeiger auf das Hauptfenster. Habe ich mit NULL, this und pParent ausprobiert.
    6. IDD_CFormView_FORM : ID des neuen Fensters
    7. Context : Optionaler Parameter

    In welchem Parameter liegt den der Denkfehler? Ich würde ja auf Nummer 5 tippen, irgendwie hängst ja meistens an den Zeigern 😉 !

    Martin



  • Nummer 5 (lebt 🤡 )
    .. nein, das ist schon der mit dem Fehler. this sollte da richtig sein, denke ich.

    Was passiert denn, wenn du das hinschreibst?



  • Egal welchen Wert ich da eintrage, leider auch bei this, kommt es immer zum Absturz an der gleichen Stelle. Und zwar in der Datei Viewform.cpp. Der Ort des Gesehens ist (m_lpszTemplateName=0x000000a8):

    // dialog template must exist and be invisible with WS_CHILD set
    if (!_AfxCheckDialogTemplate(m_lpszTemplateName, TRUE))
    {
    ➡ ASSERT(FALSE); // invalid dialog template name
    PostNcDestroy(); // cleanup if Create fails too soon
    return FALSE;
    }



  • Den Fehler hatte ich ganz zu Anfang meines Projektes mal, ich weiß nur nicht mehr, was es war. 😞
    Ich glaube, ich hab die Klasse nochmal neu erstellt (also Neu Klasse anlegen und übertragen).

    Hab grade mal in meinen Beitrag in der FAQ geguckt: http://www.c-plusplus.net/forum/viewtopic.php?t=81908

    Das sind die Parameter, die ich verwende. Ich fürchte aber, es liegt nicht an den Parametern...

    (0, 0, WS_CHILD | WS_BORDER, CRect(0, 0, 0, 0), f_pParent, AFX_IDW_PANE_FIRST, &f_rCreateContext);
    


  • Ich probiere es mal aus.
    Danke für die Hilfe,

    Martin



  • Mach mal nen Rebuild All.



  • Das hilft leider nicht. Habe auch schon die Debug und Release Fenster per Hand geleert und "alles neu erstellen" durchgeführt. Das wird wohl noch eine harte Nuß...


Log in to reply