您的位置:首页 > 其它

今天在VC项目中的两个问题

2005-09-15 15:27 295 查看
    今天在计算机资源管理项目中出现了两个不大不小的问题。
   其一是项目中发现以下代码没有执行.
/**************************************************/
函数:FindResource
用途:根据计算机编号查找该计算机对应的详细信息
参数:CString Number  //计算机编号
返回:COMPUTER_INFO* //计算机信息
/**************************************************/
COMPUTER_INFO * CComputerResourceDlg::FindResource( const CString number) const
{
 try {
  COMPUTER_INFO_LIST::const_iterator I;
  for( I = m_Computer.begin() ; I != m_Computer.end() ; I++ ) {
   if( strcmp(0==number, I->Number) )
    return (COMPUTER_INFO*)(&(*I));
  }
 }catch(...) {
 }
 return NULL;
 
}
整个程序编译通过。
在debug的时候,追踪到if( strcmp(number, I->Number) ) 这句表达式时,发现I-〉Number居然报出I->Number   CXX0063: Error: overloaded operator -> not supported
然后查看I,发现I不是NULL。
但是我没有对“-〉”进行过任何重载,也没有修改过list。
其二是List Control中删除多行选中的数据项的问题。
原来使用的方法:
/* POSITION pos = m_List.GetFirstSelectedItemPosition();
 if (pos == NULL)
  return;
 else
 {
  while (pos)
  {
   int nItem = m_List.GetNextSelectedItem(pos);
   //临时变量
   CString Number;
   //得到要修改的number
   Number = m_List.GetItemText(nItem,1);
   COMPUTER_INFO* c;
   c=pMainDlg->FindResource(Number);
   if(c != NULL)
    c->Remove = TRUE;
  // m_List.DeleteItem(m_List.GetFirstSelectedItem(), FALSE,
   //   ItemdataProc, (LPARAM)this);
  // int nItemSelected=m_ListCtrl.GetSelectedCount();//所选表项数
 }*/
 }*/但是发现在多于3个以上的数据项同时删除时,不能删除完全,需要多次点击删除按钮。
开始以为是list control刷新的问题,分别在函数头尾加入m_List.LockWindowUpdate();和 UpdateData(false);
 m_List.UnlockWindowUpdate();
不过错误依然,后来查阅资料才发现,listcontrol删除行,如果从选中的第一行开始删除,以下的数据项的行号会发生改变,导致错误发生。所以,应该采取从后面删除list control中选中行得方法。改进方法如下:
 
int i,iState;
 int nItemSelected=m_List.GetSelectedCount();//所选表项数
 int nItemCount=m_List.GetItemCount();//表项总数
 if(nItemSelected<1) return;
 for(i=nItemCount-1;i>=0;i--){
  //临时变量
  CString Number;
  //得到要修改的number
  Number = m_List.GetItemText(nItemCount,1);
  COMPUTER_INFO* c;
  c=pMainDlg->FindResource(Number);
  if(c != NULL)
   c->Remove = TRUE;
  iState=m_List.GetItemState(i,LVIS_SELECTED);
  if(iState!=0)
   m_List.DeleteItem(i, FALSE,
      ItemdataProc, (LPARAM)this);
 }
int i,iState;
 int nItemSelected=m_List.GetSelectedCount();//所选表项数
 int nItemCount=m_List.GetItemCount();//表项总数
 if(nItemSelected<1) return;
 for(i=nItemCount-1;i>=0;i--){
  //临时变量
  CString Number;
  //得到要修改的number
  Number = m_List.GetItemText(nItemCount,1);
  COMPUTER_INFO* c;
  c=pMainDlg->FindResource(Number);
  if(c != NULL)
   c->Remove = TRUE;
  iState=m_List.GetItemState(i,LVIS_SELECTED);
  if(iState!=0)
   m_List.DeleteItem(i, FALSE,
      ItemdataProc, (LPARAM)this);
 }

int i,iState;
 int nItemSelected=m_List.GetSelectedCount();//所选表项数
 int nItemCount=m_List.GetItemCount();//表项总数
 if(nItemSelected<1) return;
 for(i=nItemCount-1;i>=0;i--){
  //临时变量
  CString Number;
  //得到要修改的number
  Number = m_List.GetItemText(i,1);
  COMPUTER_INFO* c;
  c=pMainDlg->FindResource(Number);
  if(c != NULL)
   c->Remove = TRUE;
  iState=m_List.GetItemState(i,LVIS_SELECTED);
  if(iState!=0)
   m_List.DeleteItem(i, FALSE,
      ItemdataProc, (LPARAM)this);
 }
 

通过测试!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  null list iterator c 测试
相关文章推荐