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


Автор: keisik 27.3.2002, 20:09
Код

static int CALLBACK
CompProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort){

  // lParamSort contains a pointer to the list view control.
  // The lParam of an item is just its index.
ASSERT(nColumn>=0);
CListCtrl* pListCtrl = (CListCtrl*) lParamSort;
CString strItem1 = pListCtrl->GetItemText(lParam1, nColumn);
CString strItem2 = pListCtrl->GetItemText(lParam2, nColumn);
return bAsc?strcmp(strItem1, strItem2):strcmp(strItem2,strItem1);
}

void CWRegimeDlg::OnColumnclickApps(NMHDR* pNMHDR, LRESULT* pResult){

NM_LISTVIEW* pNMLV = (NM_LISTVIEW*)pNMHDR;
nColumn==pNMLV->iSubItem?bAsc=!bAsc:nColumn=pNMLV->iSubItem;
m_LCApps.SortItems(CompProc,(LPARAM) &m_LCApps);
*pResult = 0;
}


Вот так, содрав буквально поностью из MSDN-а функцию CompProc, я пытаюсь пересортировывать данные в ЛистКонтроле по клику на заголовок. Работать не хочет. Почему? Вернее, функция сравнения вызывается, но каждый раз lParam1 и lParam2 - нули. Чего ещё надо? Или как это сделать (если всё неправильно)?

Автор: keisik 27.3.2002, 21:06
Разобрался...

Автор: Lion 28.3.2002, 06:27
А что было??

Автор: keisik 28.3.2002, 10:40
http://www.firststeps.ru/mfc/sample/29.html

Автор: Lion 28.3.2002, 13:27
Большой тханкс   :)  :)  :)

Автор: Rickert 4.10.2006, 05:31
У меня сейчас тажа проблема. Ссылка битая на фёрстСтепс.дот.ру Что неправильно-то было в коде? Я вроде, при добавлении в таблицу везде проставляю этот lParam = i++; Где i - переменная типа int. smile 

Автор: Earnest 4.10.2006, 06:45
Неправильно то, что в функцию передаются user-data, связанные с итемами, а они не были проставлены (видимо).
Может, ты флаг LVIF_PARAM забываешь при вставке итемов?

Автор: Rickert 6.10.2006, 03:15
Цитата

Может, ты флаг LVIF_PARAM забываешь при вставке итемов?

Имеено его я и забывал. Но теперь проблема такая. Вот как я добавляю item'ы с subitem'ами:
Код

...
    while(...)
    {
        _item.mask = LVIF_TEXT | LVIF_PARAM;
        _item.pszText = "Be good!"
        _item.iSubItem = 0;
        _item.lParam = i++;
        m_Table.InsertItem(&_item);

        _item.pszText = "Surf!"
        _item.iSubItem++;
        m_Table.SetItem(&_item);

        _item.pszText = "Аминь!"
        _item.iSubItem++;
        m_Table.SetItem(&_item);

        _item.pszText = "eNOT";
        _item.iSubItem++;
        m_Table.SetItem(&_item);
    }
...

В результате чего, добавляется только первая колонка с фразой "Be good", а остальные просто пустые. Это появляется после установки флага LVIF_PARAM. Why? Не увеличивать же lParam при каждом subItem'е? Всё равно пробовал втупую - результата NULL.

Автор: Rickert 6.10.2006, 06:15
Теперь всё работает. Надо было по-другому элементы добавлять:
Код

...
        _item.mask = LVIF_TEXT | LVIF_PARAM;
        _item.pszText = "ддд";
        _item.iSubItem = 0;
        _item.lParam = i++;
        m_Table.InsertItem(&_item);

        m_Table.SetItemText(_item.iItem, ++(_item.iSubItem), "ццц");

        m_Table.SetItemText(_item.iItem, ++(_item.iSubItem), "ййй");

        m_Table.SetItemText(_item.iItem, ++(_item.iSubItem), "йцу");
...

Автор: Earnest 6.10.2006, 06:55
Можно оставить и первый вариант, но перед первым SetItem переустанавливать маску: item.mask = LVIF_TEXT.
Кроме того, все эти функции возвращают значение: SetItem -> BOOL, InsertItem -> номер элемента. Так что если что-то не получается, начинать нужно с того, что смотреть на возвращаемые значения.

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