Главная » Delphi » Delphi — сортировка в ListView по двум колонкам

Delphi — сортировка в ListView по двум колонкам

сортировка колонка OnCompare ListView Delphi  delphi  Сегодня столкнулся с необходимостью отсортировать содержимое ячеек ListView по содержимому двух колонок. Ранее такое делать не приходилось, поэтому решил оставить пост-памятку на будущее. Вдруг, потом еще понадобится.

В своем примере я буду сортировать по колонкам Caption и SubItems[1] (Colum 1 и Colum 3).

Для наглядности, при старте программы я заполняю ListView случайными значениями.

procedure TForm1.FormCreate(Sender: TObject);
var
i:Integer;
begin
for i:=0 to 100 do
  begin
    with ListView1.Items.Add do
      begin
        Caption:=IntToStr(Random(10));
        SubItems.Add(IntToStr(Random(10000)));
        SubItems.Add(IntToStr(Random(5)));
        SubItems.Add(IntToStr(Random(10000)));
      end;
  end;
end;

Получилось так:

сортировка колонка OnCompare ListView Delphi  delphi

Теперь перейду к сортировке.

Для этого добавим процедуру OnCompare для нашего ListView.

сортировка колонка OnCompare ListView Delphi  delphi

Код сортировки:

procedure TForm1.ListView1Compare(Sender: TObject; Item1, Item2: TListItem;
  Data: Integer; var Compare: Integer);
var
  S1, S2: string;
begin
  S1 := Item1.Caption;
  if Item1.SubItems.Count > 0 then
    S1 := S1 + Item1.SubItems[1];
  S2 := Item2.Caption;
  if Item2.SubItems.Count > 0 then
    S2 := S2 + Item2.SubItems[1];
  Compare := CompareText(S2, S1);
end;

Далее необходимо вызвать сортировку в нужном нам месте.

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

В своем примере я просто вставил нужные строки в цикл заполнения ListView данными.

procedure TForm1.FormCreate(Sender: TObject);
var
i:Integer;
begin
for i:=0 to 100 do
  begin
    with ListView1.Items.Add do
      begin
        Caption:=IntToStr(Random(10));
        SubItems.Add(IntToStr(Random(10000)));
        SubItems.Add(IntToStr(Random(5)));
        SubItems.Add(IntToStr(Random(10000)));
        ListView1.SortType := stBoth;
        ListView1.SortType:=stNone;
      end;
  end;
end;

Результат сортировки:

сортировка колонка OnCompare ListView Delphi  delphi

Похожие записи
Температура процессора на Delphi... Давно искал рабочий код для определения температуры процессора на Delphi. Многие предлагали копать в сторону WMI, но у меня ничего универсального не п...
Авторизация в статистике LiveInternet с помощью De... Вчера делал заказ. Нужно было написать программу на Delphi, которая с помощью INDY компонентов авторизируется на сайта LiveInternet и получает в Memo...
Text Browser на Delphi Для оптимизации сайтов под поисковые системы, написал для себя вот такой текстовый веб-браузер. Хотя с браузером я конечно загнул - это скорее просмот...
Моя коллекция иконок У каждого программиста есть подобная коллекция иконок. Вот решил поделиться своей. Архив содержит 4308 файлов ICO размеров 16х16 и 32х32. ...
This entry was posted in Delphi and tagged , , , , . Bookmark the permalink.

2 комментария: Delphi — сортировка в ListView по двум колонкам

  1. Серг говорит:

    Спасибо!

  2. source™ говорит:

    лучше так:

    procedure TForm1.ListView1Compare(Sender: TObject; Item1, Item2: TListItem;
    Data: Integer; var Compare: Integer);
    var
    S1, S2: string;
    begin
    S1 := Item1.Caption;
    if Item1.SubItems.Count > 0 then
    S1 := S1 + Item1.SubItems[2];
    S2 := Item2.Caption;
    if Item2.SubItems.Count > 0 then
    S2 := S2 + Item2.SubItems[2];
    Compare := CompareValue(StrToInt(S2), StrToInt(S1));
    end;

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *