3

德尔福 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中有什么停止的命令吗?

4

2 回答 2

4

宏内部正在TListView.AlphaSortListView_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;
于 2012-05-07T20:26:07.173 回答
2

使用VirtualTreeView而不是 TListView 并在另一个线程中对您的数据进行排序。然后,您将有能力随时阻止它。

于 2012-05-07T20:54:47.593 回答