Delphi如何通过ItemData.Detail对TListBox进行排序?

5
我有一个 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;

以下是翻译的结果:

这里是一个需要排序的示例列表图片:

这里是一个需要排序的示例列表图片


1
如果你不想使用标准排序,为什么要使用它?为什么将 Sorted 设置为 True? - David Heffernan
Sorted 方法不使用你分配的 Sort 方法吗? - Scott Hallauer
1
不,你不需要分配一个排序方法。你只需要将一个排序方法传递给Sort函数,该函数会在那里使用并对列表进行排序。 - David Heffernan
哦,好的!是的,我删除了那行将 Sorted 设为 True 的代码,现在它可以正常工作了。谢谢! - Scott Hallauer
1个回答

5
调用Sort会使用你的比较函数进行排序。 Sorted属性用于按默认比较确定列表顺序。
为了使用你的比较函数对列表进行排序,只需删除设置Sorted属性的代码即可。

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