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


Автор: Nikonik 24.12.2007, 12:50
Подскажите, что я делаю не так.
Моя программа создает SysListView32 многоколонный, и я хочу его отсортировать.
Нужно сказать для меня вообще стало удивлением, что сортировка не заложена в этот элемент фундаментально.
Ну ладно - полез в интернет, разобрался как идёт перехват клика по колонке, как вызывается функция сортировки, собственно осталась лишь одна проблема - не сортирует.
В Google::Codesearch я нашел наверное вариантов 30 функции.. где-то напрямую обращаются к lParam, где-то их приводят.. попробовал наверное все- всё бестолку.

Вот так я создаю SysListView32:
Код

        case WM_CREATE:
             
             iccex.dwSize = sizeof (INITCOMMONCONTROLSEX);
             iccex.dwICC = ICC_LISTVIEW_CLASSES;
             if (!InitCommonControlsEx (&iccex)) PostQuitMessage (0);
                
             hList = CreateWindowEx(0, WC_LISTVIEW, "ListV",
                 WS_CHILDWINDOW | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP | WS_CLIPSIBLINGS | 
                 LVS_REPORT | LVS_SINGLESEL  ,
                 0, 0, 450, 300, hwnd, NULL, ((LPCREATESTRUCT) lParam) -> hInstance, NULL);
            
             SendMessage(hList, LVM_SETEXTENDEDLISTVIEWSTYLE, 0,
             WS_EX_LEFT | WS_EX_LTRREADING | WS_EX_RIGHTSCROLLBAR | WS_EX_CLIENTEDGE | 
             LVS_EX_FULLROWSELECT |  LVS_EX_HEADERDRAGDROP |LVS_EX_GRIDLINES | LVS_EX_ONECLICKACTIVATE);
             
             lColumn.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_FMT;
             lColumn.cx = 0x8F;
             lColumn.fmt = LVCFMT_LEFT;
             lColumn.cchTextMax = 16;
             
             lColumn.pszText = "Атомарный номер";
             ListView_InsertColumn(hList,0,&lColumn);
             lColumn.pszText = "Элемент";
             ListView_InsertColumn(hList,1,&lColumn);   
             

             
             memset( &lvi, 0, sizeof( LV_ITEM ));
             lvi.mask = LVIF_TEXT;
             lvi.iItem = j++;
             ListView_InsertItem ( hList, &lvi ); 
             ListView_SetItemText( hList, lvi.iItem, 0, "1");
             ListView_SetItemText( hList, lvi.iItem, 1, "Водород");
             
             lvi.iItem = j++;
             ListView_InsertItem ( hList, &lvi ); 
             ListView_SetItemText( hList, lvi.iItem, 0, "79");
             ListView_SetItemText( hList, lvi.iItem, 1, "Аурум");
             
             lvi.iItem = j++;
             ListView_InsertItem ( hList, &lvi ); 
             ListView_SetItemText( hList, lvi.iItem, 0, "23");
             ListView_SetItemText( hList, lvi.iItem, 1, "Ванадий");


Так перехватываю клик (судя по отладке номер колонки передаётся верно)
Код

        case WM_NOTIFY:
             switch (((LPNMHDR)lParam)->code)
             {
              case LVN_COLUMNCLICK:
                   ListView_SortItems (hList, CompareFunc, ((LPNMLISTVIEW)lParam)->iSubItem);
                   break;
             }
             break;


А вот функция сравнения (одна из последних вариаций):
Код

int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2,  LPARAM lParamSort)
{
    INT iResult = 0;
    LVITEM lvi;
    char szBuff0[256],szBuff1[256],szBuff2[256];
    lvi.mask = LVIF_TEXT;
    lvi.cchTextMax = 256;
    lvi.pszText = &szBuff0;
    lvi.iSubItem = lParamSort;
    SendMessage(hList,LVM_GETITEMTEXT, lParam1, &lvi);
    strcpy(szBuff1, lvi.pszText);
    SendMessage(hList,LVM_GETITEMTEXT, lParam2, &lvi);
    strcpy(szBuff2, lvi.pszText);
    /*return rand()%2; //проверка - а работает ли вообще взаимодействие */
    return strcmp(szBuff1,szBuff2);
}


И не сортирует :(


Пользуясь случаем задам второй вопрос - у кого есть пример прицепления всплывающих подсказок в SysListView32? Google по запросу ListView_SetToolTips выдаёт аж 0 результатов  на русском языке, да и на английском довольно бедно. В MSDN едва ли десяток строчек. Не могу понять даже само ядро - где задается массив строк для подсказок, или массив подсказок для строк... smile

Автор: Stranger2048 24.12.2007, 17:24
strcmp не сортировать не может...  Ты для начала объясни почему ты пишешь lvi.pszText = &szBuff0, вместо хотя бы lvi.pszText = szBuff0? Массив он сам по себе адрес, зачем ещё адрес от адреса брать?.. А по хорошему выдели память: lvi.pszText = (LPTSTR)calloc(Length, sizeof(_TCHAR)), а потом её кикнешь. 

Автор: Nikonik 24.12.2007, 18:07
Потому что так делают в примере ListView из /masm32/examples - последний источник (из большого множества) по которому я пытался сделать функцию.

strcmp как бы сортировать и не должен
тут проблема в получении значений - я по отладке не могу по lParam1 и lParam2 правильно добыть две строки для сравнения

попробовал динамическое выделение памяти - ну то же самое получается

если я добавляю
Код

MessageBox(NULL, szBuff1, szBuff2, 0);


после получения  значений - то получаю что постоянно сравниваются первые строки (сами с собой)

P.S. Модераторам - sorry, за клон темы.. его грохнуть надо: долго не мог отправить сообщение.. в итоге походу два ушло.

Автор: Earnest 24.12.2007, 18:27
Действительно, заглянул бы отладчиком в функцию, посмотрел переменные, глядишь и сообразил бы, что не так.

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