近来 使用了CTreeCtrl的控件加入了DBLICK鼠标双击事件.然后在这个函数中定义了一个对话框,当双击时就弹出该对话框,结果发现 弹出对话框后编辑完后按OK键 内存报错....有时在DOMODEL事还没弹出就报错.....检查了一下 内存管理没问题,请问哪个高手能够帮忙解决>..?

解决方案 »

  1.   

    void CService_interfaceDlg::OnDblclkUserinfoTree(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    static HTREEITEM Selected_next_child,
    Selected_first_Sib,
    Selected_item,
    Selected_next;
    static CString selectedtext[7];
    static int Selected_pos,
    year,
    month,
    day,
    d;
    char tempbuff[128]={0};
    AddUser Edit_User(this);
    Selected_item=m_userinfo_tree.GetSelectedItem();
    HTREEITEM Parent=m_userinfo_tree.GetRootItem();
    HTREEITEM SecectedParent=m_userinfo_tree.GetParentItem(m_userinfo_tree.GetSelectedItem());
        Selected_first_Sib=m_userinfo_tree.GetChildItem(Parent); for(int ii=0;ii<User_Num;ii++)
    {

    if(Selected_first_Sib==Selected_item)
    {
       Selected_pos=ii;
    break;
    }
    Selected_first_Sib=m_userinfo_tree.GetNextSiblingItem(Selected_first_Sib);
    }
        
    if(Parent==SecectedParent)
    {
         Edit_User.m_adantor=(p_header_user+Selected_pos)->sn;
     year=(p_header_user+Selected_pos)->staryear;
     month=(p_header_user+Selected_pos)->starmonth;
     day=(p_header_user+Selected_pos)->stardate;
     CTime time(year,month,day,0,0,0);
     //Edit_User.m_start_time=time;
     d=time.GetDay();
    // d=Edit_User.m_start_time.GetDay();
     CTimeSpan add((p_header_user+Selected_pos)->validdate,0,0,0);
     TRACE("# %d",add.GetDays());
     Edit_User.m_stoptime=Edit_User.m_start_time+add;
       Edit_User.m_status_combo=(p_header_user+Selected_pos)->status;             memcpy(tempbuff,(p_header_user+Selected_pos)->user_e_mail,sizeof((p_header_user+Selected_pos)->user_e_mail)<31?sizeof((p_header_user+Selected_pos)->user_e_mail):31);
     Edit_User.m_email=tempbuff;
     memset(tempbuff,0x00,128);             memcpy(tempbuff,(p_header_user+Selected_pos)->user_name,sizeof((p_header_user+Selected_pos)->user_name)<15?sizeof((p_header_user+Selected_pos)->user_name):15);  
     Edit_User.m_username=tempbuff;
                 memset(tempbuff,0x00,128);
                 
     memcpy(tempbuff,(p_header_user+Selected_pos)->user_password,sizeof((p_header_user+Selected_pos)->user_password)<15?sizeof((p_header_user+Selected_pos)->user_name):15);    
     Edit_User.m_password=tempbuff;
                 memset(tempbuff,0x00,128);             memcpy(tempbuff,(p_header_user+Selected_pos)->user_telephone,sizeof((p_header_user+Selected_pos)->user_telephone)<15?sizeof((p_header_user+Selected_pos)->user_telephone):15);    

     Edit_User.m_telephone=tempbuff; if(Edit_User.DoModal()==IDOK)
    {
     m_userinfo_tree.DeleteItem(Selected_item);
     Selected_next=m_userinfo_tree.GetNextSiblingItem(Selected_item);
     (p_header_user+Selected_pos)->stardate =Edit_User.m_start_time.GetDay();
     (p_header_user+Selected_pos)->starmonth=Edit_User.m_start_time.GetMonth();
     (p_header_user+Selected_pos)->staryear=Edit_User.m_start_time.GetYear();

     CTimeSpan betweentime;
     betweentime=Edit_User.m_stoptime-Edit_User.m_start_time;
     (p_header_user+Selected_pos)->validdate=betweentime.GetDays();
     memcpy((p_header_user+Selected_pos)->user_e_mail,Edit_User.m_email,Edit_User.m_email.GetLength()<31?Edit_User.m_email.GetLength():31);
     Edit_User.m_email="";
     memcpy((p_header_user+Selected_pos)->user_name,Edit_User.m_username,Edit_User.m_username.GetLength()<15?Edit_User.m_username.GetLength():15);
     Edit_User.m_username="";
     memcpy((p_header_user+Selected_pos)->user_password,Edit_User.m_password,Edit_User.m_password.GetLength()<15?Edit_User.m_password.GetLength():15);
     Edit_User.m_password="";
     memcpy((p_header_user+Selected_pos)->user_telephone,Edit_User.m_telephone,Edit_User.m_telephone.GetLength()<15?Edit_User.m_telephone.GetLength():15);
     Edit_User.m_telephone="";
     memcpy((p_header_user+Selected_pos)->sn,Edit_User.m_adantor,Edit_User.m_adantor.GetLength()<7?Edit_User.m_adantor.GetLength():7);
     (p_header_user+Selected_pos)->status=Edit_User.m_status_combo;  ////////////////////////////////////////////////////
    ///add the 
    ////////////////////////////////////////////////////////////
    }

    }
      *pResult = 0;
    }这里的 AddUser 是对话框类,有 CString m_username;
    CString m_password;
    CTime m_start_time;
    CTime m_stoptime;
    CString m_email;
    int m_status_combo;
    CString m_adantor;
    CString m_telephone;
    这些都是用CLASSWIZARD生成的控件相关变量..
      

  2.   

    m_userinfo_tree就是在主对话框中的CTreeCtrl控件,这个函数就是该控件的双击响应函数.谢谢楼上的回帖....在========.................
      

  3.   

    如果可以把程序发给我帮你看看[email protected]
      

  4.   

    晕了,不过很久没用VC了,帮你顶一下吧
    ------ 以下是签名 ------
    SoftDN.com, 提供免费的项目管理平台:SVN仓库、需求管理、BUG跟踪、任务管理、在线论坛、网站空间、项目存储及完整的备份等。欢迎网友光临建立项目,开创自己的梦想。
    地址:http://www.softdn.com   http://www.softdn.cn
      

  5.   

    flight_lcf() 我已经发给你了源代码  你可以用VC6.0打开 可以用DEBUG功能 查看
     当你双击User2这项是既弹出对话框 或者 就会报错
      

  6.   

    如果还没有报错的话 那你改变S stop time 那肯定报错了
    再次谢谢
      

  7.   

    问题出在629行,得到的那些year,month等不正确
    你单步调试,出现错误时候,你用CALL STACK看看错误位置就知道了
      

  8.   

    屏蔽这些还是有问题 问题一样.....??
    还是没有解决  我看到的是 __sbh_alloc_block(int 88) line 622 + 12 bytes
    ??
      

  9.   

    但是 就是在AddUser.h的CTime也要改吗? 没改的话还是有时会出同样的错 
    ???....
      

  10.   

    恩,因为CTime 中的Year的范围是1970~3000,而你的数据不符合,所以导致错误发生
      

  11.   

    我把所有的CTIME该为了COleDateTime 而且用到的CTimeSpan也改为了COleDateTimeSpan 
    但是在DEBUG时,弹出对话框后不做任何修改都出错了.????