Обработчики узла TTreeView, освобожденные после изменения родительского объекта TTreeView? - PullRequest
0 голосов
/ 25 февраля 2009

У меня очень интересная проблема.

фон

Я использовал TTreeView годами, но только сейчас использую его с библиотекой стыковки (от AutomatedQA). я узнал, что когда родительский элемент TTreeView изменяется, все дескрипторы воссоздаются. это то, что библиотека док-станции делает во время обычных активаций.

Я использовал свойство Data в TTreeNode для хранения объекта. я также сохранил связь с TreeNode в объекте. Короче говоря, используя TreeNode, я могу получить объект и также получить TreeNode от объекта.

до тех пор, пока в древовидном представлении никогда не изменился родитель (окно автоматического скрытия и отображения), мое приложение работает отлично.

проблема

я обнаружил, что после изменения родителя мой объект, присоединенный к свойству Data узла дерева, теперь содержит ссылки на неправильный узел дерева или устаревший указатель.

я попробовал его другим способом "MyTreeViewContainer.Parent: = SomewhereElse" и заметил ту же проблему.

перезагрузка дерева возможно сотнями объектов не будет очень эффективной.

Я не понимаю, как мне обойти эту проблему. я так долго мог загружать вид дерева и позволить объектам легко находить друг друга. это может действительно сломать мой хороший "шаблон" для использования вида дерева ...

спасибо за помощь!

Ответы [ 2 ]

1 голос
/ 09 июля 2009

Получите новый компонент из TTreeView и переопределите виртуальные методы CreateWnd () и DestroyWnd () для загрузки / сохранения пользовательских данных из / во временное хранилище, когда это необходимо. Несколько собственных компонентов VCL (включая TTreeView) делают это внутренне. Изменение свойства Parent - не единственная операция, которая может привести к воссозданию дескриптора окна TreeView.

0 голосов
/ 25 февраля 2009

я думаю, что нашел ответ. используйте событие OnAddition TTreeView для повторного соединения узла и объекта следующим образом:

процедура TForm1.TreeView1Addition (Отправитель: TObject; Узел: TTreeNode); начать TMyObject (Node.Data) .TreeNode: = Узел; конец;

...