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

    今天在计算机资源管理项目中出现了两个不大不小的问题。

   其一是项目中发现以下代码没有执行.

/**************************************************/
函数: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);

 }

 

通过测试!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值