Topic: Проблема TreeView с большим деревом

Коллеги, добрый день!
Подскажите как решить такую проблему: у меня есть таблица (каталог) с глубиной ветвления порядка 4х вложений. Количество строк 13600.
Если я настраиваю компонент TreeView на отображение дерева, то получаю ОЧЕНЬ долгий запуск приложения.
Как ускорить процесс построения дерева в компоненте? Или, может быть, есть другой способ?
Прикладываю sql файл для создания соответствующей таблицы БД с большим количеством строк

Post's attachments

Attachment icon FSNBv7.7z 211.43 kb, 55 downloads since 2023-10-25 

Re: Проблема TreeView с большим деревом

Компонент медленный, ничего не поделаешь.


Другие варианты:


1. Загружать по мере надобности. То есть сначала грузятся только узлы верхнего уровня. При клике на раскрытие узла подгружаются порция записей в дерево. Нужен скрипт для добавления записей в дерево.


2. Вместо компонента дерева (TdbTreeView) использовать компонент таблицы (TdbStringGridEx), загружать SQL-запросом, а вложенность эмулировать отступом (пробелами) в названии первой колонки. Также понадобится скрипты для сворачивания/разворачивания "узлов" путем изменения свойства видимости строк.

Визуальное программирование: блог и телеграм-канал.

Re: Проблема TreeView с большим деревом

k245 wrote:

Компонент медленный, ничего не поделаешь.


Другие варианты:


1. Загружать по мере надобности. То есть сначала грузятся только узлы верхнего уровня. При клике на раскрытие узла подгружаются порция записей в дерево. Нужен скрипт для добавления записей в дерево.


2. Вместо компонента дерева (TdbTreeView) использовать компонент таблицы (TdbStringGridEx), загружать SQL-запросом, а вложенность эмулировать отступом (пробелами) в названии первой колонки. Также понадобится скрипты для сворачивания/разворачивания "узлов" путем изменения свойства видимости строк.

Можете подсказать как через скрипт заполнять дерево? Основная проблема это задать id записей. До этого совсем уж костыли приходилось делать через скрытые столбцы...

Re: Проблема TreeView с большим деревом

indigen wrote:

Можете подсказать как через скрипт заполнять дерево? Основная проблема это задать id записей. До этого совсем уж костыли приходилось делать через скрытые столбцы...

Присвоить ID:


ATree.Row[tmpSubRow].ID := tmpID;

Вот пример кода.

 // рекурсивная процедура добавления дочерних контролов
  procedure AddControlOnTree( AControl:TWinControl; ARow: integer; );
  var
    j: integer;
    tmpSubRow: integer;
    tmpControl: TControl;
    tmpControlList: TStringList;
  begin
    // перед загрузкой в дерево сделаем сортировку
    tmpControlList := TStringList.Create;
    tmpControlList.Sorted := true;
    for j:=0 to  AControl.ControlCount - 1 do
    begin
      tmpControl := AControl.Controls[j];
      tmpControlList.AddObject( tmpControl.Name, tmpControl );
    end;
    // загрузка отсортированного списка
    for j:=0 to  tmpControlList.Count - 1 do
    begin
      tmpControl := TControl(tmpControlList.Objects[j]);
      ATree.AddChildRow( ARow, crLast );
      tmpSubRow := ATree.LastAddedRow;
      ATree.Row[tmpSubRow].ID := tmpID;
      inc(tmpID);
      ATree.Cells[0,tmpSubRow ] := tmpControl.Name;
      ATree.Cells[1,tmpSubRow ] := tmpControl.ClassName;
      ATree.Cells[2,tmpSubRow ] := GetControlCaption(tmpControl);
      // если у контрола есть дочерние, то загрузить их тоже
      if tmpControl is TWinControl then
        AddControlOnTree(TWinControl( tmpControl ), tmpSubRow );
    end;
    tmpControlList.Free;
  end;

Это часть процедуры procedure LoadObjectData ( ATree: TdbTreeView;); -  загрузить в дерево список контролов приложения

Полные исходники здесь: https://k245.ru/software-ru/clearapp.html

Визуальное программирование: блог и телеграм-канал.

5 (edited by sparrow 2023-10-26 17:20:13)

Re: Проблема TreeView с большим деревом

Можно и так попробовать
Пример

Post's attachments

Attachment icon tree-13600.zip 1.19 mb, 56 downloads since 2023-10-26 

Re: Проблема TreeView с большим деревом

sparrow wrote:

Можно и так попробовать
Пример

Какая прелесть!  Рекурсивные запросы, IN (SELECT...)  - и всё работает быстро. Возьму себе на вооружение вместо интервальных деревьев...

Визуальное программирование: блог и телеграм-канал.

7 (edited by sparrow 2023-10-27 22:09:24)

Re: Проблема TreeView с большим деревом

Очень интересная задачка с таким количеством записей (более 13 тыс.).
И варианты Константина подтолкнули меня  к попытке решить задачу SQL запросом.


Небольшой апдейт примера.
- Изменен запрос, что позволяет отображать полный родительский уровень текущей записи, все узлы.
   Более информативный вывод и более оперативное переключение.
- Изменен вид для отличия отображения узлов и конечных листьев.
- Добавлена возможность подсвечивания искомого слова в таблице. На мой взгляд актуально для больших текстов на экране.
- Исправлен выбор строки после раскрытия записи.

К сожалению, ввиду медлительности компонента (дерево строится долго) поиск затруднен. Но возможен



A very interesting problem with so many records (more than 13 thousand).
And Konstantin’s options pushed me to try to solve the problem with an SQL query.


A small update to the example.
- The query has been changed to allow displaying the full parent level of the current record, all nodes.
   More informative output and faster switching.
- Changed the view to differentiate the display of nodes and terminal leaves.
- Added the ability to highlight the searched word in the table. In my opinion, it is relevant for large texts on the screen.
- Fixed selecting a line after expanding a record.

Unfortunately, due to the slowness of the component (the tree takes a long time to build), the search is difficult. But it is possible.

Post's attachments

Attachment icon tree-13600 mod0.zip 1.27 mb, 60 downloads since 2023-10-28 

Re: Проблема TreeView с большим деревом

K245, Sparrow, я Вам очень благодарен за помощь!