Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2016.07.24;
Скачать: CL | DM;

Вниз

Сортировка в ListView WinApi.   Найти похожие ветки 

 
Max   (2014-11-23 15:41) [0]

Здравствуйте.
Как организовать сортировку по клику по колонкам?
Искал в инете, но толкового ни чего не неашел(быть может, искал плохо).
Встречается либо код на С, либо VCL(Аналогичное у меня есть).
Подскажить пожалуйста.


 
Inovet ©   (2014-11-23 16:09) [1]

> [0] Max   (23.11.14 15:41)
> Встречается либо код на С

В теме упоминается WinApi, что-то в MSDN е не припомню, чтобы видел Делфи, так что ничего удивительного, что на Си. Осталось понять и перевести на Делфи.


 
Max   (2014-11-23 17:07) [2]

Ну не все же пишут на Си, может у кого есть наброски?


 
junglecat ©   (2014-11-23 17:10) [3]

WM_NOTIFY - LVN_COLUMNCLICK

ListView_SortItems(LV.Handle, @SortProc, SomeDataForSortProc);

function SortProc(Item1, Item2: TListItem; lParam: Integer): Integer; stdcall;
begin
 Result := lstrcmp(PChar(Item1.Caption), PChar(Item2.Caption));
end;


 
Max   (2014-11-23 17:40) [4]

Я в панике


 
кгшзх ©   (2014-11-23 19:01) [5]

function MySortFunc(Item1, Item2: TListItem; lParam: Integer): Integer; stdcall;
begin
if Item1.Caption > Item2.Caption then
 Result := -(lParam)
else
 Result := lParam;
end;

var bFlag : integer = 1;

procedure TForm1.Button2Click(Sender: TObject);
begin
ListView1.CustomSort(@MySortFunc,bFlag);
bFlag := -bFlag;
end;


 
ListView.Canvas   (2014-11-23 19:31) [6]

http://delphimaster.net/view/2-1416681305/
Клиника WinAPI?
В чем цимус, когда все гораздо проще в VCL?
Лабораторная, курсовой?


 
Max   (2014-11-23 20:07) [7]

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

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;


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


 
Max   (2014-11-23 20:09) [8]


> ListView.Canvas   (23.11.14 19:31) [6]
> http://delphimaster.net/view/2-1416681305/Клиника
> WinAPI?В чем цимус, когда все гораздо проще в VCL?Лабораторная,
>  курсовой?

Для себя, для удовольствия.Переписываю  VCL на API.


 
кгшзх ©   (2014-11-23 20:14) [9]

ну так и получай его самостоятельно.


 
Max   (2014-11-23 20:44) [10]


> кгшзх ©   (23.11.14 20:14) [9]
> ну так и получай его самостоятельно.

А в чем разница, для себя ли лаба?
Это получается, для студентов пожалуйста, а смогут ли они ее защитить? Будет с преподом сидеть, как баран на новые варота смотреть, что же ему там написали.Так получаетс?
Это же и меня касается, с одной только разницей---- я прошу помощи не для того что бы получить зачет и от меня отстали, а потому что мне хочется сделать нормальное, рабочее приложение(пусть и для себя и для своего удовальствия).


 
junglecat ©   (2014-11-23 21:45) [11]

может, в этом дело?
iIndex := ListView_FindItem(lParamSort, -1, &ItemInfo);
ListView_GetItemText(lParamSort


 
Max   (2014-11-23 23:51) [12]


> junglecat ©   (23.11.14 21:45) [11]
> может, в этом дело?iIndex := ListView_FindItem(lParamSort,
>  -1, &ItemInfo);ListView_GetItemText(lParamSort

Заменил, Вообще заглохло


 
junglecat ©   (2014-11-24 08:39) [13]

ну тогда разберись, что у тебя LV, а что lParamSort



Страницы: 1 вся ветка

Текущий архив: 2016.07.24;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.01 c
15-1444771802
Юрий
2015-10-14 00:30
2016.07.24
С днем рождения ! 14 октября 2015 среда


15-1446150607
картман
2015-10-29 23:30
2016.07.24
сжатие строк


15-1443389401
Юрий
2015-09-28 00:30
2016.07.24
С днем рождения ! 28 сентября 2015 понедельник


2-1412944569
Mass
2014-10-10 16:36
2016.07.24
прилипание


15-1441127797
Pavia
2015-09-01 20:16
2016.07.24
Хочу пример таблицы