2

フォームに ListView:TListview があり、多くの値 (約 25k TListViewItem) を追加すると、非常に高速に動作しますが、Listview.Clear を呼び出すと、プログラムがフリーズします。その行。

私の質問は、どうすれば問題を解決できますか? 1 秒以内に非常に多くのアイテムを作成できるのに、なぜそれらを削除するのに永遠に時間がかかるのですか (私は 5 分以上待ちました)?

4

5 に答える 5

14

Clearへの呼び出しをBeginUpdate/EndUpdateブロックで囲んでみましたか。

  listview.Items.BeginUpdate;
  try
    listview.Items.Clear;
  finally
    listview.Items.EndUpdate;
  end;

リストビュー(またはリストボックスなどの他のさまざまなコントロール)でアイテムを追加/削除すると、追加/削除されたすべてのアイテムのコントロールのGUI更新がトリガーされます。特にリストビューの場合、これは非常に高額になる可能性があり、25,000アイテムの場合、オーバーヘッドが大きくなります。

確かに5分は過度に聞こえますが、これが私が最初に試みることです。

于 2009-08-17T20:30:37.340 に答える
5

私が最初に試みることは、Clearへの呼び出しをBeginUpdate/EndUpdateでラップすることです。

  ListView1.Items.BeginUpdate;
  ListView1.Clear;
  ListView1.Items.EndUpdate;

ListViewに添付されているイベントはありますか?リストがクリアされているときにイベントが発生しますか?

于 2009-08-17T20:28:01.997 に答える
2

ジョン、25k のアイテムを追加するよりも、クリアするのに長くかかるべきではありません。
表示されていないときにロードするのだろうか(更新を自動的に無効にします)、各アイテムの削除が更新をトリガーする場所が表示されたらクリアします。

于 2009-08-17T21:26:05.933 に答える
2

他の人がBeginUpdate .... EndUpdateに注目したように、パフォーマンスが大幅に向上しますが、VirtualTreeViewを使用するようにコードを移動することをお勧めします。これは、1 秒未満で最大 1m のノードを追加するハイブリット ツリー/ListView です (実際にはプロセッサによって異なりますが、アイデアは得られます)。

最初は習得が少し難しいですが、慣れると「簡単」に操作できるようになります。個人的には、ListView または TreeView で多くの行が必要なときはいつでも、VirtualTreeView 以外に探す必要はありません。ああ、それに加えて、無料であることを忘れていました。から試してみてください: http://soft-gems.net/

于 2009-08-17T20:47:07.277 に答える
0

この質問を削除すべきかどうかはわかりませんが、他の人にとっては何の役にも立たないと思いますが、少なくとも回答したあなたのためには、しばらく保持したいと思います.

問題は、TListView を継承したコンポーネントを使用したことでした。問題ないと思ったので、TListView と言うことにしましたが、間違っていました。

私はあなたのすべての答えに賛成しました。私の無知を許してください - 私は新しいです。

于 2009-08-17T22:07:31.670 に答える