2009-07-28 9 views
2

私はメモリにいくつかのツリーを構築し、後でユーザーが対話できるTTreeViewコントロールにそれらの1つを割り当てようとしています。しかし、既存のTTreeViewへのポインタを渡すことなく、TTreeNodesオブジェクトを構築することはできません。 NILを渡すと、AVが発生します。なぜDelphi TTreeNodesは基本的にTCustomTreeViewに結びついていますか?

2つの質問:TTreeNodesとTTreeViewsの間のこの「ハード」リンクの理由は、ですが、この問題を解決する最善の方法は何ですか?

私が見ることができるいくつかのオプションは以下のとおりです。必要に応じてTTreeNodesを構築ttreenodesせずに自分のツリー構造 を維持し、動的

  • TTreeNodesの作業を行うために使用されている複数の不可視TTreeView オブジェクトを持つ。

..しかし、私はこれらの賛否両論を重視していません。

+0

タグの変更をロールバックしました。これはジェネリックツリーノードに関する質問ではなく、delphiの "TTreeNodes"クラスの振る舞いについての*具体的なものです。 – Roddy

答えて

4

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

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

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

Mike Lischke's virtual tree controlに興味があるかもしれません。意図した使い方では、自分でツリーデータ構造を管理します。対照はであり、可視化はである。各ノードにいくつの子供がいるかを尋ねられた後、そのノードを描画するたびに各ノードのテキストが何であるかを尋ねられます。どのノードが展開、選択、チェック、または表示されているかを管理しましたが、すべてのデータを管理しています。それはfree and open-sourceです。

+1

仮想ツリービューコンポーネントの+1。それを試して、それを学ぶ、それを愛する:) – DiGi

2

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

2つのオプションは、プロジェクトのwhat/how/howの詳細を知らなくても言い難いものです。

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

3

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

私はguiとデータモデルを区別したいと思います。したがって、常に正しい関係を持つデータモデルがあります。

+0

所有者は通常オプションですが、この場合は所有者ではありません。これは多かれ少なかれ質問です。 –

+0

オーナーはnilのチェックなしでアクセスされます。したがって、この場合はオプションではありません。 –

関連する問題