我想在鼠标单击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的值是变的,但我取出的内容却不全对,有时不变
这是怎么回事?
谢谢

解决方案 »

  1.   

    int nSel=m_Clist.GetNextItem(-1,LVIS_SELECTED); 
    改成:
            POSITION pos = m_Clist.GetFirstSelectedItemPosition();
            int nSel = m_Clist.GetNextSelectedItem( pos );
    试一下!!^_^
      

  2.   

    还有你的那个listItem是不是每次给重新new一个!可能问题出在这!!呵呵~~
      

  3.   

    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的值
      

  4.   

    DWORD dw;
    dw=m_Clist.GetItemData(nSel);
    listItem=(CListItem*)dw;你的LISTITEM = (CLISTITEM *)DW;是怎么转换的???还没有见过这种转换,就是你定义在一个数据或地址上也应该是LISTIEM = (CLISTITEM *)(PBASE +DW);
    你这种转换,晕
      

  5.   

    把这两句
    CListItem* listItem=new CListItem;
    char* pchIp=new char[20];
    改成
    CListItem* listItem=努;
    CString str;
    char* pchIp=NULL;
    要不然会内存泄漏。
    还有确定一下你SetItemData的时候有没有符对值,把那一段代码也贴出来看看。
      

  6.   

    to lizmei001(暗黑) :
    是可以这样转换的,如果SetItemData的时候直接设成一个CListItem的指针就可以了。
      

  7.   

    谢谢二位插列表项的代码如下:
             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);
      

  8.   

    那你就没有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);
    }
      

  9.   

    SetItemData你是在什么地方怎么用的啊?
    lvi.lParam = (long)listItem; //我用来保存新的SOCKET地址
                       DWORD dw;
    dw=m_Clist.GetItemData(nSel);
    listItem=(CListItem*)dw;
    有有没有跟踪进来看一下,dw的值是不是你原来存的值啊,它们真的没变而nSel变了吗?如果真是这样,你就有必要怀疑存的内容是一样的了!
      

  10.   

    刚才我试了一下,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地址
      

  11.   

    呵呵,谢谢大家了,我找到问题所在了
    我有一个地方在判断的时候,把列表框中数据地址赋值给了CListItem类对象的指针
    后面又使用这个指针来保存新的列表项,所以会出现重复的现象特别感谢kingtsui(老农民)
    偶受益非浅谢谢诸位了
      

  12.   

    不用客气
    感觉你的经验不是很多,特别是对new,指针之类的操作很不注意,对内存泄漏之类的似乎从没考虑过,多看看这方面的书,多练练
    装个BoundsChecker,内存泄漏一调试就能看到了