如何停止排序ListView.AlphaSort

时间:2012-05-07 20:06:28

标签: delphi listview

Delphi Xe2。列表视图(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 个答案:

答案 0 :(得分: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;

答案 1 :(得分:2)

使用VirtualTreeView代替TListView,并在另一个线程中对数据进行排序。那么你就有能力随时停止它。