一种工作方式,用于对包含DateTime值的TListView列进行排序

时间:2015-05-31 11:55:19

标签: delphi sorting listview

我有一个TListView机智3列。第1列是文本,第2列是文本,第3列是DateTime 现在我的表格上有以下代码

function CompareTextAsDateTime(const s1, s2: string): Integer;
begin
  Result := CompareDateTime(StrToDateTime(s2), StrToDateTime(s1));
end;

procedure TfrmHsMailCollect.lstMailsColumnClick(Sender: TObject; Column: TListColumn);
begin
  TListView(Sender).SortType := stBoth;
end;

procedure TfrmHsMailCollect.lstMailsCompare(Sender: TObject; Item1, Item2: TListItem; Data: Integer; var Compare: Integer);
begin
  Compare := CompareTextAsDateTime(Item1.subitems[colDate - 1], Item2.subitems[colDate - 1]);
  Compare := -Compare;
end;

-Compare是因为列需要按降序排序,因此最新的项是第一个。 我的问题是列没有排序。 我一直在这个网站和其他网站上看到几个解决方案,但它们看起来都一样,没有一个正在运作。

所以我的问题是:对包含DateTime值的TListView列进行排序的正确方法是什么。

1 个答案:

答案 0 :(得分:1)

SortType属性不是您需要的。那用于自动排序。您不希望这样,您希望对用户操作进行排序。

您需要调用CustomSort方法:

procedure TfrmHsMailCollect.lstMailsColumnClick(Sender: TObject; Column: TListColumn);
begin
  TListView(Sender).CustomSort(nil, 0);
end;

CustomSort的第一个参数是比较函数。如果传递了nil,则比较将路由到OnCompare事件,我信任您的代码lstMailsCompare

CustomSort的第二个参数作为其Data参数传递给compare方法。您没有使用该机制,因此可以传递您喜欢的任何内容。例如,您可以使用它来指定排序是升序还是降序。