Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.12.2018, 16:16   #1
PTyTb32
Форумчанин
 
Регистрация: 06.10.2013
Сообщений: 216
По умолчанию Построение в TreeView

Привет, имею некую таблицу с полями id, parent_id в ней указаны id категорий и id категории родителя (если родителя нет то там 0)
не получается из этой таблицы построить treeview, глубина вложенности не известна, в таблице элементы расположены на бум то есть table[0] не обязательно корневой, и для него родителем может быть любой из них. я пытался сделать так:

Код:
catID - массив с ID
catParentID - массив с Parent_ID

 for i:=0 to Length(catID)-1 do //цикл по всей таблице
    begin
      if catParentID[i]='0' then   // если элемент корневой
      tv2.Items.Add(nil,catID[i]); // добавляем в treeview
    end;

// тут получаем количество корневых элементов
    n:=0;
    node1:=tv2.Items[0];
    repeat
     node1:=node1.getNextSibling;
     inc(n);
    until
    node1=nil;
// в n лежит количество корневых элементов

    for q:=0 to length(catID)-1 do //по всем элементам
      for i:=0 to n-1 do //по всем корневым элементам
      begin
        if catParentID[q]=tv2.Items.Item[i].Text then //если очередной родительский элемент равен очередному родительскому элементу
        tv2.Items.AddChild(tv2.Items.Item[i],catID[q]); //добавляем элемент 
      end;
этот код правильно создает 1 уровень, и 2 уровень, и то во 2 уровень ничего не вкладывает
PTyTb32 вне форума Ответить с цитированием
Старый 05.12.2018, 17:35   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Код:
for i:=0 to Length(catID)-1 do //цикл по всей таблице
    begin
      if catParentID[i]='0' then   // если элемент корневой
      tv2.Items.Add(nil,catID[i]); // добавляем в treeview
    end; 
// итак ВСЕ корневые есть остались только потомки!!!

i:=0;
while i<tv2.Items.count // ОБЩЕЕ число элементов Tree на данный момент 
// по мере добавления оно (количество) будет меняться поэтому WHILE!!!
do begin
  t:=tv2.Items.Item[i]; // будем проверять ОДИН node(узел Tree) и без разницы какого он уровня 
  for q:=0 to ...//цикл по ВСЕЙ таблице 
  do begin
      if  t.... = catparentID[q]  then // (t)проверяемый в данный момент будет родительским для вот этого ...[q]
      begin
          tv2.AddChild(t, catID[q] ); // добавим в ЭТОТ(t) узел  ---вот общее число и изменилось НО! мы до него еще недобрались
     end;
  end; // уф-ф-ф! нашили и добавили всех его прямых потомков
  Inc(i);  // перейдем к следующему имеющемуся и НЕпросмтренному
end; // закончим
писано в блокноте.
Цитата:
catID - массив с ID
catParentID - массив с Parent_ID
Код:
type 
  myrec =record id, parentID: integer;

var
  cat: array of myrec; // ОДИН массив ...

cat[q].ID   // и ID, 
cat[q].parentID // и его родительский ID
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 05.12.2018 в 17:41.
evg_m на форуме Ответить с цитированием
Старый 06.12.2018, 07:58   #3
PTyTb32
Форумчанин
 
Регистрация: 06.10.2013
Сообщений: 216
По умолчанию

evg_m, Спасибо особенно за комментарии count меняется каждое добавление, я этого не учел((
PTyTb32 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ASP.NET C# компонент TreeView. Перетащить какой - либо пункт меню из TreeView в TextBox Claster ASP.NET 0 02.01.2013 18:59
Построение TreeView из XML maximumtf2 Общие вопросы Delphi 8 11.04.2012 00:30
Treeview и бд sisofcase БД в Delphi 8 03.04.2012 17:32
TreeView DB_User БД в Delphi 1 23.02.2010 19:09