Delphi. Иерархические данные. DBTreeView своими руками. Рекурсивное удаление поддерева

25В связи с тем, что переделал алгоритм загрузки данных для дерева до динамического, пришлось переделать алгоритм удаления из базы. При динамической подгрузке в TreeView видны узлы лишь до уровня, открытого пользователем. Всё что глубже – просто не загружено. Поэтому как минимум не получается полного прохода по дереву или по узлу.

Пользователь выбирает узел и хочет его удалить. У этого узла возможно есть дети, у которых свои дети и так далее. Чтобы удалить всё поддерево, я придумал следующий способ.

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

На втором шаге происходит удаление записей поддерева из базы.

На третьем шаге удаляются узел и всего его потомки непосредственно из TreeView. Вот, что у меня получилось на уровне кода. Здесь только идея, без всемозможных защит и обработки ошибок.

В отдельном датамодуле – вспомогательные процедуры

Объявляем поле и свойство для хранения ID узлов для удаления в отдельном датамодуле

Выделяем память и указываем ссылку на выделенную область памяти

Ищем рекурсивно всех потомков и записываем их в FIDList:TstringList;

Создаем FDQuery под именем qDelete

21

Удаляем из базы

В модуле, где находится TreeView

Объявляем глобальную переменную

Создаем её в OnCreate или OnShow (На FormClose, надо соответственно удалить её)

Далее, непосредственно удаление

Вешаем обработку на кнопку DeleteSubTree

Тестируем

22

Я добавил в Folder2 500 узлов и нажал на DeleteSubtree, в результате Folder2 успешно удалилась и достаточно быстро. Не стал измерять производительность, но этот алгоритм должен работать быстрее. По первым впечатлениям – так и есть.

23

24

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