Сегодня столкнулся с необходимостью отсортировать содержимое ячеек 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.
Код сортировки:
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;
Результат сортировки:
Спасибо!
лучше так:
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;