Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2016.07.24;
Скачать: [xml.tar.bz2];

Вниз

Сортировка в 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.006 c
15-1441575002
Юрий
2015-09-07 00:30
2016.07.24
С днем рождения ! 7 сентября 2015 понедельник


4-1278077072
Festil
2010-07-02 17:24
2016.07.24
Инициализация драйвера камеры.


3-1307684147
Pavor
2011-06-10 09:35
2016.07.24
BDE: Too many passwords


15-1444763250
DayGaykin
2015-10-13 22:07
2016.07.24
В какой момент человеку исполняется новое количество лет?


2-1414065182
Kettle
2014-10-23 15:53
2016.07.24
Присвоение свойству OLE объекта значения NULL





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский