Delphi. Иерархические данные. DBTreeView своими руками. Просмотр, добавление, редактирование, удаление узлов.

Встала задача построить дерево, связанное с базой данных, поддерживающее отображение иерархической структуры базы данных – какой-то конкретной иерархической таблицы. Например, отделы и сотрудники, содержащиеся в одной таблице – с колонкой idParent. Также нужны операции вставки новой записи в базу и в дерево и каскадное удаление – при удалении узла – удаляются все его дети. Готовых компонентов практически нет – из них ehLib и DevExpress, но это следующий шаг моего развития. В порядке тренировки решил попробовать решить задачу своими силами. В книге Дмитрия Осипова про базы данных. в принципе почти всё расписано – как и что нужно сделать, я повторил его пример, но нашёл там одну ошибку из за которой у меня выскакивало сообщение Invalid Pointer Operation, поправив которую – я получил то, что хотел. Вот что у меня получилось.

1

7

2

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

Подключение по FireDAC, БД MySQL.

Начнем!

Начать предлагаю с базы данных,в MySQL WorkBench я создал всего 1 таблицу, в принципе, для примера её вполне достаточно.

3

После создания базы из модели у меня получилось следующее. Базу желательно пока оставить пустой, это на картинке она у меня спустя некоторое время после создания. Это связано с алгоритмом сбора записей из базы, который мы опишем далее. Но если кратко, суть в том, что для правильной работы алгоритма все дети своих родителей должны быть с большим id нежели у родителя, если нарушить этот порядок в ручную – алгоритм будет работать некорректно. Но если заводить всё из интерфейса, то этот порядок будет соблюдаться автоматически, так как невозможно добавить ребенка без создания родителя.

4

Создание интерфейса

Создадим приложение VCL и добавим на него следующие элементы

5

Кнопка Selected здесь совершенно случайно, можете её не добавлять. Просто мне было лениво её убирать))) Я экспериментировал с установкой фокуса. Весь основной код по созданию подключения, алгоритмам добавления, редактирования, удаления узлов я перенес в отдельный датамодуль.

6

Вот какой код у нас в компонентах FDQuery

12

13

14

15

16

Код дата модуля

Код MainUnit

Тестируем

Добавление записи.

7

 

Редактирование записи

8

 

Удаление узла (Удалим Root – удалится всё)

9

 

Вставим новую запись и обновим

10

Основные функции работают. Проверим, что у нас в таблице базы данных

11


 

 

Исходники

Скачать файлы проекта

Скачать дамп базы данных (MySQL)

 

This entry was posted in Delphi, Без рубрики. Bookmark the permalink.