Delphi - база знаний

         

Сортировка ListView при нажатии на заголовок


Сортировка ListView при нажатии на заголовок



Взято из FAQ:

Сортировка ListView в режиме vsReport при нажатии на заголовок колонки


function CustomDateSortProc(Item1, Item2: TListItem; ParamSort: integer): integer; stdcall;
begin
result:=0;  
if strtodatetime(item1.SubItems[0])> strtodatetime(item2.SubItems[0]) then

 
  Result :=1   
else  
  if strtodatetime(item1.SubItems[0])< strtodatetime(item2.SubItems[0]) then  
    Result :=-1;  
end

procedure TForm1.lv1ColumnClick(Sender: TObject; Column: TListColumn);
begin
if column =lv1.columns[0] then  
  LV1.CustomSort(@CustomNameSortProc, 0)  
else   
  LV1.CustomSort(@CustomDateSortProc, 0)  
end

Автор Vit
Взято с Vingrad.ru



Сортировка по первой колонке
Сортировка по первой колонке TListView делается так:

ListView1.SortType := stText;

Установка SortType в stText аналогична установке Sorted в True в объекте TListBox. Список будет оставаться отсортированным даже после добавления или изменения элементов, до тех пор, пока не установить SortType обратно в stNone:

ListView1.SortType := stNone;

В TListBox это аналогично установке Sorted в False.

Сортировка по другим колонкам
Чтобы отсортировать TListView по другой колонке, потребуется написать событие OnCompare, либо функцию сортировки, которая будет использоваться в методе CustomSort.

Для начала рассмотрим сортировку при помощи события OnCompare.

procedure(Sender: TObject; Item1, Item2: TListItem;Data: Integer; var Compare: Integer) of object;

Параметр Compare может иметь три значения: 1, -1 или 0. Единица означает, что первый элемент больше (или должен быть размещён после) второго элемента. Минус одни означает, что первый элемент меньше чем (или должен быть размещён перед) второй элемент. Ноль означает, что два элемента равны.

В следующем примере мы сортируем TListView по четвёртой колонке (которая представлена целыми значениями) в порядке убывания:

procedure TForm1.ListView1Compare(Sender: TObject; Item1,
  Item2: TListItem; Data: Integer; var Compare: Integer);
var
  n1, n2: integer;
begin
  n1 := StrToInt(Item1.SubItems[2]);
  n2 := StrToInt(Item2.SubItems[2]);
  if n1 > n2 then
    Compare := -1
  else if n1 < n2 then
    Compare := 1
  else
    Compare := 0;
end;

Теперь достаточно установить SortType в stBoth (вместо stText, который сортирует по первой колонке не используя метод OnCompare):

ListView1.SortType := stBoth; 

Теперь, чтобы сделать временную сортировку, проделайте следующее:

ListView1.SortType := stBoth;
ListView1.SortType := stNone;

или ещё:

ListView1.CustomSort(nil, 0);

Сортировка при помощи функции сортировки
Функция сортировки используется для быстрой сортировки. Эта функция должна возвращать 1, -1 или 0 (как параметр Compare в событии OnCompare). Например:

function ByFourth(Item1, Item2: TListItem; Data: integer):
  integer; stdcall;
var
  n1, n2: cardinal;
begin
  n1 := StrToInt(Item1.SubItems[2]);
  n2 := StrToInt(Item2.SubItems[2]);
  if n1 > n2 then
    Result := -1
  else if n1 < n2 then
    Result := 1
  else
    Result := 0;
end;

Теперь, каждый раз, как Вы захотите отсортировать список, достаточно будет вызвать метод CustomSort, передав ему адрес функции сортировки. Например:

ListView1.CustomSort(@ByFourth, 0);

Параметр Data в функции сортировки используется для указания номера колонки.


Взято с Исходников.ru







Содержание раздела