2

メモリ内にいくつかの「ツリー」を構築し、後でそのうちの 1 つをユーザーが操作できる TTreeView コントロールに割り当てようとしています。ただし、既存の TTreeView へのポインターを渡さずに TTreeNodes オブジェクトを構築することはできません。NIL を渡すと AV が発生します。

2 つの質問:- TTreeNodesとTTreeViews の間のこの「難しい」リンクの理由は何ですか? また、問題を解決する最善の方法は何ですか?

私が見ることができるいくつかのオプションは次のとおりです。

  • ttreenodes なしで独自のツリー構造を維持し、必要に応じて TTreeNodes を動的に構築します。
  • TTreeNodes を機能させるために使用される、複数の非表示の TTreeView オブジェクトを持つ。

..しかし、私はこれらの長所と短所を比較検討していません。

4

3 に答える 3

4

TTreeViewおよびその関連クラスには、Delphi オブジェクトとその下にある Windows コントロールとの間のリンクを同期させておくためのコードがたくさんあります。ノードがウィンドウ メッセージを介して直接追加された場合、Delphi オブジェクトは、たとえばノードの数を次に尋ねたときに、その変更を反映する必要があります。

TTreeViewは Windows コントロールのラッパーであり、TTreeNodes単にTTreeNodeそのラッパーの一部です。それらは、コントロールが行うすべてのツリー操作を実際に実装しているわけではありません。現在利用可能な Windows コントロールがない場合、特定の操作は無効です。

TTreeViewビジュアルコントロールです。視覚化するものが何もない場合、それはあなたのためのコントロールではありません. 複数のツリー データ構造があり、ツリー コントロールが 1 つだけ必要な場合は、別の構造に切り替えるたびにツリー ノードを破棄して再作成する必要があります。コントロールは、特定のノードを一時的に非表示にする方法さえ提供しません。

Mike Lischke の仮想ツリー コントロールに興味があるかもしれません。本来の用途では、ツリー データ構造を自分で管理します。コントロールは単なる視覚化です。各ノードが持つ子の数を尋ね、そのノードを描画する必要があるたびに、各ノードのテキストが何であるかを尋ねます。どのノードが展開、選択、チェック、または表示されるかを管理していましたが、すべてのデータを管理していました。無料でオープンソースです。

于 2009-07-28T13:17:52.957 に答える
3

TTreeNodesのソースを見ると、所有者(TCustomTreeView)が必要であることがわかります。非表示のツリービューを使用するか、カスタムサブクラスを作成できます。

私はGUIをデータモデルから分離することを好みます。したがって、正しい関係を持つデータモデルが常に存在します。

于 2009-07-28T11:00:07.507 に答える
2

(主な)理由は、TTreeNodeが複数のTTreeviewに表示されないようにするためである可能性があります。これは一般的なデザインパターンであり、XmlNodeクラスなどにも見られます。

あなたの2つの選択肢については、あなたのプロジェクトの何/どのように/いくつかについてもっと知らずに言うのは難しいです。

ノードセットに関連する外観/動作にわずかな違いがある場合は、TTreeviewを交換します。

于 2009-07-28T10:57:48.307 に答える