Topic: Сортировка по узлу TreeView

Приветствую всех!
Товарищи, подскажите как штатными средствами программы реализовать = при выборе узла в TreeView, хочу видеть в гриде все дочерние записи всех скрытых элементов выделенного узла?

2 (edited by k245 2022-12-03 12:25:35)

Re: Сортировка по узлу TreeView

Вы задачу уточните. А то непонятно: узел выделяете в TreeView, в каком-то гриде хотите видеть все скрытые элементы выделенного узла...


Дочерние записи бывают 1) конкретного узла. 2) конкретного узла и все вложенные. 
Скрытые элементы бывают  1) свёрнутые дочерние элементы  2) visible = false


P.S. А тема вообще про сортировку.... вы уж определитесь ))))

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

Re: Сортировка по узлу TreeView

Если Вас не затруднит, ознакомьтесь с примером... Мне хотелось бы, что бы при выделении узла "велосипеды" в "дереве", в таблгрид1 от сортировались и 2х и 3х колесные...

Post's attachments

Attachment icon Новая папка (2).rar 293.17 kb, 115 downloads since 2022-12-03 

Re: Сортировка по узлу TreeView

Привет,

Это помогает?

Post's attachments

Attachment icon treeview and tablegrid.zip 337.94 kb, 115 downloads since 2022-12-03 

Re: Сортировка по узлу TreeView

По хорошему для такой задачи нужны интервальные деревья, но поскольку в MVDB их нет, то подойдёт SQL-запрос и процедура, которая возвращает список ID для конечных дочерних узлов (листьев) заданного узла дерева:


function GetSQLIDs( ARow:integer ):string;
// возвращает список ID для всех его дочерних элементов, являющихся конечными элементвми дерева
var
  tmpChildCount: integer;
  tmpRow: integer;
begin
  Result := '';
  if ARow <> -1 then
  begin
    if Form1.TreeView1.HasChildren( ARow ) then
    begin
      tmpRow := Form1.TreeView1.GetFirstChild( ARow );
      repeat
        if Result <> '' then
          Result := Result + ',';
        Result := Result + GetSQLIDs( tmpRow );
        tmpRow := Form1.TreeView1.GetNextSibling( tmpRow );
      until tmpRow = -1;
    end
    else
      Result := IntToStr( Form1.TreeView1.dbIndexToID( ARow ) );
  end;
end;

procedure Form1_Button1_OnClick (Sender: TObject; var Cancel: boolean);
begin
// ShowMessage( GetSQLIDs( Form1.TreeView1.SelectedRow ) );
  Form1.Button1.dbSQL := 'SELECT name FROM test WHERE id_testtree in ('+GetSQLIDs( Form1.TreeView1.SelectedRow )+')';
end;

Пример будет работать для любой конфигурации дерева, при относительно небольшом числе узлов (каком именно - сказать затрудняюсь. Думаю, это будет зависеть от СУБД).

Post's attachments

Attachment icon Листья.rar 294.96 kb, 117 downloads since 2022-12-04 

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

Re: Сортировка по узлу TreeView

Решение SQLite рекурсивным запросом.

Post's attachments

Attachment icon Листья рекур SQLITE.zip 335.98 kb, 126 downloads since 2022-12-07 

Re: Сортировка по узлу TreeView

sparrow wrote:

Решение SQLite рекурсивным запросом.

Лучшее решение! 

Если не ошибаюсь, в MySQL начиная с версии 8.х тоже есть поддержка рекурсивных запросов.

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

Re: Сортировка по узлу TreeView

k245, sparrow, derek, огромное спасибо за участие и потраченное время! Все решения по своему интересны и помогают людям с недостаточным объемом знаний. Благодарю вас!

k245, sparrow, derek, thank you so much for your participation and time spent! All solutions are interesting in their own way and help people with insufficient knowledge. Thank you!