2

私たちのアプリケーションでは、TStringGrid コンポーネントから TVirtualStringTree コンポーネントに移行しています。大量のデータが表示されています (最大 50000 行および 5 列)。1 つの列に 1 行以上のテキストが含まれています。stringgrid で 'DrawCell' を使用して最適なパフォーマンスで複数行の機能を実装することができました: すべての行の即時再描画 (サイズ変更時) とヒッチなしのスクロール (メモリ内に行の高さのリストがあり、再描画が必要なときに更新されます) .

この複数行の機能を VirtualStringTree に移すことは、stringgrid の代替手段ほどパフォーマンスが良くありません。数多くの実装を試みましたが、まだ成功していません。これは、VirtualStringTree インストール パッケージのデモ アプリケーションで簡単に再現できます。

  1. 「MultilineDemo」フォームで、VirtualStringTree の「rootNodeCount」を 10.000 に設定します。
  2. デモを実行するときは、[ノードの高さをノード テキストに合わせて自動的に調整する] を選択します。

最初の再描画/再描画には、大量の CPU を使用する時間がかかります。サイズを変更するたびに、トップ/ボトムにジャンプすると同じ現象が発生するか、「スタックオーバーフロー」例外が発生することさえあります (ただし、それは別の問題です...)。「OnMeasureItem」メソッドは、私が見ているように(「MouseMove」イベントでも)呼び出されすぎています。

誰かがこの問題を抱えていて、解決策を見つけることができましたか?

4

1 に答える 1

2

これは、VirtualStringTree インストール パッケージのデモ アプリケーションで簡単に再現できます。

少なくともこのパフォーマンスの問題は、 への呼び出しをandReinitNode()でラップすることで簡単に解決できます。BeginUpdate()EndUpdate()

 MLTree.BeginUpdate();
  try
    MLTree.ReinitNode(nil, True);
  finally
    MLTree.EndUpdate();
  end;

今日、サンプル プロジェクトと仮想ツリービューを少し作り直しました。サンプル プロジェクトはよりスムーズに動作するようになりました。GitHub から最新のソース コードを試してみてください。

于 2015-07-14T20:26:13.043 に答える