0

私は非常に興味深い問題を抱えています。

バックグラウンド

私は何年も TTreeView を使用してきましたが、ドッキング ライブラリ (AutomatedQA から) と共に使用するようになったのは今だけです。TTreeView の親が変更されると、すべてのハンドルが再作成されることを学びました。これは、通常のアクティビティ中にドッキング ライブラリが行うことです。

オブジェクトを保持するために TTreeNode の Data プロパティを使用しています。オブジェクト内の TreeNode へのリンクも保持しています。つまり、TreeNode を使用してオブジェクトを取得でき、オブジェクトから TreeNode を取得することもできます。

ツリー ビューの親が変更されていない限り (ウィンドウの自動非表示と表示)、私のアプリケーションは完全に機能します。

問題

私が見つけたのは、親が変更されると、ツリー ノードの Data プロパティにアタッチされたオブジェクトに、間違ったツリー ノードまたは古いポインターへの参照が含まれるようになったことです。

別の方法で「MyTreeViewContainer.Parent:=SomewhereElse」を試してみたところ、同じ問題が発生しました。

おそらく何百ものオブジェクトでツリーをリロードするのはあまり効率的ではありません。

この問題を回避する方法がわかりません。私は長い間ツリービューをロードすることができ、オブジェクトはお互いを簡単に見つけることができました. これは、ツリービューを使用するための私の素敵な「パターン」を本当に壊す可能性があります...

ご協力ありがとうございました!

4

3 に答える 3

1

TTreeViewから新しいコンポーネントを取得し、仮想CreateWnd()メソッドとDestroyWnd()メソッドをオーバーライドして、必要に応じて一時ストレージとの間でカスタムデータをロード/保存します。VCLのネイティブコンポーネントのいくつか(TTreeViewを含む)は、これを内部で実行します。TreeViewのウィンドウハンドルを再作成する原因となる操作は、Parentプロパティの変更だけではありません。

于 2009-07-09T02:11:11.843 に答える
0

私は答えを見つけたと思います。TTreeViewのOnAdditionイベントを使用して、次のようにノードとオブジェクトを再接続します。

プロシージャTForm1.TreeView1Addition(送信者:TObject;ノード:TTreeNode); TMyObject(Node.Data).TreeNode:=Node;を開始します。終わり;

于 2009-02-25T01:27:40.150 に答える