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

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

listview сортировкаСегодня столкнулся с необходимостью отсортировать содержимое ячеек 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;

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

listview сортировка

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

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

listview сортировка

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

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;

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

listview сортировка

Присоединяйтесь к нашей группе в Telegram @GeekElectronics
  • keyboard_arrow_downСортировка ListView по двум колонкам в Delphi
    • Автор:
    • Миниатюра: Сортировка ListView по двум колонкам в Delphi
    • Рубрика: Delphi в примерах
    • Обновлено: 27.12.2017
    • Комментариев: 2
    • Просмотров: 2 120
  • Оцените пожалуйста статью
    1 Star2 Stars3 Stars4 Stars5 Stars
    Загрузка...
  • Поделитесь с друзьями
Geek Electronics

Комментариев: 2

  • Avatar for source
    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;

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

arrow_upward