2

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

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

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

这是更改现有项目的示例:

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

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

4

1 回答 1

5

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

所以解决这个问题的简单方法是设置SortedTrue,然后,而不是修改现有值,删除旧值并添加新值。所以你的代码会变成:

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

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

于 2013-12-06T11:17:23.663 回答