Delphi. Иерархические данные. DBTreeView своими руками. Динамическая подгрузка веточек

27

Идея динамической подгрузки веточек-узлов пришла ко мне, когда я стал добавлять по 500 узлов в узлы родители, и при загрузке дерева стала ощущаться задержка. Я так и представил разрастающиеся базы пользователей и эти долгие загрузки со всеми последствиями. Оно и понятно, ведь это обычное TreeView, которое содержит в себе данные, и эти данные загружаются в большом количестве.

Динамически опять же по разному можно подгружать. Есть вариант в +2 уровня узла. То есть, при каждом раскрытии дерева подгружается непосредственно раскрываемый узел, и узлы на следующем уровне. Выглядит логично, но в теории, если на втором уровне будет много данных – опять же может тормозить. Я остановился на относительно простом варианте – подгрузке одного узла.

Идея в том, чтобы в один момент времени подгружать 1 узел. А узлы следующего уровня создавать из 1 единственного узла – GhostNode – целью которого будет являться индикация того, что на след. уровне ещё что-то есть. При раскрытии следующего уровня, этот GhostNode удаляется и в раскрываемый узел загружаются нормальные данные. Таким образом, в один момент времени будут загружаться данные только одного узла.

Основная рабочая процедура, которая будет использоваться для загрузки одного уровня дерева, будет называться в моем коде ExpandingUpdate.

В отдельном датамодуле, я назвал его DMDB добавим FDQuery под названием qSelect

26

Далее, я сначала покажу, как будет использоваться процедура  ExpandingUpdate(Node: TTreeNode; TreeView: TTreeView), в основном модуле, прежде чем покажу саму процедуру.

Использование  ExpandingUpdate в MainForm

Добавляем в событие Expanding – теперь при каждом раскрытии будет вызываться наша процедура

 

Также, если создан механизм переподчинения узлов перетаскиванием, то и в DragDrop


Непосредственно процедура Expanding во вспомогательном модуле DMDB

Тестируем

29

 

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

30

 

Основной функционал работает. Остается доработать обработку ошибок, ну и оптимизировать, оптимизировать!

 

 

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