2014-01-22 52 views
0

我有一個帶有屬性窗口的MFC應用程序。我屬性窗口我已經實現了一個自定義的CMFCPropertyGridProperty,所​​以無論何時用戶單擊添加在該屬性中的按鈕,都會彈出另一個對話框。MFC對話框成員變量不在範圍內的隨機崩潰

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()之後,最好的方法是獲取多個成員變量。請幫忙。

+0

應該有這樣做沒問題,所以問題在於你的對話框的代碼。 「隨機」問題通常表示未初始化的變量。 – molbdnilo

+0

@molbdnilo,在構造函數中我已經初始化它「」。仍然無法解決它。實際上,變量存儲哪個字段在listctrl中被選中並生成一個字符串並將其存儲爲meber變量。我甚至在OnClickOK函數中放置了斷點。價值在那裏仍然可以訪問。但是在完成模式之後,會發生隨機崩潰。我可以試試這個以避免碰撞至少嗎? –

+0

即使你可以捕捉到這種異常,而你卻無法忽略它,但忽略它卻沒有什麼意義。您需要顯示對話框代碼。 – molbdnilo

回答

0

最後我做了一些改變,解決了這個問題。 1.改變自定義CMFCPropertyGridProperty類的構造函數,特別是COleVariant類型的參數。 2.更改對話框類的構造函數以獲取CTreeNode *並將其存儲爲成員變量。不知何故,該指針在DoModal之後被破壞。 3.增加了一些Assert()來檢查自定義CMFCPropertyGridProperty類的onclickbutton()中的Redraw()。 我不知道所有這些更改的確切原因。發現在Google code

這裏的參考代碼是自定義CMFCPropertyGridProperty類的OnClickButton:

void CMFCPropertyGridPropertyCustomClass::OnClickButton(CPoint point) 
    { 
     ASSERT_VALID(this); 
     ASSERT_VALID(m_pWndList); 
     ASSERT_VALID(m_pWndInPlace); 
     ASSERT(::IsWindow(m_pWndInPlace->GetSafeHwnd())); 

     m_bButtonIsDown = TRUE; 
     Redraw(); 

     BOOL bUpdate  = FALSE; 
     CString selOutput = ""; 

     CSomeClassDlg* configDlg = new CSomeClassDlg(m_selNode);        
     INT_PTR bResult = configDlg->DoModal();        
     if(bResult == IDOK) 
     { 
      bUpdate  = TRUE; 
      //Do Something 
     } 

     if (bUpdate) 
     { 
      if (m_pWndInPlace != NULL) 
      { 
       m_pWndInPlace->SetWindowText(selOutput); 
      } 

      m_varValue = (LPCTSTR) selOutput; 
     } 

     m_bButtonIsDown = FALSE; 
     Redraw(); 

     if (m_pWndInPlace != NULL) 
     { 
      m_pWndInPlace->SetFocus(); 
     } 
     else 
     { 
      m_pWndList->SetFocus(); 
     } 

    } 

這是自定義CMFCPropertyGridProperty類的構造函數:

 CMFCPropertyGridPropertyCustomClass::CMFCPropertyGridPropertyCustomClass(CTreeNode* pNode, const CString& strName, const CString& varValue, const CString& description) : CMFCPropertyGridProperty(strName, COleVariant((LPCTSTR)varValue), description) 
    { 
     //some initialization 

    }