将 CPtrList 从对话框传递到 MDI 框架

Passing CPtrList from a dialog to an MDI Frame

我有一个应用程序可以根据事先从对话框中收集的信息在 MDI 框架中构建网格,但是构建了多个网格并且我希望能够 select 其他网格(也使用信息构建从对话框中收集)通过 select 从功能区的组合框中编辑它们。

组合框在第一次创建 MDI 框架时填充,但是当我尝试 select 另一个网格时,CPtrList(使用对话框创建)中的元素已被删除;我假设对话框何时被销毁。

CMainFrame中的代码为:

    Cdialog dialog;

if (dialog.DoModal() == IDOK)
{

        CFrame* pFrame;

        BeginWaitCursor();

        CMultiDocTemplate *pDoc = GetDocTemplate(10);
        if (pDoc){

            CBlankDoc* pDocument = (CBlankDoc*)pDoc->CreateNewDocument();
            pDocument->SetTitle("Results");
            pFrame = (CFrame*)pDoc->CreateNewFrame(pDocument, NULL);
            if (pFrame)
            {
                pDoc->InitialUpdateFrame(pFrame, pDocument);
                pFrame->m_plSplits = dialog.GetSplits(); 
                pFrame->m_pParent = this;
                pFrame->m_pMainRibbon = GetRibbonBar();
                pFrame->MDIMaximize();
            }
        }
}

dialog.GetSplits();

看起来如下:

CPtrList* CDialog::GetSplits()
{
    return  &m_plSplits;
}

CPtrList* m_plSplits;

您 return 指向对话框内定义的对象的指针。

如果对话框销毁后CPtrList 中的指针仍然有效,您可以创建指针列表的副本。但在这种情况下,您还需要在框架内保留一个列表。目前你还保存了一个指针。

另一个想法是创建指针列表并将其分配给智能指针(使用shared_ptr)。然后你可以从对话框中传输智能指针,你可以将它分配给框架对象m_plSplits(这个成员也必须是智能指针)。

你必须明智地构建它并且你必须确定内部指针的生命周期......当列表被销毁时 CPtrList 不会销毁任何东西。

也许另一个容器就是像 std::list 这样的解决方案。这个容器可以被复制。