TListView自定义排序

image

Delphi中TListView的排序步骤,主要使用到两个事件

FOnColumnClick: TLVColumnClickEvent;

FOnCompare: TLVCompareEvent;

简单点的说,就是定义FOnCompare事件,即下面的lvPCCompare,指定每个列,即column的比较方法,返回compare正负值。

然后实现FOnColumnClick事件,就是点击标题事件,下面的代码,主要的处理都是一个箭头图标的处理,关键在lv.CustomSort(nil, Column.index);的调用。

procedure TfrmFileManager.lvPCColumnClick(Sender: TObject; Column: TListColumn);
var
  i: integer;
  lv:TListView;
begin
  lv:=(sender as TListView);
  for i := 0 to lv.Columns.Count – 1 do
  begin
    if (i = Column.index) then
      continue;
    lv.Columns[i].Tag := 0;
    lv.Columns[i].ImageIndex := -1;
  end;

  if (Column.Tag = 2) or (Column.Tag = 0) then
    Column.Tag := 1
  else
    Column.Tag := 2;
  Column.ImageIndex := Column.Tag – 1;

  lv.CustomSort(nil, Column.index);
end;

 

procedure TfrmFileManager.lvPCCompare(Sender: TObject; Item1, Item2: TListItem;
    Data: Integer; var Compare: Integer);
var
  compare1, compare2: integer;
begin
  Compare := 0;
  case Data of
    0: Compare := CompareText(Item1.Caption, Item2.Caption);
    1:
      begin
        compare1 := StrToInt(Item1.SubItems[Data – 1]);
        compare2 := StrToInt(Item2.SubItems[Data – 1]);
        if compare1 > compare2 then
          Compare := 1
        else if compare1 < compare2 then
          Compare := -1;
      end;
    2,3: Compare := CompareText(Item1.SubItems[Data – 1], Item2.SubItems[Data – 1]);
  end;

  if Item1.ListView.Column[Data].Tag = 2 then
    Compare := -Compare;

end;

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据