【发布时间】:2014-01-22 09:58:24
【问题描述】:
我有一个带有属性窗口的 MFC 应用程序。我的属性窗口我已经实现了一个自定义的CMFCPropertyGridProperty,所以每当用户单击该属性中添加的按钮时,就会弹出另一个对话框。
void CMFCPropertyGridCustomProperty::OnClickButton(CPoint point) {
CSampleDlg* configDlg = new CSampleDlg(NULL);
INT_PTR bResult = configDlg->DoModal();
if(bResult != 1) //If user cancels bResult is 2 ,if select ok bResult is 1
{
return;
}
CString selectedOutput = configDlg->GetSelectionOutput();
CString configValue = configDlg->GetSelectionElemValue();
但问题是,当我在调试模式下运行时,有时它工作正常,但有时它在 configDlg->GetSelectionOutput() 行上崩溃。在callStack中,我发现那个时候变量超出了作用域。
这是我的对话代码的一部分:
IMPLEMENT_DYNAMIC(CSomeClassDlg, CDialogEx)
CSomeClassDlg::CSomeClassDlg(CWnd* pParent /*=NULL*/)
: CDialogEx(CSomeClassDlg::IDD, pParent)
{
m_DevNameStr = "";
m_ElemValue = "";
}
CSomeClassDlg::~CSomeClassDlg()
{
delete m_DataXMLTree;
m_DataXMLTree = NULL;
delete m_TemplateXMLTree;
m_TemplateXMLTree = NULL;
}
void CSomeClassDlg::OnItemchangedElementList(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
int nPos = -1;
nPos = m_ElementListCtrl.GetNextItem(-1,LVNI_SELECTED);
if(nPos != -1)
{
elemDataNode = (CTreeNode*)(m_ElementListCtrl.GetItemData(nSelectedItemIndex));
elemTepmplateNode = GetTemplateElement(elemDataNode);
ShowElemDescription(elemDataNode,elemTepmplateNode);
}
else
{
return;
}
*pResult = 0;
}
void CSomeClassDlg::ShowElemDescription(CTreeNode* dataElemNode, CTreeNode* templateElemNode)
{
if(dataElemNode==NULL || templateElemNode==NULL)
{
m_DescEditCtrl.SetWindowTextA("");
return;
}
CString PIXITStr = templateElemNode->GetAttributeValue("AssociatedPixit");
CString descriptionStr = templateElemNode->GetAttributeValue("Description");
CString valueStr = dataElemNode->GetAttributeValue("Value");
m_DescEditCtrl.SetWindowTextA(descriptionStr);
m_DevNameStr = PIXITStr;
m_ElemValue = valueStr;
}
CString CSomeClassDlg::GetSelectionOutput()
{
return m_DevNameStr;
}
CString CSomeClassDlg::GetSelectionElemValue()
{
return m_ElemValue;
}
但我不明白这是否是问题所在,为什么不是每次都发生。如果真的是问题,那么在做 doModal() 之后获得多个成员变量的最佳方法是什么。请帮忙。
【问题讨论】:
-
这样做应该没有问题,所以问题出在对话框的代码上。 “随机”问题通常表示未初始化的变量。
-
@molbdnilo,在构造函数中我已经将它初始化为“”。还是解决不了。实际上,该变量存储在 listctrl 中选择了哪个字段并生成一个字符串并将其存储为 meber 变量。我什至在 OnClickOK 函数中设置了断点。该值仍然可以在那里访问。但是在 do 模态完成后,就会发生这种随机崩溃。我可以尝试一下如何避免崩溃吗?
-
即使你能捕捉到这种异常,但你不能,通过忽略它来解决错误也没有什么意义。您需要显示对话框代码。
-
@molbdnilo,添加了对话框的代码。请看一下
-
有没有可能因为我使用对话框的父窗口作为 NULL 是这一切的原因。我应该给父母 CWnd*