有两个dialog,第一个dialog要调用第二个dialog中输入的数据,为什么调用的变量的值为0?程序如下:
第一个DIALOG中:
void CMonte0521Dlg::OnButton1()
{
UpdateData();
int i;
Czhengtai zt;
double *zhengtai=new double[m_SamNum];
double randf;
srand(GetTickCount());
for(i=0; i<num; i++)
{
randf=(double)(rand()/(double)RAND_MAX);
zhengtai[i]=zt.m_zhengtai1+zt.m_zhengtai2*randf;
}
zt.SamNum=zhengtai[0];
delete zhengtai;
m_MTBF.Format("%6.2f",zt.SamNum);
UpdateData(FALSE);
}
...
void CMonte0521Dlg::OnSelchangeCombo1()
{
// TODO: Add your control notification handler code here
int nIndex=m_Pattern1.GetCurSel();
switch (nIndex)
{
case 0:
{Czhengtai zt;
if(zt.DoModal()==IDOK)
{ UpdateData();
}
}
break;
...
其中
m_zhengtai1,m_zhengtai2是弹出的第二个DIALOG中输入的EDIT的相关变量,运行后这个两个变量一直为0,为什么啊?小弟刚接触MFC不久,多谢帮助!
第一个DIALOG中:
void CMonte0521Dlg::OnButton1()
{
UpdateData();
int i;
Czhengtai zt;
double *zhengtai=new double[m_SamNum];
double randf;
srand(GetTickCount());
for(i=0; i<num; i++)
{
randf=(double)(rand()/(double)RAND_MAX);
zhengtai[i]=zt.m_zhengtai1+zt.m_zhengtai2*randf;
}
zt.SamNum=zhengtai[0];
delete zhengtai;
m_MTBF.Format("%6.2f",zt.SamNum);
UpdateData(FALSE);
}
...
void CMonte0521Dlg::OnSelchangeCombo1()
{
// TODO: Add your control notification handler code here
int nIndex=m_Pattern1.GetCurSel();
switch (nIndex)
{
case 0:
{Czhengtai zt;
if(zt.DoModal()==IDOK)
{ UpdateData();
}
}
break;
...
其中
m_zhengtai1,m_zhengtai2是弹出的第二个DIALOG中输入的EDIT的相关变量,运行后这个两个变量一直为0,为什么啊?小弟刚接触MFC不久,多谢帮助!
对话框初始化函数中 dlg1=this;第一个对话框通过这个指针来操作第二个对话框
extern CDialog1Dlg* dlg2;
dlg2->GetDlgItemInt(IDC_STATIC1,c);
{
randf=(double)(rand()/(double)RAND_MAX);
zhengtai[i]=zt.m_zhengtai1+zt.m_zhengtai2*randf;
} 我猜,zt就是第二个弹出对话框的对象吧。
在使用zt.m_zhengtai1和zt.m_zhengtai2之前,你并没有对zt做任何操作啊,只是生成这个对象而已。你访问的值当然是默认值喽。
我想你是想这样:Czhengtai zt;
if(zt.DoModal()==IDOK)
{
for(i=0; i <num; i++)
{
randf=(double)(rand()/(double)RAND_MAX);
zhengtai[i]=zt.m_zhengtai1+zt.m_zhengtai2*randf;
}
}
说的对也可以在CMonte0521Dlg类中定义一些成员变量来保存Czhengtai传过来的数据比如:
CString m_zhengtai1;
void CMonte0521Dlg::OnSelchangeCombo1()
{
// TODO: Add your control notification handler code here
int nIndex=m_Pattern1.GetCurSel();
switch (nIndex)
{
case 0:
{Czhengtai zt;
if(zt.DoModal()==IDOK)
{ UpdateData();
m_zhengtai1=zt.m_zhengtai1;
}
}
break;
..........在别的地方就用m_zhengtai1就行了,不需要在定义Czhengtai 的对象
extern CDialog1Dlg* dlg2;
这个命令加在哪里?加在第一个dialog的头文件里的public下:
error C2071: 'zt' : illegal storage class
Monte0521Dlg.cpp
不怎么懂,麻烦各位朋友再说细点好吗?谢谢
我觉得应该可以这样
在第二个对话框的类中声明并实现获取这两个成员变量的方法
double GetValue1st()
{
Updatedata(TRUE);
return m_zhengtai1;
}然后在第一个对话框中
CZhengtai zt;
double dbValue = 0.0;
if (IDOK == zt.DoModal())
{
dbValue = zt.GetValue1st();
}应该就可以了
用指针要麻烦一些。
我想可以这样:
假设:CDialog1,CDialog2
步骤:
1:可以为CDialog1声明一个CDialog2 *的指针变量。
2:在CDialog1的OnInitDialog函数内new一个CDialog2,然后Create;
3:当需要显示CDialog2的时候,就调用ShowWindow;
4:CDialog2完成工作后,隐藏,并且通过消息通知CDialog1;
5:CDialog1收到消息后,取得CDialog2的数据,进行自己的处理;
6:记得销毁CDialog2窗口,并且释放new得到的内存。如果是我,我就这么做。