2009年5月29日

Delphi TListView 的排序

在 Form 上放入 TListView 元件
在 Form Create 事件中加入

procedure TForm1.FormCreate(Sender: TObject);
begin
with ListView1 do
begin
ViewStyle := vsReport;
Columns.Add.Caption := 'A';
Columns.Add.Caption := 'B';

with Items.Add do
begin
Caption := '3';
SubItems.Add('3');
end;

with Items.Add do
begin
Caption := '2';
SubItems.Add('1');
end;
with Items.Add do
begin
Caption := '1';
SubItems.Add('2');
end;
end;
end;

在 TForm1 的 private 宣告中加入

private
SortColumn: TListColumn; // 排序欄位

在 TListView ColumnClick 事件中加入

procedure TForm1.ListView1ColumnClick(Sender: TObject;
Column: TListColumn);
begin
SortColumn := Column;
(Sender as TCustomListView).AlphaSort; // 排序
SortColumn.Tag := not SortColumn.Tag; // tag 紀錄正反排
end;

在 TListView Compare 事件中加入

procedure TForm1.ListView1Compare(Sender: TObject; Item1, Item2: TListItem;
Data: Integer; var Compare: Integer);
var
ix: Integer;
begin
if SortColumn.Index = 0 then
Compare := CompareText(Item1.Caption, Item2.Caption)
else begin
ix := SortColumn.Index - 1;
Compare := CompareText(Item1.SubItems[ix], Item2.SubItems[ix]);
end;
if Boolean(SortColumn.Tag) then begin
Compare := -Compare; // 反排
end;
end;

執行程式後,就可用滑鼠按 ListView 的 Column Header 來做正反排

沒有留言:

網誌存檔