Delphi按ItemData.Detail排序TListBox?

时间:2017-04-19 06:33:47

标签: sorting delphi tlistbox

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

以下是要排序的示例列表的图像:

Here is an image of an example list that would be sorted

1 个答案:

答案 0 :(得分:5)

Sort的调用使用您的比较功能执行排序。 Sorted属性用于按默认比较确定的顺序维护列表。

为了使用比较函数对列表进行排序,只需删除设置Sorted属性的代码即可。