我有一个包含 4 列(当然都是字符串)的 TListview,但是,我将数据存储在其中:
Caption: 任何字符串
SubItems[0]:整数,例如 '5016'
SubItems[1]:日期,例如 '03/22/13'
Subitems[2]: 任何字符串
当用户单击coolumn 标题时,我使用以下代码进行排序
我正在看这篇文章“如何根据子项 [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;
Run Code Online (Sandbox Code Playgroud)
如何考虑 Integer 和 Date 列,以便它们不会按字符串排序?
谢谢
如果您有两个包含整数的字符串,并且您希望作为整数进行比较,则将它们从文本转换为整数,然后进行数字比较。
function CompareTextAsInteger(const s1, s2: string): Integer;
begin
Result := CompareValue(StrToInt(s1), StrToInt(s2));
end;
Run Code Online (Sandbox Code Playgroud)
日期也类似。将它们从文本转换为数值,例如TDateTime值。然后进行数值比较。
function CompareTextAsDateTime(const s1, s2: string): Integer;
begin
Result := CompareDateTime(StrToDateTime(s1), StrToDateTime(s2));
end;
Run Code Online (Sandbox Code Playgroud)
后一个函数的具体实现方式取决于您希望如何将文本转换为日期/时间的数字表示。
| 归档时间: |
|
| 查看次数: |
7600 次 |
| 最近记录: |