3

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;

整数列と日付列が文字列としてソートされないようにするにはどうすればよいですか?

ありがとう

4

1 に答える 1

5

整数を含む 2 つの文字列があり、整数として比較したい場合は、それらをテキストから整数に変換し、数値的に比較します。

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;

この後者の関数を正確にどのように実装するかは、テキストを日付/時刻の数値表現に変換する方法によって異なります。

于 2013-03-22T14:52:06.713 に答える