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

В данной статье посмотрим на удаление данных из дерева, поддерживающего связку с базой данных. Мы уже удаляли один узел, там нужно было удалить всех детей узла, в базе и в дереве, и только потом удалить сам узел. В данном примере расширим функциональность, теперь удаление будет происходить для всех выделенных с Shift либо выделенных с Ctrl узлов.

33

32

Вариант №3 (Рабочий)

Этот алгоритм удаляет любые выделенные узлы дерева. Причем они могут быть выделены как при помощи Shift так и при помощи Ctrl, то есть в слитном либо раздельном порядке. Я выкладываю алгоритмы в обратном порядке, вариант 3 на данный момент последний рабочий. Не самый быстрый, но рабочий.

 

Вариант№2 (Промежуточный)

Тут не всё так тривиально как это обычно бывает с удалением. Мало того, что сначала нужно удалять всех детей узла, так ещё и функция TreeView.Selections[i] работает нетривиальным образом. И какое-то время я с ней экспериментировал. Суть в том, что в зависимости от того, в каком направлении мы выделили элементы дерева, вверх или вниз – порядок индексов в Selections[i] будет меняться.

Я стал искать минимальный элемент в Selections[i], и используя то, что при удалении элемента, индексы пересчитываются, то можно удалять элемент с одним и тем же индексом вплоть до SelectionCount. Конечный, рабочий вариант кода получился таким.

Это не быстрый алгоритм удаления. Но я и не гнался за скоростью. В данный момент я только разбираюсь с тем, как это вообще работает. Думаю, в будущем, возможно, напишу более быстрый вариант удаления, если не перескочу на VirtualStringView))

Вариант №1 (Медленный)

Здесь я использую ранее написанную функцию DeleteNode, её можно найти в первом посте серии DBTreeView своими руками. Здесь я каждый раз перед удалением, ищу узел по имени и удаляю его – это работает, но очень медленно.

Вспомогательно – поиск по имени (популярный код в интернете)

Вспомогательно – удаление одного узла

Вспомогательно – удаление записи из базы данных

 

by Stanislav_Panteleev