1

わかりました、43,000 行を表示するために必要な場合がある TListBox があります。

私は知っています、これはほとんど意味がありませんが、そこにあります.

現在の問題は次のとおりです。

組み込みの Sort メソッドをその Compare コールバック関数と共に使用すると、ほぼ永遠に、数分ほどかかります。

そこで、リストボックスから文字列を抽出して、ShortStrings の単純な古い動的配列に入れ、それに対して QuickSort() を実行します。これには約 3 秒かかります。うわー私は思う!

少し考えてみると、QuickSort がこれらすべての文字列を移動していることがわかりますが、これは必要ありません。そのため、コードを変更して、文字列へのポインターまたはインデックスを移動するだけにすると、ほら、並べ替えが再びはるかに高速になります。 43,000 アイテムを並べ替えるのに 1 秒もかかりません。大勝利ですよね?

しかし、LB.Items.Add() または LB.Items.Assign を実行して、並べ替えられた文字列をリストボックスに移動すると、30 秒ほどかかります。BEgin/EndUpdate が発生しても。コードをトレースすると、delete() Insert() INsertObject() で多くの処理が行われ、正当な理由もなく Windows メッセージが飛んでいることがわかります。

しばらくすると、LB.TStrings にすべての文字列が含まれていることがわかります。QuickSorted() 配列の中でそれらをシャッフルする必要があるだけです。それは些細なことで、いくつかのポインタを移動するだけです。

しかし、未加工の TStringList ポインタを設定する目に見える方法はありません。いいえ、Exchange() は本当に遅いです。

TString 文字列ポインタに到達する方法はありますか? これは些細なはずですが、私にはわかりません。

ありがとう、

ジョージ

4

5 に答える 5

5

これらのメッセージはすべて、非常に正当な理由で実際に飛び交っています。「リストにあるものを何でも表示する」という魔法の機能はありません。リストの内容を取得し、そこからツリーを一度に 1 項目ずつ作成し、ビジュアル コントロールの ClientRect 内にあるツリーの部分を表示する必要があります。あなたの外部文字列リスト手法は、あなたが得ようとしている最速のもののように思えます。

より良いパフォーマンスが必要な場合は、より高速なリスト ボックスを調べてみてください。Virtual TreeViewは新しいアイテムを大量に追加する際に非常に高速であると聞いたことがありますが、実際には使用してテストしたことがないため、あまりお勧めできません。ただし、既存のセットアップよりもニーズに適しているかどうかを確認してください。

于 2009-09-10T15:27:16.463 に答える
4

TListBox.Style を lbVirtual に設定してみましたか? 次に、リストボックスは OnData() イベントでデータを要求します

見るhttp://www.delphi3000.com/articles/article_3761.asp?SK=

于 2009-09-10T17:20:36.870 に答える
1

処理速度を維持するために使用できるもう 1 つの方法 (私自身もうまく使用しています) は、アプリケーションがコントロールを再描画するのを停止し、リストを 2 番目の TStringList にコピーし、その TStringList を並べ替えて、元に戻すことです。再描画を停止するための鍵は、コマンドそのものです

SendMessage(Application.Handle, WM_SETREDRAW, 0, 0);

。最初の 0 は、ウィンドウへの描画を停止するようにアプリケーションに指示するため、これらのメッセージはすべてすぐに削除され、アプリケーションははるかに高速に移動できます。画面を再描画する準備ができたら、最初の 0 を 1 に交換し、呼び出し

RedrawWindow(Application.Handle, nil, 0, [Options])

てすべてを即座に再描画します。

于 2009-09-10T15:36:36.047 に答える
1

Virtual Treeviewを試してください。リストボックスではなく、tlistbox よりも少し複雑ですが、TListBox(または tlistview/ttreeview) のように機能し、標準の tlistbox/tlistview/ttreeview よりもはるかに高速です (125 ミリ秒で 1000000 項目を追加できます)。

于 2009-09-10T15:49:58.127 に答える
0

文字列の並べ替え中にリストボックスコントロールの更新を無効にするには、BeginUpdate/ EndUpdate:を使用します。

ListBox.Items.BeginUpdate;
try
  // your sorting here...
finally
  ListBox.Items.EndUpdate;
end;

編集:仮想スタイルを試すこともできます( 、プロパティをStyle = lbVirtual設定し、イベントを処理します)。CountOnData

于 2009-09-10T15:23:42.480 に答える