上次问的一个树形视图控件控制CFrameView显示的问题大致解决了,用的就是CSDN高手提供的方法,但是现在又出现了新的问题:我选用的调用对话框是非模态对话框,在调用别的对话框的时候也把从前调用过的对话框删除了,但是怎么还是出错。可以有两个对话框切换,在切换三个对话框的时候就出现这样的错误提示:

解决方案 »

  1.   

    那么费劲做什么.你直接隐藏或者显示不就完了.每次new和删除很影响执行效率的.
    m_pDlg = new CParaDlg;
    m_pDlg->Create(IDD_PARA,pView);
    m_pDlg->ShowWindow(SW_HIDE);
    m_hDlg = new CHESimuDlg;
    CHESimuDlg->Create("ID",pView);
    CHESimuDlg->ShowWindow(SW_HIDE);
    m_rDlg = new CRESimuDlg;
    m_rDlg->Create("ID",pView);
    m_rDlg->ShowWindow(SW_HIDE);
    这些在初始化的时候就要申请好.
    if(str == "工艺参数管理")
    {
    if(m_hDlg->IsWindowVisible()) // 判断是不是显示状态
    {
    m_hDlg->ShowWIndow(SW_HIDE);
    }
    if(m_rDlg->IsWindowVisible())
    {
    m_rDlg->ShowWIndow(SW_HIDE);
    }
    m_pDlg = new CParaDlg;
    if(!m_pDlg->IsWindowVisible())
    {
    m_pDlg->ShowWIndow(SW_SHOW);
    }
    其他的同上...
    }
      

  2.   

    m_rDlg->ShowWIndow(SW_HIDE);
    }
    m_pDlg = new CParaDlg; ---------->这句话不要...刚才发错了
    if(!m_pDlg->IsWindowVisible())
    {
    m_pDlg->ShowWIndow(SW_SHOW);
    }
    其他的同上...
    }
      

  3.   

    你用得着这么new/delete的吗?不需要的时候,ShowWindow(SW_HIDE)隐藏掉就行了。
    另外,你的问题估计出在执行delete m_pDlg之后,没有将m_pDlg赋值为空造成的,后续再判断m_pDlg是否为空会出现问题。所有 delete m_*Dlg后,加 m_*Dlg = NULL;语句。
      

  4.   

    赋值为空了以后还是那样,没有什么不同啊,Delete以后不就是空值了?
      

  5.   

    谁告诉你delete以后就是空值的?
      

  6.   

    就这段来说:
    if(str == "反应系统模拟")
    {
    if(m_hDlg!=NULL)
    {
    m_hDlg->DestroyWindow();
    delete m_hDlg;
    }
    if(m_pDlg!=NULL)
    {
    m_pDlg->DestroyWindow();
    delete m_pDlg;
    }
    m_rDlg = new CRESimuDlg;
    m_rDlg->Create(IDD_RESIMU,pView);
    m_rDlg->ShowWindow(SW_SHOW);
    }之前你的m_rDlg应该已经new了对象了,这里又来一遍,什么道理?
      

  7.   

    他们的不同之处是“换热**”里面有个OnInitDialog()函数,初始化了一个ADO数据库的连接
    BOOL CHESimuDlg::OnInitDialog() 
    {
    CDialog::OnInitDialog();
    // TODO: Add extra initialization here
    // 初始化COM,创建ADO连接等操作
    AfxOleInit();
    m_pConnection.CreateInstance(__uuidof(Connection)); //捕获错误信息
    try
    {
    // 打开本地Access库Demo.mdb
    m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Ethoxylation.mdb","","",adModeUnknown);
    }

    catch(_com_error& e)
    {
    AfxMessageBox("数据库连接失败,确认数据库Ethoxylation.mdb是否在当前路径下!");
    return FALSE;
    }

    if(m_pConnection->State)
    m_pConnection->Close();
    m_pConnection= NULL;
    return TRUE;  // return TRUE unless you set the focus to a control
                  // EXCEPTION: OCX Property Pages should return FALSE
      

  8.   

    因为在调用其他对话框的时候Delete了,为了只好再创建一次,如果不在外边创建总是出错,这个也试过了
      

  9.   

    1。delete后赋空值
    2。重复点击的时候貌似就重复产生对话框,引起内存泄露
    3。与其这样做还不如直接产生全部的对话框切换显示。可以这样做:声明一个指针表示正在显示的指针
    CWnd *pShow,在树形控件的子项SetItemData将对话框指针设置进去,当点击的时候
    CWnd *pDlg=(CWnd *)m_tree.GetItemData(htreeitem);
    if(pShow != pDlg)
    {
       pShow->ShowWindow(SW_HIDE);
       pShow=pDlg;
       pShow->ShowWindow(SW_SHOW);
    }
      

  10.   

    一下内容来自百度贴吧:
    “Release确实解决了...继续调试中...
    release的方法是这样的...
    打开"编译"->"配置"->"把里面除了release其他的选项全部删除,再构件就OK了”
    我试了下,果然解决了,哈哈,太神了