在Delphi 7中按字母顺序对TListBox项目进行排序

Ala*_*ark 1 delphi sorting delphi-7 tlistbox

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

我看到有一个我已设置为true 的Sorted属性,但是,每当我对内容进行更改时,它都不会对ListBox进行动态排序。似乎没有任何可用的排序过程或函数,并且调用UpdateRefresh效果不理想。

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

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

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

我希望控件进行更新以使内容按字母顺序排序,但事实并非如此。

Dav*_*nan 5

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

因此,解决此问题的简单方法是将设置SortedTrue,然后删除旧值并添加新值,而不是修改现有值。因此,您的代码将变为:

myListBox.Items.Delete(myIndex);
myListBox.Items.AddObject(newString, TObject(my_object));
Run Code Online (Sandbox Code Playgroud)

如果考虑一下,如果列表框的行为符合您的预期,那么您的代码注定会失败。因为修改项目的文本后,如果列表已重新排序,则将myIndex不再引用同一项目。