Храните больше пользовательских данных в дереве узла в Delphi

TTreeView Delphi Компонент отображает иерархический список элементов узлы дерева. Узел представлен текстом узла и необязательным изображением. Каждый узел в древовидном представлении является экземпляром класса TTreeNode.

Хотя вы можете заполнить древовидное представление элементами во время разработки, используя Редактор элементов TreeViewв большинстве случаев вы заполняете свое древовидное представление во время выполнения - в зависимости от того, о чем ваше приложение.

Редактор элементов TreeView показывает, что есть только небольшая часть информации, которую вы можете «прикрепить» к узлу: текст и несколько индексов изображений (для нормального состояния, расширенного, выбранного и т. П.).

По сути, компонент древовидного представления легко программировать. Есть несколько способов добавить новые узлы в дерево и установить их иерархию.

Вот как добавить 10 узлов в древовидное представление (названное «TreeView1»). Обратите внимание, что свойство Items обеспечивает доступ ко всем узлам дерева. AddChild добавляет новый узел в древовидное представление. Первый параметр - это родительский узел (для построения иерархии), а второй параметр - это текст узла.

instagram viewer

AddChild возвращает недавно добавленный TTreeNode. В выше пример кодавсе 10 узлов добавляются как корневые узлы (не имеют родительского узла).

В любых более сложных ситуациях вы бы хотели, чтобы ваши узлы содержали больше информации - предпочтительно иметь некоторые специальные значения (свойства), специфичные для проекта, который вы разрабатываете.

Допустим, вы хотите отобразить данные позиции заказа клиента из вашей базы данных. У каждого клиента может быть больше заказов, и каждый заказ состоит из большего количества товаров. Это иерархическое отношение, которое можно отобразить в виде дерева:

В вашей базе данных будет больше информации для каждого заказа и для каждого элемента. В древовидном представлении отображается текущее состояние (только для чтения), и вы хотите просмотреть сведения о выбранном заказе (или даже о товаре).

Когда пользователь выбирает узел «Order_1_1», вы хотите, чтобы детали заказа (общая сумма, дата и т. Д.) Отображались пользователю.

В это время вы можете получить необходимые данные из базы данных, НО вам потребуется знать уникальный идентификатор (скажем, целочисленное значение) выбранного порядка, чтобы получить правильные данные.

Нам нужен способ сохранить этот идентификатор заказа вместе с узлом, но мы не можем использовать свойство Text. Пользовательское значение, которое мы должны хранить в каждом узле, является целым числом (просто пример).

В такой ситуации может возникнуть искушение искать свойство Tag (многие компоненты Delphi имеют), но свойство Tag не предоставляется классом TTreeNode.

Добавить пользовательские данные в узлы дерева: TreeNode. Свойство данных

Свойство Data узла дерева позволяет вам связать ваши пользовательские данные с узлом дерева. Данные это указатель и может указывать на объекты и записи. Отображение данных XML (RSS-канал) в TreeView показывает, как сохранить тип записи переменная в свойстве Data узла дерева.

Многие классы типов элементов предоставляют свойство Data - его можно использовать для хранения любого объекта вместе с элементом. Примером является TListItem компонента TListView. Вот как добавить объекты в свойство Data.

Добавление пользовательских данных в узлы дерева: TreeView. CreateNodeClass

Если вы не хотите использовать свойство Data в TTreeNode, а предпочитаете расширить собственный TreeNode с помощью нескольких свойств, Delphi также имеет решение.

Скажи, что хочешь быть в состоянии сделать

Вот как можно расширить стандартный TTreeNode несколькими собственными свойствами:

  1. Создайте свой TMyTreeNode, расширив TTreeNode.
  2. Добавьте в него строковое свойство MyProperty.
  3. Обработайте OnCreateNodeClass для древовидного представления, чтобы указать, что класс вашего узла должен быть создан.
  4. Предоставьте что-то вроде свойства TreeView1_SelectedNode на уровне формы. Это будет иметь тип TMyTreeNode.
  5. Обработайте OnChange представления дерева, чтобы записать в SelectedNode значение выбранного узла.
  6. Используйте TreeView1_Selected.myProperty для чтения или записи нового пользовательского значения.

Вот полный исходный код (TButton: «Button1» и TTreeView: «TreeView1» в форме):

На этот раз свойство Data класса TTreeNode не используется. Вместо этого вы расширяете класс TTreeNode, чтобы иметь собственную версию узла дерева: TMyTreeNode.

Используя событие OnCreateNodeClass представления дерева, вы создаете узел вашего пользовательского класса вместо стандартного класса TTreenode.

instagram story viewer