Delphi 按 ItemData.Detail 对 TListBox 进行排序?
Delphi Sort TListBox by ItemData.Detail?
我有一个包含位置列表的 TListBox(每个位置都有一个名称和与您当前位置的距离)。我想让用户可以选择按位置名称(即按字母顺序)或距当前位置的距离对列表进行排序。位置名称存储为项目的 ItemData.Text 值,与当前位置的距离存储为 ItemData.Detail 值。问题是常规的 TListBox 排序方法在排序时不使用 ItemData.Detail 属性(只是 ItemData.Text 属性)。是否可以向 TListBox 添加自定义排序方法,该方法根据每个项目的 ItemData.Detail 值进行排序?
我尝试了以下方法,但它不起作用:
procedure TFrmSelect.btnSortLocationClick(Sender: TObject);
var Compare: TFMXObjectSortCompare;
begin
btnSortLocation.Enabled := False;
btnSortAlpha.Enabled := True;
Compare := function(item1, item2: TFmxObject): Integer
begin
Result := TListBoxItem(item1).ItemData.Detail.CompareTo(TListBoxItem(item2).ItemData.Detail);
end;
self.ListBox.Sort(Compare);
self.ListBox.Sorted := False;
self.ListBox.Sorted := True;
end;
这是将要排序的示例列表的图像:
对 Sort
的调用使用您的比较函数执行排序。 Sorted
属性 用于按照默认比较确定的顺序维护列表。
为了使用比较功能对列表进行排序,只需删除设置 Sorted
属性 的代码即可。
我有一个包含位置列表的 TListBox(每个位置都有一个名称和与您当前位置的距离)。我想让用户可以选择按位置名称(即按字母顺序)或距当前位置的距离对列表进行排序。位置名称存储为项目的 ItemData.Text 值,与当前位置的距离存储为 ItemData.Detail 值。问题是常规的 TListBox 排序方法在排序时不使用 ItemData.Detail 属性(只是 ItemData.Text 属性)。是否可以向 TListBox 添加自定义排序方法,该方法根据每个项目的 ItemData.Detail 值进行排序?
我尝试了以下方法,但它不起作用:
procedure TFrmSelect.btnSortLocationClick(Sender: TObject);
var Compare: TFMXObjectSortCompare;
begin
btnSortLocation.Enabled := False;
btnSortAlpha.Enabled := True;
Compare := function(item1, item2: TFmxObject): Integer
begin
Result := TListBoxItem(item1).ItemData.Detail.CompareTo(TListBoxItem(item2).ItemData.Detail);
end;
self.ListBox.Sort(Compare);
self.ListBox.Sorted := False;
self.ListBox.Sorted := True;
end;
这是将要排序的示例列表的图像:
对 Sort
的调用使用您的比较函数执行排序。 Sorted
属性 用于按照默认比较确定的顺序维护列表。
为了使用比较功能对列表进行排序,只需删除设置 Sorted
属性 的代码即可。