【问题标题】:Sort TListBox Items Alphabetically in Delphi 7在 Delphi 7 中按字母顺序对 TListBox 项进行排序
【发布时间】:2013-12-06 10:58:53
【问题描述】:

我试图在添加/编辑条目后触发对 TListBox 控件中的项目的排序。

我看到有一个 Sorted 属性我已设置为 true,但是,这不会在我每次更改时动态排序 ListBox内容。似乎没有任何 Sort 过程或函数可用,并且调用 UpdateRefresh 没有达到预期的效果。

我已经到了考虑将 ListBox 的内容拉入 TStringList 对象的阶段,对其进行排序,然后将所有内容放回 列表框。不过,这似乎有点疯狂,我肯定忽略了一些更好的方法。

以下是更改现有项目的示例:

 myListBox.Items[myIndex] := newString; // Update Text
 myListBox.Items.Objects[myIndex] := TObject(my_object); // Update associated object

我希望控件会更新以保持按字母顺序排序,但事实并非如此。

【问题讨论】:

  • ListBox.Sorted := True 在这里工作正常,正如您所愿。您需要显示代码。
  • 你不能像这样通过它的位置改变项目,你必须删除并重新添加

标签: delphi sorting delphi-7 tlistbox


【解决方案1】:

列表框的 sorted 属性实际上是由 Win32 列表框样式LBS_SORT 支持的。添加新项目时,这将对列表框进行排序。但修改现有项目时不会这样做。

因此,解决此问题的简单方法是将Sorted 设置为True,然后,不要修改现有值,而是删除旧值并添加新值。所以你的代码会变成:

myListBox.Items.Delete(myIndex);
myListBox.Items.AddObject(newString, TObject(my_object));

如果您仔细想想,如果列表框的行为符合您的预期,那么您的代码注定会失败。因为在您修改了项目的文本后,如果列表被重新排序,那么myIndex 将不再引用同一个项目。

【讨论】:

  • “删除”不会导致内存泄漏吗?如果有关联的对象?
  • 谢谢大卫,这个方法有效。我已经有重新计算 myIndex 的计划,但这样更有效率。
  • 我希望底层控件使用插入排序,因此该行为会反映在您身上。无论如何,我认为这里的方法可以满足您的所有需求。
  • @MarcusAdams 你无法知道这一点。该对象可能归其他人所有。
  • @DavidHeffernan,哦,评论的是马修斯,不是 OP,我会编辑评论。
猜你喜欢
  • 1970-01-01
  • 2017-09-15
  • 2011-08-29
  • 2017-05-22
  • 1970-01-01
  • 2022-01-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多