Информация об изменениях

Сообщение Re[2]: Обновление MFC проекта с VS2010 на VS2015 от 26.09.2018 8:25

Изменено 26.09.2018 8:46 Nikolaz

Re[2]: Обновление MFC проекта с VS2010 на VS2015
Здравствуйте, RainBoy, Вы писали:

RB>Небольшое дополнение


RB>
CProblemView::CProblemView()
RB>{
RB>    CProblemDoc* pDoc = GetDocument();
RB>    ASSERT_VALID(pDoc);
RB>


RB>Вылетает в Assert и в моем и в сгенерированном VS2015 приложении. pDoc используется в конструкторе, но не инициализирован в VS2015

Э-э ... Это вы сами вписали или это сгенерированный студией код в пустом проекте?

Указатель на документ в СView будет вылидным позже. См. код из MFC:

void CDocument::AddView(CView* pView)
{
    ASSERT_VALID(pView);
    ASSERT(pView->m_pDocument == NULL); // must not be already attached
    ASSERT(m_viewList.Find(pView, NULL) == NULL);   // must not be in list

    m_viewList.AddTail(pView);
    ASSERT(pView->m_pDocument == NULL); // must be un-attached
    pView->m_pDocument = this;

    OnChangedViewList();    // must be the last thing done to the document
}

void CDocument::RemoveView(CView* pView)
{
    ASSERT_VALID(pView);
    ASSERT(pView->m_pDocument == this); // must be attached to us

    m_viewList.RemoveAt(m_viewList.Find(pView));
    pView->m_pDocument = NULL;

    OnChangedViewList();    // must be the last thing done to the document
}
Re[2]: Обновление MFC проекта с VS2010 на VS2015
Здравствуйте, RainBoy, Вы писали:

RB>Небольшое дополнение


RB>
CProblemView::CProblemView()
RB>{
RB>    CProblemDoc* pDoc = GetDocument();
RB>    ASSERT_VALID(pDoc);
RB>


RB>Вылетает в Assert и в моем и в сгенерированном VS2015 приложении. pDoc используется в конструкторе, но не инициализирован в VS2015

Э-э ... Это вы сами вписали или это сгенерированный студией код в пустом проекте?
Если во View после его создания нужен доступ к документу,то делать это нужно (в вашем случае) в CProblemView::OnInitialUpdate().

Указатель на документ в СView будет вылидным позже. AddView (см. ниже) вызывается после вот этого кода в твоём приложении:
    CSingleDocTemplate* pDocTemplate;
    pDocTemplate = new CSingleDocTemplate(
        IDR_MAINFRAME,
        RUNTIME_CLASS(CProblemDoc),
        RUNTIME_CLASS(CMainFrame),       // main SDI frame window
        RUNTIME_CLASS(CProblemView));
    AddDocTemplate(pDocTemplate);


Пока документ и view не будут "связаны" через pDocTemplate или явно через AddView(CView* pView) у документа — ничего не будет.

Код из MFC:

void CDocument::AddView(CView* pView)
{
    ASSERT_VALID(pView);
    ASSERT(pView->m_pDocument == NULL); // must not be already attached
    ASSERT(m_viewList.Find(pView, NULL) == NULL);   // must not be in list

    m_viewList.AddTail(pView);
    ASSERT(pView->m_pDocument == NULL); // must be un-attached
    pView->m_pDocument = this;

    OnChangedViewList();    // must be the last thing done to the document
}

void CDocument::RemoveView(CView* pView)
{
    ASSERT_VALID(pView);
    ASSERT(pView->m_pDocument == this); // must be attached to us

    m_viewList.RemoveAt(m_viewList.Find(pView));
    pView->m_pDocument = NULL;

    OnChangedViewList();    // must be the last thing done to the document
}