在Delphi 7中按字母顺序对TListBox项进行排序
在添加/编辑条目后,我试图触发对TListBox控件中的项的排序 我看到有一个Sorted属性,我将其设置为true,但是,这不会在每次更改内容时对列表框进行动态排序。似乎没有任何排序过程或函数可用,调用Update或Refresh也没有达到预期效果 我已经到了考虑将列表框的内容拉入TStringList对象的阶段,对其进行排序,然后将所有内容重新放回列表框。这似乎有点疯狂,当然我忽略了一些更好的方法 以下是更改现有项目的示例:在Delphi 7中按字母顺序对TListBox项进行排序,delphi,sorting,delphi-7,tlistbox,Delphi,Sorting,Delphi 7,Tlistbox,在添加/编辑条目后,我试图触发对TListBox控件中的项的排序 我看到有一个Sorted属性,我将其设置为true,但是,这不会在每次更改内容时对列表框进行动态排序。似乎没有任何排序过程或函数可用,调用Update或Refresh也没有达到预期效果 我已经到了考虑将列表框的内容拉入TStringList对象的阶段,对其进行排序,然后将所有内容重新放回列表框。这似乎有点疯狂,当然我忽略了一些更好的方法 以下是更改现有项目的示例: myListBox.Items[myIndex] := newS
myListBox.Items[myIndex] := newString; // Update Text
myListBox.Items.Objects[myIndex] := TObject(my_object); // Update associated object
我希望控件会更新以保持按字母顺序排序,但它不会。列表框的排序属性实际上由Win32列表框样式
LBS\u SORT
支持。这将在添加新项时对列表框进行排序。但当修改现有项时,它不会这样做
因此,解决此问题的简单方法是将Sorted
设置为True
,然后删除旧值并添加新值,而不是修改现有值。因此,您的代码将变成:
myListBox.Items.Delete(myIndex);
myListBox.Items.AddObject(newString, TObject(my_object));
如果您仔细想想,如果列表框的行为符合您的预期,那么您的代码将注定失败。因为在您修改了项目的文本后,如果列表被重新排序,那么
myIndex
将不再引用同一项目。ListBox.sorted:=True
在这里可以正常工作,正如您所希望的那样。您需要显示代码。您不能按此位置更改项目,必须重新删除和添加。是否“删除”导致内存泄漏?如果有关联的对象?谢谢David,此方法有效。我已经有了重新计算myIndex的计划,但这更有效。我希望底层控件使用插入排序,因此这种行为会反映给您。无论如何,我认为这里的方法满足了你的所有需要。@MarcusAdams,你没有办法知道这一点。这个对象可能被其他东西拥有。@DavidHeffernan,哦,是Mattheus评论的,不是OP,我来编辑评论。