わかりました、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 文字列ポインタに到達する方法はありますか? これは些細なはずですが、私にはわかりません。
ありがとう、
ジョージ