2009-07-28 3 views
2

Я пытаюсь создать несколько «деревьев» в памяти и позже назначить один из них элементу управления TTreeView, с которым пользователь может взаимодействовать. Однако я не могу построить любые объекты TTreeNodes, не передавая указатель на существующий TTreeView. Передача в NIL вызывает AV.Почему Delphi TTreeNodes принципиально привязаны к TCustomTreeView?

Два вопроса: - В чем причина этой «жесткой» связи между TTreeNodes и TTreeViews, и, что является лучшим способом решения проблемы?

Некоторые опции я могу увидеть:

  • Поддержание свою собственную структуру дерева без ttreenodes и динамически построения TTreeNodes по мере необходимости.
  • Наличие нескольких невидимых объектов TTreeView , которые только что использовали Работы с материалами TTreeNodes.

.. но я не взвесил доводы за и против.

+0

Я отменил изменение тега. Это не вопрос об общих узлах дерева, а конкретно о поведении класса delphi «TTreeNodes». – Roddy

ответ

4

Существует много кода в TTreeView и связанных с ним классах, чтобы поддерживать связь между объектами Delphi и базовым элементом управления Windows в синхронизации. Когда узлы добавляются напрямую через оконные сообщения, объект Delphi должен отражать это изменение в следующий раз, когда вы спросите его, сколько у него узлов, например.

TTreeView является оберткой для управления Windows, а TTreeNodes и TTreeNode - это просто часть этой обертки. Они фактически не реализуют все операции дерева, которые выполняет элемент управления. Некоторые операции недействительны, если в настоящее время нет доступных элементов управления Windows.

TTreeView - это визуальный контроль. Если вам нечего визуализировать, то это не контроль для вас. Если у вас несколько структур данных дерева, и вам нужен только один элемент управления деревом, тогда вам придется жить с уничтожением и воссозданием узлов дерева всякий раз, когда вы переключаетесь на другую структуру. Элемент управления даже не позволяет временно скрывать определенные узлы.

Возможно, вас заинтересует Mike Lischke's virtual tree control. В своем предполагаемом использовании вы сами управляете структурой данных дерева; управление только визуализация. Он спрашивает, сколько детей у каждого узла есть, и затем он спрашивает вас, какой текст каждого узла будет каждый раз, когда он должен будет нарисовать этот узел.Он управлял тем, какие узлы расширяются, выбираются, проверяются или видимы, но вы управляете всеми данными. Это free and open-source.

+1

+1 для компонента Virtual Tree View. Попробуй, узнай, люби его :) – DiGi

2

Основная причина, по всей вероятности, состоит в том, чтобы предотвратить появление TTreeNode в более чем 1 TTreeview. Это общий шаблон дизайна, также найденный в классах XmlNode и т. Д.

Что касается двух вариантов, трудно сказать, не зная больше о том, что/как/сколько в вашем проекте.

Если есть небольшие различия в внешности/поведении, связанные с наборами узлов, я бы пошел на обмен TTreeviews.

3

Если вы посмотрите на источник TTreeNodes, вы увидите, что для него требуется Владелец (который является TCustomTreeView). Вы можете использовать скрытое дерево или создать собственный подкласс.

Я предпочитаю отделять gui от datamodel. Таким образом, всегда существует датамодель с правильными отношениями.

+0

Владелец обычно является необязательным, но в этом случае нет, что более или менее вопрос. –

+0

Владелец доступен без проверки на ноль. Поэтому в этом случае он не является обязательным. –

Смежные вопросы