Mirror

Sort a TListView on a column header click (Views: 100)


Problem/Question/Abstract:

How to sort a TListView on a column header click

Answer:

In the object inspector, I have set the ListView's SortType = stText.

{Private Declarations}
SortColumn: Integer;
SortDescending: Boolean;

procedure Sort(Column: Integer);

procedure TfrmMain.ListViewColumnClick(Sender: TObject; Column: TListColumn);
begin
  Sort(Column.Index);
end;

procedure TfrmMain.Sort(Column: Integer);
begin
  if SortColumn = Column then
    SortDescending := not SortDescending
  else
  begin
    SortDescending := False;
    SortColumn := Column;
  end;
  lsvPlayerPages.AlphaSort;
end;

procedure TfrmMain.ListViewCompare(Sender: TObject; Item1, Item2: TListItem;
  Data: Integer; var Compare: Integer);
begin
  if SortColumn = 0 then
    Compare := CompareStr(Item1.Caption, Item2.Caption)
  else
    Compare := CompareStr(Item1.SubItems[Pred(SortColumn)],
      Item2.SubItems[Pred(SortColumn)]);
  if SortDescending then
    Compare := -Compare;
end;

I have made a separate sort procedure to be able to sort from different commands (e.g. from a menu). The code also sorts descending if a column header is clicked a second time (as Windows Explorer does).

<< Back to main page