【问题标题】:How to stop sorting ListView.AlphaSort如何停止排序 ListView.AlphaSort
【发布时间】:2012-05-07 20:06:27
【问题描述】:

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

【问题讨论】:

    标签: delphi listview


    【解决方案1】:

    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;
    

    【讨论】:

    • 我猜你可以使用常规的“OnCompare”来引发异常。
    • 安全吗?如果发生这种情况,列表视图数据是否会处于合理状态?不会部分排序吗?
    • @David - 文档说内容在排序期间不稳定。 AFAICS 经过我的小测试,中止后没有部分排序。
    • 我会通过间接排序来解决这个问题。创建一个整数数组并用 0, 1, ..., N-1 填充它。然后对该数组进行排序,以便列表视图的内容不受影响。只有当你到达最后,你才会做出最后的改变。当然,无论如何我都会使用虚拟列表视图,这当然非常适合间接排序。
    • @David - 我猜你正在考虑一些项目数据的缓存,否则在虚拟模式下你只会使我认为的列表无效..
    【解决方案2】:

    使用VirtualTreeView 而不是 TListView 并在另一个线程中对您的数据进行排序。然后你就可以随时阻止它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多