3

デルファイ 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 に停止のコマンドがありますか?

4

2 に答える 2

4

TListView.AlphaSortマクロの内部でListView_SortItems呼び出されていますが、参照でソートプロセスを停止する方法についての言及が見られないため (コールバック関数を使用しても)、これは不可能だと思います (少なくとも通常の方法)。

Sertac がコメントで示唆したように、考えられる回避策の 1 つは、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

TListViewの代わりにVirtualTreeViewを使用して、別のスレッドでデータの並べ替えを行います。そうすれば、いつでもそれを停止することができます。

于 2012-05-07T20:54:47.593 に答える