Показать сообщение отдельно
  #5  
Старый 23.11.2014, 19:14
Аватар для Stalker2-42
Stalker2-42 Stalker2-42 вне форума
Новичок
 
Регистрация: 28.09.2013
Сообщения: 94
Версия Delphi: 2010
Репутация: 10
По умолчанию

Попытался переделать

Код:
if(nmhdr->code == LVN_COLUMNCLICK)
{
    NM_LISTVIEW *pnm;
    pnm = (NM_LISTVIEW *) lParam; // заполняем структуру NM_LISTVIEW
    
    // сортируем
    ListView_SortItems(pnm->hdr.hwndFrom, // идентификатор окна List View
             CompareListViewProc, // указатель на функцию сравнения
             (LPARAM) (pnm->iSubItem)); // если в функцию сравнения нужно передать какое либо значение, этот параметр для этого. я тут передаю просто номер столбца
    break;
int CALLBACK CompareListViewProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
    CHAR Buff1[1024]={0};
    CHAR Buff2[1024]={0};
    LPSTR lpStr1, lpStr2;
    INT iNum1=0, iNum2=0;
    INT iResult, iIndex=0;
 
    LVFINDINFO ItemInfo;
 
    ItemInfo.flags=LVFI_PARAM;
    // копируешь в буфера сравниваемые строки 
    ItemInfo.lParam=lParam1;
    iIndex=ListView_FindItem(hWndListView, -1, &ItemInfo);
    ListView_GetItemText(hWndListView, iIndex, (int)lParamSort, Buff1, sizeof(Buff1));
    lpStr1=Buff1;
 
    ItemInfo.lParam=lParam2;
    iIndex=ListView_FindItem(hWndListView, -1, &ItemInfo);
    ListView_GetItemText(hWndListView, iIndex, (int)lParamSort, Buff2, sizeof(Buff2));
    lpStr2=Buff2;
    
    if(lpStr1 && lpStr2)
    {
        switch(lParamSort) 
        {
            // тут по номеру столбца, делается сравнение
            case 0:
            case 4:
                iResult=strcmpi(lpStr1, lpStr2);
                break;
            
            case 1:
            case 2:
            case 3:
                iNum1 = atoi(lpStr2);
                iNum2 = atoi(lpStr1);
                iResult = iNum2 - iNum1;
                
                break;
 
            default:
                iResult=0;
                break;
        }
    }
    // возврат результата сравнения
    return(iResult);
}


Вот что получилось(в моем Listview 7 колонок):

Код:
LVN_COLUMNCLICK : ListView_SortItems(LV, @CompareFunc, PNMLISTVIEW(lParam).iSubItem);


function CompareFunc(LPARAM1, LPARAM2, lParamSort: Cardinal): Integer; stdcall;
var
  Buff1, Buff2 : array[0..1024] of Char;
   lpStr1, lpStr2 : string;
   iNum1, iNum2, iResult, iIndex : Integer;
   ItemInfo : LV_FINDINFO;
begin


    ItemInfo.flags := LVFI_PARAM;
    // копируешь в буфера сравниваемые строки
    ItemInfo.lParam := lParam1;
    iIndex := ListView_FindItem(LV, -1, &ItemInfo);
    ListView_GetItemText(LV, iIndex, lParamSort, Buff1, sizeof(Buff1));
    lpStr1 := Buff1;

    ItemInfo.lParam := lParam2;
    iIndex := ListView_FindItem(lParamSort, -1, &ItemInfo);
    ListView_GetItemText(lParamSort, iIndex, lParamSort, Buff2, sizeof(Buff2));
    lpStr2 := Buff2;

  //  if(lpStr1 and lpStr2) then

        case (lParamSort)  of

            // тут по номеру столбца, делается сравнение
           //  0:
             0..7:
                iResult := lstrcmp(PChar(lpStr1), PChar(lpStr2));
              //  break;

          //  case 1:
         //   case 2:
         {    3:
                iNum1 = atoi(lpStr2);
                iNum2 = atoi(lpStr1);
                iResult = iNum2 - iNum1;

                break;

            default:  }

              //  break;

    // возврат результата сравнения

        end;  // iResult:=0;
    Result := (iResult);
end;

Поправте пожалуйста, а то чертовщина какято тварится(вроде строки бегают, но не так как надо).
Ответить с цитированием