23.11.2014, 19:14
|
|
Новичок
|
|
Регистрация: 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;
Поправте пожалуйста, а то чертовщина какято тварится(вроде строки бегают, но не так как надо).
|