如何停止对 ListView 进行字母排序。

3
Delphi Xe2。带有大量列表项的Listview(Lv1)。 Lv1具有标准比较过程“TForm1.lv1Compare”。通过标准过程lv1.AlphaSort开始排序; 一切正常工作并且已经排序。问题是:如何在需要的情况下立即停止已启动的排序?
例子:
procedure tform1.button1.onclick(..);
begin
lv1.AlphaSort; // start sorting
end;

procedure tform1.button2.onclick(..);
begin
//lv1.StopSort; // stop sorting ???
end;

在OnCompare过程中是否有任何停止命令?
2个回答

4
TListView.AlphaSort 方法内部,调用了 ListView_SortItems 宏,但我没有看到任何有关如何停止排序过程的提及(即使通过回调函数),因此恐怕这是不可能的(至少是常规方式)。
像 Sertac 在评论中建议的那样,作为一种可能的解决方法,可以在 OnCompare 事件内抛出静默异常:
var
  YouWantToAbortSort: Boolean;

procedure TForm1.Button1Click(Sender: TObject);
begin
  YouWantToAbortSort := False;
  ListView1.AlphaSort;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  YouWantToAbortSort := True;
end;

procedure TForm1.ListView1Compare(Sender: TObject; Item1, Item2: TListItem;
  Data: Integer; var Compare: Integer);
begin
  if YouWantToAbortSort then
    Abort;
  // some sorting function here ...
  Application.ProcessMessages;
end;

2
我猜你可以使用常规的“OnCompare”来引发异常。 - Sertac Akyuz
1
那个安全吗?如果发生那种情况,列表视图数据会处于合理的状态吗?它不会部分排序吗? - David Heffernan
@David - 文档说明称,在排序期间内容是不稳定的。根据我的小测试,我认为在中止后没有部分排序。 - Sertac Akyuz
1
我会通过间接排序来解决这个问题。创建一个整数数组,并用0、1、...、N-1填充它。然后对该数组进行排序,以便不影响列表视图的内容。只有在最后才进行最终更改。当然,我将使用虚拟列表视图,这与间接排序完美契合。 - David Heffernan
1
@David - 我猜你在考虑一些项目数据的缓存,否则在虚拟模式下,我认为你只需要使列表失效即可。 - Sertac Akyuz
显示剩余3条评论

2
使用VirtualTreeView代替TListView,并在另一个线程中对数据进行排序。然后您就可以随时停止它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接