Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Обход дерева


Автор: AleksandraN 21.8.2009, 12:18
Всем, добрый день!
Проблема в следующем: необходимо развернуть дерево до определенного (заданного) узла (задан даже не узел а значение в узле) 
делаю так
Код

procedure TfrmSCREdit.ExpandTree( selectedData: integer);
var
 Node : TTreeNode;
 i, s: integer;
begin
// поиск значение в дереве
  Node := tvwSCR.Items.GetFirstNode; { tvwSCR - заданное дерево}
  Node := Node.GetNext;                       {selectedData - значение, которое необходимо найти в дереве}
    While Node <> nil do
     begin
      s := Integer(Node.Data);
      If Integer(Node.Data) = selectedData then
        Node.Selected := true
      else Node.Selected := false;
      Node := Node.GetNext;
     end;
// раскрытие дерева
  Node.Expanded:=true;
  i := Node.Level;
  while i >0 do
  begin
    Node := Node.Parent;
    Node.Expanded := true;
    i:= i-1;
  end;
end;

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

Автор: Keeper89 21.8.2009, 12:38
Попробуйте:
Код

procedure TfrmSCREdit.ExpandTree( selectedData: integer);
var
 Node : TTreeNode;
 i, s: integer;
begin
// поиск значение в дереве
  Node := tvwSCR.Items.GetFirstNode; { tvwSCR - заданное дерево}
                {selectedData - значение, которое необходимо найти в дереве}
    While (Node <> nil) and (Integer(Node.Data) <> selectedData) do
     begin
       Node.Expand(False);         
       Node := Node.GetNext;
     end;
  Node.Selected := true
end;

Автор: AleksandraN 21.8.2009, 13:30
я видимо не точно сформулировала...надо что раскрывалась, только та ветка, на которой находится узел с заданным значением...ну и не всся, а только до этого узла...

Автор: AleksandraN 21.8.2009, 14:33
В общем получилось у меня)) 
Сделала так:
Код

procedure TfrmSCREdit.ExpandTree( selectedData, level: integer);
var
   Node : TTreeNode;
   i, s: integer;
begin
   i := 0;
   tvwSCR.Visible := false;
   tvwSCR.FullExpand;
   While (Node = nil) and (i < tvwSCR.Items.Count) do
    begin
      if (integer(tvwSCR.Items[i].Data) = selectedData) then Node := tvwSCR.Items[i];
      i := i + 1;
    end;
   tvwSCR.FullCollapse; {если так не делать не очень красиво получается, оно дергается , а так получается приятно для глаза}
   if (Node <> nil) then
    begin
      i := Node.Level;
      Node.Selected := true;
      while i > 0 do
       begin
         Node := Node.Parent;
         Node.Expanded := true;
         i:= i-1;
      end;
    end;
   tvwSCR.Visible := true;
end;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)