Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > POSITION при использовании CListCtrl


Автор: Nuzur 13.10.2006, 10:07
Вот я получил
Код

POSITION pos = m_ListCtrl.GetFirstSelectedItemPosition();

и мне нужно получить текстовое содержимое по данной позиции, и вроде все ясно кроме того что я никак не могу найти описание структуры POSITION.

Для того, что бы потом еее использовать
Код

LVITEM * tItem = m_ListCtrl.GetItemData(pos->?);

Автор: _hunter 13.10.2006, 10:22
а кликнуть по этой POSITION правой кнопкой и перейти к declaration?
просто приводи pos к int' у:
m_ListCtrl.GetItemData((int)pos - 1);

Автор: Kostt 13.10.2006, 10:24
Не понял, что же ты хочешь получить - текстовое содержимое элемента или 
привязанные к нему данные.
Попробуй примерно так:
Код

POSITION pos = m_ListCtrl.GetFirstSelectedItemPosition();

while(pos)
{
        int nItem = m_ListCtrl.GetNextSelectedItem(pos);
        LVITEM * tItem = m_ListCtrl.GetItemData(nItem);//Получение данных
        CString strItemText = m_ListCtrl.GetItemText(nItem);//Получение текста
}

Автор: Nuzur 13.10.2006, 11:55
Kostt, 
Код

POSITION pos = m_ListCtrl.GetFirstSelectedItemPosition();
CString strDate;
while(pos)
{
int nItem = m_ListCtrl.GetNextSelectedItem(pos);
LVITEM * tItem = m_ListCtrl.GetItemData(nItem);//Получение данных
strDate = m_ListCtrl.GetItemText(nItem);//Получение текста
}

Код

: error C2440: 'initializing' : cannot convert from 'unsigned long' to 'struct tagLVITEMA *'
        Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
: error C2661: 'GetItemText' : no overloaded function takes 1 parameters

так?

_hunter, 
Код

                    LVITEM * tItem = m_ListCtrl.GetItemData((int)pos - 1);

Код

: error C2440: 'initializing' : cannot convert from 'unsigned long' to 'struct tagLVITEMA *'
        Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast


По декларации ходил и вот что получил:
Код

struct __POSITION { };
typedef __POSITION* POSITION;

Автор: _hunter 13.10.2006, 12:07
так это не в pos' е проблема (для проверки скомпиль такой:
m_ListCtrl.GetItemData((int)pos - 1);
код)
а в попытке неявного приведения DWORD_PTR к LVITEM*

если уверен в том, что ты делае -- приводи тип явно:
LVITEM * tItem = (LVITEM *)(m_ListCtrl.GetItemData((int)pos - 1));

Автор: Kostt 13.10.2006, 12:56
strDate = m_ListCtrl.GetItemText(nItem,0);

Вот такое попробуй.

Автор: Nuzur 13.10.2006, 15:43
_hunter, 
Код

LVITEM * tItem = (LVITEM *)(m_ListCtrl.GetItemData((int)pos - 1));
CString str = tItem->pszText;


в результате tItem = 0 и вылет на попытке присвоить str
 smile 

Автор: _hunter 13.10.2006, 15:57
значит ты туда ничего не записал.

Автор: Nuzur 13.10.2006, 16:13
_hunter, поверьте наслово записывал и выбрал на екране smile

Код

                    LVITEM lvi;
                    ::ZeroMemory(&lvi, sizeof(LVITEM));
                    lvi.mask = LVIF_TEXT;
                    lvi.pszText = (char *) strValue.operator LPCTSTR();
                    m_ListCtrl.InsertItem(&lvi);


на екране оно ж видно smile
И заглушка стоит
Код


                POSITION pos = m_ListCtrl.GetFirstSelectedItemPosition();

                if(pos == NULL)
                {
                    AfxMessageBox("...");
                    return;
                }

Автор: _hunter 13.10.2006, 16:35
не совсем понял при чем тут выбор на экране (и как это вообще на экране можно увидеть)
так же непонятно при чем тут этот код...

Автор: Nuzur 13.10.2006, 17:06
_hunter, ладно, давайте по порядку куда я ничего не записал?

Автор: _hunter 13.10.2006, 17:32
в Item' s data...

Автор: Earnest 13.10.2006, 19:36
GetItemData - это lParam структуры LVITEM, не более. Нельзя ее преобразовывать к LVITEM*. Для того, чтобы получить доступ к данным итема, есть куча функций GetXXX, например, GetItemText (nItem). 

Автор: icqhool 22.9.2009, 22:43
можно приткнуться в эту тему? вот мой код:

Код

POSITION pos = m_ctlList.GetFirstSelectedItemPosition();
if (pos == NULL)
m_ctlList.AddItem( _T("nItem"),_T("no item selected"));
else
{
while (pos)
{
        int i=0;
        //nItem=0;
nItem[i] = m_ctlList.GetNextSelectedItem(pos);
test.Format("%d",nItem[i]);
m_ctlList.AddItem( _T("nItem"),_T(test));



 while(!eof(fh))
  {
    _read(fh,&mstruct,sizeof mstruct);
   
    if(nItem[i]==2)
    {
        out<<ms.k<<'\n';
    }
         if(nItem[i]==3)
    {
        out1<<ms.m<<'\n';
    }
  }
i++;
}}  


при выделении 2-го и 3-го элемента записывает только второй

если выделить нулевой или первый элемент и второй то не запишет ничего => почему-то запоминается номер только первого выделенного элемента а вторых какбы нет...
 что я делаю нетак?

Автор: Earnest 23.9.2009, 13:36
icqhool, не надо реанимировать усопшие темы. Открой свою, так скорее дождешься ответов.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)