今天在计算机资源管理项目中出现了两个不大不小的问题。
其一是项目中发现以下代码没有执行.
/**************************************************/
函数: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);
}
通过测试!