Блог о программировании, электронике и рыбалке

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

Главная » Delphi » 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

  • infoDelphi — сортировка в ListView по двум колонкам
    • Автор:
    • Язык: ru-RU
    • Миниатюра: https://geekelectronics.org/wp-content/uploads/2017/05/image_thumb2-11.png
    • Рубрика: Delphi
    • Метки: , , , ,
    • Обновлено: 21.12.2016
    • Комментариев: 2
    • Просмотров: 1 162
logo
  • Серг:

    Спасибо!

  • 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;

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