求助,关于LIST 控件的奇怪问题

侠雨飞飞 2003-05-15 05:46:19
我想在鼠标单击List里的列表项时,得到其中的数据
代码如下:...
int nSel=m_Clist.GetNextItem(-1,LVIS_SELECTED); //LVNI_FOCUSED 也一样效果

if(nSel!=-1)
{
DWORD dw;
dw=m_Clist.GetItemData(nSel);
listItem=(CListItem*)dw; //我自己的一个类用来保存数据的

pchIp=listItem->cIp;
m_CstaticIp.SetWindowText((LPCTSTR)pchIp);
AfxMessageBox(str+" "+(LPCTSTR)pchIp);
}
问题是,随着鼠标点击,nSel的值是变的,但我取出的内容却不全对,有时不变
这是怎么回事?
谢谢
...全文
29 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
kingtsui 2003-05-17
  • 打赏
  • 举报
回复
不用客气
感觉你的经验不是很多,特别是对new,指针之类的操作很不注意,对内存泄漏之类的似乎从没考虑过,多看看这方面的书,多练练
装个BoundsChecker,内存泄漏一调试就能看到了
侠雨飞飞 2003-05-16
  • 打赏
  • 举报
回复
刚才我试了一下,lvi.pszText 取出来的是正确的,那么,看来的确是我在赋值的时候出问题了
:)
即问题出在
CListItem* listItem=new CListItem;

char* pChar=new char[20]

listItem->pSocket=&sAsClient;
listItem->threadId=hd;
listItem->cIp=pChar;//这个值不对
lvi.lParam = (long)listItem; //我用来保存新的SOCKET地址
coolstar14 2003-05-16
  • 打赏
  • 举报
回复
SetItemData你是在什么地方怎么用的啊?
lvi.lParam = (long)listItem; //我用来保存新的SOCKET地址
DWORD dw;
dw=m_Clist.GetItemData(nSel);
listItem=(CListItem*)dw;
有有没有跟踪进来看一下,dw的值是不是你原来存的值啊,它们真的没变而nSel变了吗?如果真是这样,你就有必要怀疑存的内容是一样的了!
feiniaoliang 2003-05-16
  • 打赏
  • 举报
回复
那你就没有SetItemData嘛!!

int index = ListView_InsertItem(::GetDlgItem(AfxGetApp()->GetMainWnd()->GetSafeHwnd(),IDC_LIST1), &lvi);

if(index != -1)
{
(CListCtrl*)::GetDlgItem(AfxGetApp()->GetMainWnd()->GetSafeHwnd(),IDC_LIST1)->SetItemData(index,(DWORD)listItem);
}

侠雨飞飞 2003-05-16
  • 打赏
  • 举报
回复
谢谢二位

插列表项的代码如下:
CListItem* listItem=new CListItem;

char* pChar=new char[20]
strcpy(pChar,pstrIp); //pstrIp是从编辑框中取得的IP地址,没有错
LVITEM lvi;
lvi.iItem = 0;
lvi.iSubItem = 0;
lvi.mask = LVIF_TEXT | LVIF_PARAM|LVIF_IMAGE ;
lvi.pszText = pChar;//PTSTR_TEXTCALLBACK;
lvi.iImage=1;
listItem->pSocket=&sAsClient;
listItem->threadId=hd;
listItem->cIp=pChar;
lvi.lParam = (long)listItem; //我用来保存新的SOCKET地址


ListView_InsertItem(::GetDlgItem(AfxGetApp()->GetMainWnd()->GetSafeHwnd(),IDC_LIST1), &lvi);
kingtsui 2003-05-16
  • 打赏
  • 举报
回复
to lizmei001(暗黑) :
是可以这样转换的,如果SetItemData的时候直接设成一个CListItem的指针就可以了。
kingtsui 2003-05-16
  • 打赏
  • 举报
回复
把这两句
CListItem* listItem=new CListItem;
char* pchIp=new char[20];
改成
CListItem* listItem=努;
CString str;
char* pchIp=NULL;
要不然会内存泄漏。
还有确定一下你SetItemData的时候有没有符对值,把那一段代码也贴出来看看。
lizmei001 2003-05-16
  • 打赏
  • 举报
回复
DWORD dw;
dw=m_Clist.GetItemData(nSel);
listItem=(CListItem*)dw;

你的LISTITEM = (CLISTITEM *)DW;是怎么转换的???还没有见过这种转换,就是你定义在一个数据或地址上也应该是LISTIEM = (CLISTITEM *)(PBASE +DW);
你这种转换,晕
侠雨飞飞 2003-05-16
  • 打赏
  • 举报
回复
to cxjlw(老为) 跟cIp没有关系的

to feiniaoliang(飞鸟良) 效果还是一样:(
是每次都重新new一个,问题怎么可能出在这??
我贴出全部代码:
void CDaggerDlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult)
{
CListItem* listItem=new CListItem;
CString str;
char* pchIp=new char[20];
int nSel=m_Clist.GetNextItem(-1,LVIS_SELECTED);
str.Format("%d",nSel);
if(nSel!=-1)
{
DWORD dw;
dw=m_Clist.GetItemData(nSel);
listItem=(CListItem*)dw;

pSockCur=listItem->pSocket;//当前的

pchIp=listItem->cIp;
AfxMessageBox(str+" "+(LPCTSTR)pchIp);


}

*pResult = 0;
}

如果我列表项有三项,
它们的编号,内容对分别是
2 28
0 219
1 219

结果除了每次点击时,编号在变化外,内容始终都是219,就是我的cIp的值

侠雨飞飞 2003-05-16
  • 打赏
  • 举报
回复
呵呵,谢谢大家了,我找到问题所在了
我有一个地方在判断的时候,把列表框中数据地址赋值给了CListItem类对象的指针
后面又使用这个指针来保存新的列表项,所以会出现重复的现象

特别感谢kingtsui(老农民)
偶受益非浅

谢谢诸位了
feiniaoliang 2003-05-15
  • 打赏
  • 举报
回复
还有你的那个listItem是不是每次给重新new一个!可能问题出在这!!呵呵~~
feiniaoliang 2003-05-15
  • 打赏
  • 举报
回复
int nSel=m_Clist.GetNextItem(-1,LVIS_SELECTED);
改成:
POSITION pos = m_Clist.GetFirstSelectedItemPosition();
int nSel = m_Clist.GetNextSelectedItem( pos );
试一下!!^_^
cxjlw 2003-05-15
  • 打赏
  • 举报
回复
cIp是什么东西?

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧