C++ 调试断言插入项函数失败
当前正在MFC中编写一个基于对话框的应用程序,该应用程序在按下主对话框上的按钮时创建一个子对话框。子对话框有3个编辑控制框和一个按钮。按下按钮时,将检索来自三个编辑控制框的信息,并将其存储为单独的字符串。这些CString被传递给位于主Dlg.cpp中的函数。该函数接受这些字符串并将它们插入列表控件中。程序运行良好,直到按下“添加”按钮(在子对话框上)为止。不确定为什么程序会崩溃我的参数似乎正确?我也不确定这是否是在两个对话框之间传递数据的最佳方式。如果您有更好的建议,我们也将不胜感激 弹出添加按钮功能C++ 调试断言插入项函数失败,c++,mfc,modal-dialog,C++,Mfc,Modal Dialog,当前正在MFC中编写一个基于对话框的应用程序,该应用程序在按下主对话框上的按钮时创建一个子对话框。子对话框有3个编辑控制框和一个按钮。按下按钮时,将检索来自三个编辑控制框的信息,并将其存储为单独的字符串。这些CString被传递给位于主Dlg.cpp中的函数。该函数接受这些字符串并将它们插入列表控件中。程序运行良好,直到按下“添加”按钮(在子对话框上)为止。不确定为什么程序会崩溃我的参数似乎正确?我也不确定这是否是在两个对话框之间传递数据的最佳方式。如果您有更好的建议,我们也将不胜感激 弹出添加
void Popup::OnBnClickedPopadd()
{
CString str1, str2, str3;
CThermotronDlg dlg;
GetDlgItemText(ID_RampEdit,str1);
GetDlgItemText(ID_DwellEdit,str2);
GetDlgItemText(ID_TempEdit,str3);
dlg.ReciveAndDisplay(str1,str2,str3);
}
void CThermotronDlg::ReciveAndDisplay(CString str1, CString str2,CString str3){
LPCTSTR ramp(str1),dwell(str2),temp(str3);
MyListEx.InsertItem(1,ramp);
MyListEx.SetItemText(0,1,dwell);
MyListEx.SetItemText(0,2,temp);
}
接收和显示功能
void Popup::OnBnClickedPopadd()
{
CString str1, str2, str3;
CThermotronDlg dlg;
GetDlgItemText(ID_RampEdit,str1);
GetDlgItemText(ID_DwellEdit,str2);
GetDlgItemText(ID_TempEdit,str3);
dlg.ReciveAndDisplay(str1,str2,str3);
}
void CThermotronDlg::ReciveAndDisplay(CString str1, CString str2,CString str3){
LPCTSTR ramp(str1),dwell(str2),temp(str3);
MyListEx.InsertItem(1,ramp);
MyListEx.SetItemText(0,1,dwell);
MyListEx.SetItemText(0,2,temp);
}
而不是初始化变量
CThermotronDlg
在弹出对话框中,您需要直接找到主对话框的地址和调用此对话框的ReceiveAndDisplay方法。其中一种方法是访问应用程序对象的公共变量(theApp
)。bnClickedPopAdd()的正确代码为:
void Popup::OnBnClickedPopadd()
{
CString str1, str2, str3;
CThermotronDlg *pDlg = (CThermotronDlg*)theApp.m_pMainWnd;
GetDlgItemText(ID_RampEdit,str1);
GetDlgItemText(ID_DwellEdit,str2);
GetDlgItemText(ID_TempEdit,str3);
pDlg->ReciveAndDisplay(str1,str2,str3);
}
我认为您的列表控件可能在RecieveAndDisplay执行时未初始化。您应该尝试从CThermotronDlg::OnInitDialog函数中获取字符串值。这可能与您在索引
1
处添加项目,然后在索引0
处设置项目文本有关。此外,LPCTSTR斜坡(str1)、驻留(str2)、温度(str3)代码>是不必要的。直接使用str1
、str2
和str3
。@IgorJerosimić不太可能,因为他说,第二个对话框是在按下主对话框(承载列表控件)上的按钮时创建的,如果按钮可见并且用户可以按下,OnInitDialog已经完成。@NikBougalis我以为他创建了新对话框(CThermotronDlg;)并向其发送数据。现在我已经更仔细地阅读了它,我认为你是对的,但在这种情况下,我不理解CThermotronDlg dlg的目的;谢谢你做得很好。我自己也在努力学习这些东西,但我似乎忽略了最重要的部分。再次感谢。