Главная » 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. За основу взят компонент adCpuUsage. Думаю, что это дополнени...
Моя коллекция иконок У каждого программиста есть подобная коллекция иконок. Вот решил поделиться своей. Архив содержит 4308 файлов ICO размеров 16х16 и 32х32. ...
Text Browser на Delphi Для оптимизации сайтов под поисковые системы, написал для себя вот такой текстовый веб-браузер. Хотя с браузером я конечно загнул - это скорее просмот...
Программа для автопрокрутки сайта thedeepestsite.c... Многие из вас, наверное, уже знакомы с самым глубоким в мире сайтом Borjomi thedeepestsite.com. Мне он тоже понравился. Идей гениальная. Я 15 минут к...
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 не будет опубликован. Обязательные поля помечены *