Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

TTreeView - список потомков узла. [D7, XP]


Wood ©   (2007-01-16 16:56:00) 

Добрый день. Помогите, плз, как узнать, к примеру, абсолютные индексы всех потомков одного корневого узла дерева. Как быстро перебрать все узлы всего дерева я знаю, а вот отдельного узла затрудняюсь.
Спасибо.


Wood   (2007-01-17 09:37:00) [1]

я сделал по другому, возможно есть недостаток:

Varendlev: boolean;
...
 endlev:=False;
    IfCurItem.Count=0 then
      begin
      List.Add(IntToStr(CurItem.AbsoluteIndex));
      end  else
        begin
         CurItem:= CurItem.GetNext;
          repeat
            ifCurItem= nil then endlev:=True else
              ifCurItem.Level=0 then endlev:=True else
              begin
               List.Add(IntToStr(CurItem.AbsoluteIndex));
               CurItem:= CurItem.GetNext;
              end;
          until(endlev=True);
        end;
...


Wood   (2007-01-17 09:30:00) [2]

спасибо, begin...end ©...!


begin...end   (2007-01-17 09:27:00) [3]

> Wood   (17.01.07 02:59) [7]

> Как остановиться?

Если у дочернего узла сыновей нет (GetFirstChild для него возвращает nil), значит, в этой "ветке" дальше делать нечего.

procedure ShowChilds(Node: TTreeNode);
var
 Child: TTreeNode;
begin
 Child := Node.GetFirstChild;
 while Assigned(Child) do
 begin
   ShowMessage(Child.Text);
   ShowChilds(Child);
   Child := Node.GetNextChild(Child)
 end;
end

Вызов: ShowChilds(TreeView.Selected).


Wood   (2007-01-17 02:59:00) [4]


> begin...end ©   (16.01.07 19:36) [6]

Допустим, рекурсия.... Как остановиться? Когда закончится проверка всего selected


begin...end   (2007-01-16 19:36:00) [5]

> Wood   (16.01.07 17:11) [2]
> Но мне надо узнать все дочерние узлы только выбранного (Selected)

TreeView.Selected.GetFirstChild/GetNextChild.

А если нужно знать не только "сыновей" выбранного узла, но и "внуков", "правнуков" и т.д., повторять то же самое для каждого найденного дочернего узла. Рекурсия, тоиссь.


Wood   (2007-01-16 18:51:00) [6]

Хорошо... если бы я знал как найти последний корневой узел в дереве, то можно было б осуществлять проверку: если последнй узел, то пока TTreeNode<> nil....


Wood   (2007-01-16 18:34:00) [7]

млин, еще опечатка не TTreeView.Selectedа TreeView.Selected
Ребят, как мне дойти от одного корневого узла до другого с проверкой всех дочерних, при этом еще не попасть в AV c CurItem=nil


Wood   (2007-01-16 17:13:00) [8]

Lis.Add(IntToStr(CurItem.AbsoluteIndex));
опечатка, прошу прощения... пишу прям здесь
List.Add, конечно...


Wood   (2007-01-16 17:11:00) [9]


> mfender ©   (16.01.07 17:02) [1]

нет, проблема в переборе... Видимо, я не понятно сформулировал вопрос. :(

К примеру,
перебираю все узлы дерева:

...
Var  CurItem: TTreeNode;
     List: TstringList;
begin
List:=TStringList.Create;
try
  CurItem:= TTreeView.Selected; // или TTreeView.Items.GetFirstNode; если    
                                            //начинаю перебор с первого узла
  while CurItem <> nil do
    begin
      Lis.Add(IntToStr(CurItem.AbsoluteIndex));
      CurItem:= CurItem.GetNext;
    end;
  finally
   List.Free;
  end;
end;

Но мне надо узнать все дочерние узлы только выбранного (Selected)


mfender   (2007-01-16 17:02:00) [10]

TTreeNone.AbsoluteIndex, очевидно.


Наверх

Титульная страница Поиск, карта сайта Написать письмо