关于不同对话框间数据传递问题~~

来源:百度知道 编辑:UC知道 时间:2024/05/25 17:39:04
程序目的是想双击主对话框上的列表控件,然后弹出一个新的对话框在上面输入数值来修改列表控件的值。
下面是我的程序,但是当我双击列表框第三行时出现错误:“debugassertion failed! ....”
错误应该就出现在int n=ed2.m_combo1.GetCurSel();和ed2.m_combo1.GetLBText(n,str);这两个地方。
但我运行是可以运行的,双击那一行时就跳出那个错误对话框。请各位高手帮忙看看,不同对话框间要怎么样传递数据的?请帮忙修改一下,先谢过了!

void CDialog1::OnDblclkList(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
POSITION pos = m_list2.GetFirstSelectedItemPosition();
m_nIndex = m_list2.GetNextSelectedItem(pos); // 得到项目索引

if(m_nIndex==-1)
{
MessageBox("请选择一项在修改!","提示",MB_ICONINFORMATION);
return;
}

if (m_nIndex==2) //如果双击列表框第三行就弹出另外 一个对话框(CEditDialog2),上面有一个组合框(控件变量m_combo1)和一个编辑框(CSTring m_strName2).

{
CEditDialog2 ed2;
CString str;
int n=ed2.m_combo1.GetCurSel();
ed2.m_strName2=m_list2.GetItemText(2,0);

ed2.m_combo1.GetLBText(n,s

就算你把代码放到OnInitDialog中,也要放到 CDialog::OnInitDialog();之后.

你把你的代码发到我的邮箱吧.我帮你调试;
xie_jian_jun@163.com
===========================================================
ed2在调用domodal之前是不能够访问其中包括的控件的.否则请会出现错误.
我将你的这一段代码注释了一下,你大概能看懂:
CEditDialog2 ed2;
CString str;
int n=ed2.m_combo1.GetCurSel(); //这一句是不能使用的,如果你真要访问m_combo1,则必须在已经调用了DoModal之后,也既是在对话框类的代码中访问.
因为m_combo1在这时并没有真正的创建,你想一想就知道,对话框都还没创建,怎么可能对话框上的控件就已经创建了嘛.
ed2.m_strName2=m_list2.GetItemText(2,0);

ed2.m_combo1.GetLBText(n,str); //这个一样的错误,与上面的.
if (ed2.DoModal()==IDOK)
{
m_list2.SetItemText(2,0,ed2.m_strName2);
m_list2.SetItemText(2,1,str);
}

最后说明:
你可以增加CEditDialog2 类的数据成员来达到你想要的目的,当你的对话框返回以后,你可访问CEditDialog2 中你定义的数据成员来读取,你在CEditDialog2 中所选择的数据.

在对话框的窗体的类中定义你需要的变量,同时在你定义了你要显示的类之后,在窗体显示之前,你就要通过直接赋值或者通过函数赋值,然后再给你的窗体中的元素赋值,之后在对窗口进行显示。

如果是在窗体中有的参数,返回到主窗体上,需要定义一个函数用于返回你所需要的值即可。如果你定义的是公有类,则直接返回即可。