我试图在添加/编辑条目后触发TListBox控件中的项目排序。
我看到有一个Sorted属性我已经设置为true,但是,每次我对内容进行更改时,这都不会动态地对ListBox进行排序。似乎没有任何可用的排序过程或功能,并且调用更新或刷新不具有所需的效果。
我已经到了这个阶段,我正在考虑将ListBox的内容拉入TStringList对象,对其进行排序,然后再将所有内容放回到ListBox中。这看起来有点疯狂,当然我忽略了一些更好的方法。
以下是更改现有项目的示例:
myListBox.Items[myIndex] := newString; // Update Text
myListBox.Items.Objects[myIndex] := TObject(my_object); // Update associated object
我希望控件更新以按字母顺序排序,但事实并非如此。
列表框的排序属性实际上由Win32列表框样式LBS_SORT
支持。这将在添加新项目时对列表框进行排序。但是在修改现有项目时不会这样做。
因此,解决这个问题的简单方法是将Sorted
设置为True
,然后,不是修改现有值,而是删除旧值并添加新值。所以你的代码将成为:
myListBox.Items.Delete(myIndex);
myListBox.Items.AddObject(newString, TObject(my_object));
如果你考虑一下,如果列表框的行为符合你的预期,你的代码就注定要失败。因为在修改了项目的文本后,如果列表被重新排序,那么myIndex
将不再引用相同的项目。