今天在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);
}
通过测试!
其一是项目中发现以下代码没有执行.
/**************************************************/
函数: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);
}
通过测试!
相关文章推荐
- 关于今天做项目时遇到的问题 以及解决办法
- 关于今天小班上课,两个问题。
- 今天工作中遇到的两个问题。
- 遇到问题----shrio------shiro登录,多个项目session被覆盖问题---两个web项目会导致shiro的session污染
- 两个项目发布在tomcat下引起log4j冲突问题解决
- 关于用-jar运行springboot项目遇到的两个问题
- 项目适配iOS9遇到的一些问题及解决办法(更新两个小问题)
- 项目适配iOS9遇到的一些问题及解决办法(更新两个小问题)
- 【学习随笔】今日项目代码遇到的两个问题
- Android studio导入另外一个项目作为Library后出现两个启动项目等各类问题
- 今天解决了两个ORACLE的问题
- tomcat中同时部署两个项目的问题
- Maven项目打包遇到的两个问题
- VS2010 VC++ 项目添加引用 出现 Internal CPS Error问题原因及解决办法
- 今天在lamp群里遇到的两个问题及解决方法
- 同一个项目中两个jqery版本共存的问题
- 2013-5-25 1. “已有打开的与此命令相关联的 DataReader,必须首先将它关闭。"问题. 上周在项目开发中,遇到这样的一个问题,在前台展示页,两个WebPart调用后台的AP
- 今天遇到两个问题:Can't connect to MySQL server 与 Access denied for user !
- VC 最爱问的问题:你这个创业项目,如果腾讯跟进了,而且几乎是产品上完全复制,你会怎么办?
- 昨天和今天碰到了两个问题,折腾了半天,总算解决了