Sort ListView by clicking on columns
First of all, set ListView to vsReport style and fill in some data. OnColumnClick and OnCompare events will do the rest.
We need two more global variables – Descending (boolean type) to store the order of sorting, and SortedColumn to keep the number of column by which is the ListView sorted.
SortType parameter could have these values:
- stNone
- stData
- stText
- stBoth
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
private { Private declarations } Descending: Boolean; SortedColumn: Integer; procedure TForm1.ListView1ColumnClick(Sender: TObject; Column: TListColumn); begin TListView(Sender).SortType := stNone; if Column.Index<>SortedColumn then begin SortedColumn := Column.Index; Descending := False; end else Descending := not Descending; TListView(Sender).SortType := stText; end; procedure TForm1.ListView1Compare(Sender: TObject; Item1, Item2: TListItem; Data: Integer; var Compare: Integer); begin if SortedColumn = 0 then Compare := CompareText(Item1.Caption, Item2.Caption) else if SortedColumn <> 0 then Compare := CompareText(Item1.SubItems[SortedColumn-1], Item2.SubItems[SortedColumn-1]); if Descending then Compare := -Compare; end; |