按F5说错误位置在这里。
if(m_edit)
{//将编辑框中的数据写回对应的子项目中
UpdateData( );
CString str;
m_edit->GetWindowText(str);
SetItemText(m_item,m_subitem,str);
delete m_edit;
m_edit=NULL;
}
*pResult = 0;
m_edit是自己定义的一个指针,初始为空。
First-chance exception in Hourratecalculator01.exe (MFC42D.DLL): 0xC0000005: Access Violation.这个是错误提示。mfc

解决方案 »

  1.   

    这种情况应该是逻辑问题,问题的原因往往是指针所指的对象已经销毁,使指针成为野指针,调用m_edit->GetWindowText(str); 时就会出这种错误。问题不一定出在这一段中,F10整体走一遍看看
      

  2.   

    如果是野指针,还有if(m_edit)啊
      

  3.   

    m_edit也不能频繁地创建和销毁,你只是在需要时移动下它的位置而已,通过显示和隐藏来控制状态
      

  4.   

    if(m_edit)智能判断指针是否为NULL,并不能排除野指针的可能啊!野指针也有值啊
      

  5.   

    class CListEditCtrl : public CListEditCtrlImpl<CListEditCtrl>
    {
    public:
    DECLARE_WND_SUPERCLASS(_T("CListEditCtrl"), GetWndClassName())
    private:
    typedef  CListEditCtrlImpl<CListEditCtrl> baseClass;public: BEGIN_MSG_MAP_EX(CListEditCtrl)
    // MSG_WM_SETFOCUS(OnSetFocus)
    MSG_WM_KILLFOCUS(OnKillFocus)
    MSG_WM_SHOWWINDOW(OnShowWindow)
    CHAIN_MSG_MAP(baseClass)
    END_MSG_MAP() void OnSetFocus(CWindow wndOld)
    {
    SetMsgHandled(FALSE);
    } void OnKillFocus(CWindow wndFocus)
    {
    ShowWindow(SW_HIDE);
    SetMsgHandled(FALSE);
    } void OnShowWindow(BOOL bShow, UINT nStatus)
    {
    if (nStatus == SW_HIDE)
    {
    ::SendMessage(GetParent(), WM_USER_UPDATA_ITEM, 1, 0);
    SetWindowText("");
    }
    SetMsgHandled(FALSE);
    }
    };CListEditCtrl  m_edit;m_edit.Create((m_hWnd), &rcDefault, "", ES_AUTOHSCROLL|WS_CHILD|ES_RIGHT|ES_WANTRETURN|WS_BORDER);
    m_edit.ShowWindow(SW_HIDE);
    m_edit.CreateCaret(NULL);
    void EditItem(int nItem, int nSubItem)
    {
    if (::IsWindow(m_edit.m_hWnd))
    {
    if (nItem >= 0 && nSubItem >= 0)
    {
    CRect rcCtrl;
    GetSubItemRect(nItem, nSubItem, LVIR_LABEL, &rcCtrl);
    TCHAR szItem[128] = {0};
    GetItemText(nItem, nSubItem, szItem, _countof(szItem));
    m_edit.MoveWindow(&rcCtrl);
    m_edit.SetWindowPos(m_hWnd, rcCtrl.left, rcCtrl.top, rcCtrl.Width(), rcCtrl.Height(), SWP_SHOWWINDOW);
    m_edit.ShowWindow(SW_SHOW);
    m_edit.SetWindowText(szItem);
    ::SetFocus(m_edit.m_hWnd);
    m_edit.SetSel(-1);
    m_edit.BringWindowToTop();
    SetCaretPos(rcCtrl.right-2,rcCtrl.top);
    m_edit.ShowCaret(); m_nlastSelectItem = nItem;
    m_nlastSelectSubItem = nSubItem;
    }
    }
    } void SaveEditItem(int nItem, int nSubItem)
    {
    if (m_edit.IsWindowVisible() && nItem >=0 &&nSubItem >= 0)
    {
    TCHAR szItem[128] = {0};
    m_edit.GetWindowText(szItem, _countof(szItem));
    SetItemText(nItem, nSubItem, szItem);
    //::SendMessage(GetParent().GetParent().m_hWnd, WM_USER_UPDATE_DEFINE_PRICE, m_nlastSelectItem, nSubItem);
    }
    }