Форум: "Начинающим";
Текущий архив: 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.48 MB
Время: 0.005 c