我在显示树节点前调用DeleteAllItems清理以前的树节点,可是运行中出错了。第一次显示树节点时不出错,再点击其他窗口,然后再显示树节点时出错啦。怎么解决啊?m_tree.DeleteAllItems();//m_tree是CTREELISTCTRL类型的。我想是只是清除了CTREELISTCTRL的节点,还没有对CLISTCTRL进行处理的原因。可没有解决的办法。如果不调用m_tree.DeleteAllItems();不会运行中出错,只不过会多显示很多节点。哪位高手帮忙啊。不知我说明白没有。
。A   硬盘 (空记录)      。
。B   硬盘  (有记录)     。
........................
项目      信息
硬盘
  +C      10G
  +D      20G
  +E      30G就是点击B时显示B硬盘信息,再点击A(显示空白,没有记录),再点击B时就出错啦。

解决方案 »

  1.   


    运行时出的错。m_wndOutput.Clear();
    m_wndOutput.Show(ComputerID);我是每次在显示之前调用Clear();清理。m_tree.DeleteAllItems();在Clear中。然后在显示Show()我估计是内存没有清理干净。可又不知道具体是哪儿啊?有没有这方面经验的兄弟啊?
      

  2.   

    你删除的时候是不是其它的地方还在使用Item中的数据?
      

  3.   


    如果用m_wndHardinfo.DeleteAllItems();替换m_tree.DeleteAllItems();就不会出现运行错误(m_wndHardinfo是CLISTCTRL控件,m_tree就在此控件中),缺点是显示不对,比如A硬盘有记录,B硬盘空记录,点击完A后再点击B,B显示的和A一样,有时会出现A或b显示比预定信息多的信息。
      

  4.   

    "如果不调用m_tree.DeleteAllItems();不会运行中出错,只不过会多显示很多节点。"
    "只不过会多显示很多节点"表示你又插入很多节点,可能是tree展开时重复了,tree展开时应该检查是否已经展开过.
    void CLeftView::OnItemexpanding(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
    // TODO: Add your control notification handler code here
    CMainFrame   *pMain=(CMainFrame*)AfxGetMainWnd();
    // get LeftTree
    CTreeCtrl&  LeftTree=this->GetTreeCtrl(); TVITEM *pNew=NULL;
    char   tvinamenew[MAX_PATH];
    pNew=&(pNMTreeView->itemNew);
    if(pNew && pNew->hItem)
    {
    UINT ret=LeftTree.GetItemState(pNew->hItem,TVIS_EXPANDEDONCE);
    if(ret & TVIS_EXPANDEDONCE
    {
    return;// already
    }
    this->GetTreePath(pNew,tvinamenew);
    if(stricmp(tvinamenew,"MY COMPUTER")==0 ||
       stricmp(tvinamenew,"Control 802D")==0 )
    {
    return;
    }
    // 
    char DirName[MAX_PATH];
    char DriveName[MAX_PATH]="";
    strcpy(DirName,tvinamenew);
    //
    BOOL MyPC;
    MyPC=pMain->CutDriveName(DirName);
    BOOL dir_exist=FALSE;
    CWaitCursor wait;// display wait cursor
    if(!MyPC) 
    {// contain "Control 802D"
    dir_exist=pMain->Tree802Files(DirName,pNew->hItem);
    if(dir_exist==FALSE)
    { // this dir not 
    TVITEM tvi;
        tvi.hItem=pNew->hItem;
    tvi.mask=TVIF_HANDLE|TVIF_STATE|TVIF_CHILDREN;
    tvi.state=0;// reset :
    tvi.stateMask=TVIS_EXPANDEDONCE|TVIS_EXPANDED; 
    tvi.cChildren=0;
    LeftTree.SetItem(&tvi);
    }
    }
    else      
    {// "My Computer"
    pMain->TreeFiles(DirName,pNew->hItem);
    }
    } *pResult = 0;
    }