Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Delphi 7中按字母顺序对TListBox项进行排序_Delphi_Sorting_Delphi 7_Tlistbox - Fatal编程技术网

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

在Delphi 7中按字母顺序对TListBox项进行排序,delphi,sorting,delphi-7,tlistbox,Delphi,Sorting,Delphi 7,Tlistbox,在添加/编辑条目后,我试图触发对TListBox控件中的项的排序 我看到有一个Sorted属性,我将其设置为true,但是,这不会在每次更改内容时对列表框进行动态排序。似乎没有任何排序过程或函数可用,调用Update或Refresh也没有达到预期效果 我已经到了考虑将列表框的内容拉入TStringList对象的阶段,对其进行排序,然后将所有内容重新放回列表框。这似乎有点疯狂,当然我忽略了一些更好的方法 以下是更改现有项目的示例: myListBox.Items[myIndex] := newS

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

我看到有一个Sorted属性,我将其设置为true,但是,这不会在每次更改内容时对列表框进行动态排序。似乎没有任何排序过程或函数可用,调用Update或Refresh也没有达到预期效果

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

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

 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,我来编辑评论。