树形视图控件和对话框切换的问题

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

这是我写的代码,新手,很啰嗦
m_pDlg = new CParaDlg;
m_hDlg = new CHESimuDlg;
m_rDlg = new CRESimuDlg;
// 指定显示的对话框
CString str = GetTreeCtrl().GetItemText(select_item);
if(str == "工艺参数管理")
{
if(m_hDlg!=NULL)
{
m_hDlg->DestroyWindow();
delete m_hDlg;
}
if(m_rDlg!=NULL)
{
m_rDlg->DestroyWindow();
delete m_rDlg;
}
m_pDlg = new CParaDlg;
m_pDlg->Create(IDD_PARA,pView);
m_pDlg->ShowWindow(SW_SHOW);
}

if(str == "换热系统模拟")
{
if(m_pDlg!=NULL)
{
m_pDlg->DestroyWindow();
delete m_pDlg;
}
if(m_rDlg!=NULL)
{
m_rDlg->DestroyWindow();
delete m_rDlg;
}
m_hDlg = new CHESimuDlg;
m_hDlg->Create(IDD_HESIMU,pView);
m_hDlg->ShowWindow(SW_SHOW);
}

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);
}

*pResult = 0;
...全文
312 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
qwzhhb 2010-12-03
  • 打赏
  • 举报
回复
一下内容来自百度贴吧:
“Release确实解决了...继续调试中...
release的方法是这样的...
打开"编译"->"配置"->"把里面除了release其他的选项全部删除,再构件就OK了”
我试了下,果然解决了,哈哈,太神了
chen_freecom 2010-12-02
  • 打赏
  • 举报
回复
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);
}
qwzhhb 2010-12-02
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 happyparrot 的回复:]
就这段来说:
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->Cr……
[/Quote]因为在调用其他对话框的时候Delete了,为了只好再创建一次,如果不在外边创建总是出错,这个也试过了
qwzhhb 2010-12-02
  • 打赏
  • 举报
回复
他们的不同之处是“换热**”里面有个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
qwzhhb 2010-12-02
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 happyparrot 的回复:]
引用 5 楼 qwzhhb 的回复:
引用 3 楼 happyparrot 的回复:
你用得着这么new/delete的吗?不需要的时候,ShowWindow(SW_HIDE)隐藏掉就行了。
另外,你的问题估计出在执行delete m_pDlg之后,没有将m_pDlg赋值为空造成的,后续再判断m_pDlg是否为空会出现问题。

所有 delete m_*Dlg后,加 m_*Dlg = N……
[/Quote]没学好,只是这么感觉的,找到一点眉目了,我发现在调用“工艺**”和“反应**”对话框的时候不会出错,但是调用“换热**”对话框的时候会出错,是不是我别的地方没写对呢
快乐鹦鹉 2010-12-02
  • 打赏
  • 举报
回复
就这段来说:
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了对象了,这里又来一遍,什么道理?
快乐鹦鹉 2010-12-02
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 qwzhhb 的回复:]
引用 3 楼 happyparrot 的回复:
你用得着这么new/delete的吗?不需要的时候,ShowWindow(SW_HIDE)隐藏掉就行了。
另外,你的问题估计出在执行delete m_pDlg之后,没有将m_pDlg赋值为空造成的,后续再判断m_pDlg是否为空会出现问题。

所有 delete m_*Dlg后,加 m_*Dlg = NULL;语句。
赋值为空了以后还是那样……
[/Quote]
谁告诉你delete以后就是空值的?
qwzhhb 2010-12-02
  • 打赏
  • 举报
回复
我开始用的也是隐藏,不过总是不行,只好用删除这么极端的方法了,只是小程序,能解决问题就行,周围也没有会程序的,自己做真难受啊
qwzhhb 2010-12-02
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 happyparrot 的回复:]
你用得着这么new/delete的吗?不需要的时候,ShowWindow(SW_HIDE)隐藏掉就行了。
另外,你的问题估计出在执行delete m_pDlg之后,没有将m_pDlg赋值为空造成的,后续再判断m_pDlg是否为空会出现问题。

所有 delete m_*Dlg后,加 m_*Dlg = NULL;语句。
[/Quote]赋值为空了以后还是那样,没有什么不同啊,Delete以后不就是空值了?
qwzhhb 2010-12-02
  • 打赏
  • 举报
回复
还是不行啊,这样连两个对话框切换都出错了
快乐鹦鹉 2010-12-02
  • 打赏
  • 举报
回复
你用得着这么new/delete的吗?不需要的时候,ShowWindow(SW_HIDE)隐藏掉就行了。
另外,你的问题估计出在执行delete m_pDlg之后,没有将m_pDlg赋值为空造成的,后续再判断m_pDlg是否为空会出现问题。

所有 delete m_*Dlg后,加 m_*Dlg = NULL;语句。
kintar_chu 2010-12-02
  • 打赏
  • 举报
回复
m_rDlg->ShowWIndow(SW_HIDE);
}
m_pDlg = new CParaDlg; ---------->这句话不要...刚才发错了
if(!m_pDlg->IsWindowVisible())
{
m_pDlg->ShowWIndow(SW_SHOW);
}
其他的同上...
}
kintar_chu 2010-12-02
  • 打赏
  • 举报
回复
那么费劲做什么.你直接隐藏或者显示不就完了.每次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);
}
其他的同上...
}

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧