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

В данной статье код вырезки узлов, выделенных галочками и вставка в Selected узел. Все происходит из отдельного потока, так как процесс может затянуться. Работа состоит из 2-х частей – обновление в базе и обновление в самом дереве. После копирования и вставки, выделенные записи удаляются, поскольку у нас процедура “Вырезать и вставить”.

Что касается сбора записей по выделенным узлам, то они ищутся рекурсивно при помощи процедуры ListParentAndAllChildren(NodeID:Integer) и собираются в единый список при помощи процедуры ListAllChecked.

Копирование и вставка новых записей в базе производится при помощи процедуры CopyRecordInDB. 

После вставки новых записей происходит их переструктурирование в соответствии с той структурой, откуда они были скопированы.

Далее – обновление узла, в который мы вставили новые элементы. Этому посвящена процедура UpdateNodeInTree.

Ну и последний шаг, поскольку у нас было вырезание узлов, то нужно удалить отмеченные узлы из базы при помои процедуры DeleteNodesFromDB(IDListChecked:TStringlist) и из дерева при помощи процедуры DeleteNodesFromTree.

Код рабочий, но я не проверял его на утечки памяти, не делал нагрузочные тесты. В принципе, всегда можно оптимизировать или написать по-своему. Для меня, в процессе изучения темы DBtreeView было важно от чего-то оттолкнуться. Мне попались хорошие книги Дмитрия Осипова, где была важная информация, которая помогла мне двигаться дальше. 

Код модуля CutAndPasteThread

Вызов в главном потоке

Создается глобальная переменная

На любой кнопке запускается поток

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

This entry was posted in Delphi, Деревья. Bookmark the permalink.