C++ 调试断言插入项函数失败

C++ 调试断言插入项函数失败,c++,mfc,modal-dialog,C++,Mfc,Modal Dialog,当前正在MFC中编写一个基于对话框的应用程序,该应用程序在按下主对话框上的按钮时创建一个子对话框。子对话框有3个编辑控制框和一个按钮。按下按钮时,将检索来自三个编辑控制框的信息,并将其存储为单独的字符串。这些CString被传递给位于主Dlg.cpp中的函数。该函数接受这些字符串并将它们插入列表控件中。程序运行良好,直到按下“添加”按钮(在子对话框上)为止。不确定为什么程序会崩溃我的参数似乎正确?我也不确定这是否是在两个对话框之间传递数据的最佳方式。如果您有更好的建议,我们也将不胜感激 弹出添加

当前正在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的目的;谢谢你做得很好。我自己也在努力学习这些东西,但我似乎忽略了最重要的部分。再次感谢。