Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нужна помощь в функции сравнения, Нужна помощь в функции сравнения 
:(
    Опции темы
Nikonik
Дата 24.12.2007, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 21.3.2007

Репутация: нет
Всего: нет



Подскажите, что я делаю не так.
Моя программа создает 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

Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  lvtest.zip 2,37 Kb
PM MAIL   Вверх
Stranger2048
Дата 24.12.2007, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 21.12.2007

Репутация: нет
Всего: нет



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

PM MAIL   Вверх
Nikonik
Дата 24.12.2007, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 21.3.2007

Репутация: нет
Всего: нет



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

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

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

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

MessageBox(NULL, szBuff1, szBuff2, 0);


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

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


Это сообщение отредактировал(а) Nikonik - 24.12.2007, 18:17
PM MAIL   Вверх
Earnest
Дата 24.12.2007, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



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


--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0432 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.