排序TListView列

4
我有一个TListView,有4个列(当然都是字符串),但是我将数据存储在它们中,如下:
  • Caption:任何字符串
  • SubItems [0]:整数,例如'5016'
  • SubItems [1]:日期,例如'03/22/13'
  • Subitems [2]:任何字符串
当用户单击列标题时,我使用以下代码进行排序。
我看了这篇文章 "如何根据subitem [x]对Tlistview进行排序", 但我无法考虑不同的列类型。
procedure TfrmFind.lvwTagsColumnClick(Sender: TObject; Column: TListColumn);
begin
 ColumnToSort := Column.Index;
 (Sender as TCustomListView).AlphaSort;
end;

procedure TfrmFind.lvwTagsCompare(Sender: TObject; Item1, Item2: TListItem;
  Data: Integer; var Compare: Integer);
var
 ix: Integer;
 begin
 if ColumnToSort = 0 then
 Compare := CompareText(Item1.Caption,Item2.Caption)
 else begin
 ix := ColumnToSort - 1;
 Compare := CompareText(Item1.SubItems[ix],Item2.SubItems[ix]);
 end;
end;

如何考虑整数和日期列,使其不被视为字符串进行排序?
谢谢。
1个回答

7
如果你有两个包含整数的字符串,并希望将它们作为整数进行比较,则应将它们从文本转换为整数,然后进行数字比较。
function CompareTextAsInteger(const s1, s2: string): Integer;
begin
  Result := CompareValue(StrToInt(s1), StrToInt(s2));
end;

同样地,对于日期也是如此。将它们从文本转换为数字值,例如TDateTime值。然后进行数值比较。

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

如何实现这个函数取决于您想要将文本转换为日期/时间的数字表示方式。


David,我如何根据列索引在两者之间切换?使用列单击事件。 - JakeSays
好的,OnColumnClick 会告诉你哪一列被点击了。此时,你可能已经知道该列中包含什么内容,并可以从那里做出决定。 - David Heffernan
CompareValueMath 中,而 CompareDateTimeDateUtils 中。这些信息可以在帮助文档中找到:http://docwiki.embarcadero.com/RADStudio/XE3/en/Main_Page 只需将函数名称输入搜索框即可。 - David Heffernan
比较 := 比较文本作为整数(Item1.subitems[0], Item2.subitems[0]) - JakeSays

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接