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

33

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

Идея в том, чтобы собрать список “чекнутых” узлов, рекурсивно пройтись по базе, чтобы узнать есть ли у “чекнутых” узлов потомки и если есть – добавить их в список на удаление.

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

Алгоритм относительно быстро удаляет данные для 200-300 узлов – 1-2 секунды, для 500 узлов, в районе 7 секунд, если ветка раскрыта, если ветка закрыта, также за 1-2 секунды. На мой взгляд, для традиционного TreeView это приемлемо. Ну и в принципе, для большинства проектов.

33

34

Интерфейсная часть

IMPLEMENTATION

Connect – соединение с базой

ListParentAndAllChildren – добавляет в IDList соответствующие ID узла с NodeID и всех его потомков. Процедура рекурсивная.

ListAllChecked – проходит по всему дереву и собирает все узлы, отмеченные галочкой и их потомков IDList

DeleteNodesFromDB – удаление всех узлов из базы по списку из ID

DeleteNodesFromTree2 – удаление узлов из дерева

Execute потока

Вызов в основном потоке

Глобальные переменные

Вызов потока по кнопке

 

Скачать модуль uDeleteCheckedThread.pas

 

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