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


Автор: uwannadie 22.6.2009, 03:50
помогите разобраться с проблемкой
надо получить из такого:
http://img8.imageshack.us/i/56117202.jpg/
получить путь к листьям(фактически путь к файлу) и сохранить этот путь в файл
пробовал с помощью рекурсивного обхода дерева, но не получилось, т.к. не имел опыта работы с подобными компонентами.

Автор: vunder 22.6.2009, 08:12
Сначала получаешь указатель на выделенный элемент дерева через свойство Selected. Далее в цикле обращается к свойству Parent, пока оно не nil. Например вот так:
Код

function GetPath: String;
var
  Child: TTreeNode;
begin
  Child := TreeView1.Selected;
  Result := EmptyStr;
  while Assigned(Child) do begin
    Result := Child.Text+PathDelim+Result;
    Child := Child.Parent;
  end;
end;

Автор: uwannadie 22.6.2009, 16:15
проблему решил. все оказалось намного банальнее smile

вот исходный код (может кому пригодится):
получение пути к узлу(взято из DelphiWorld и модифицировано под данную задачу):
Код

function SrNodeTree(pTreeNode: TTreeNode; var sRuta: string): string; 
begin
  sRuta := pTreeNode.Text + '\' + sRuta;
  if pTreeNode.Level = 0 then
    Result := Copy(sRuta,0, Length(sRuta) - 1)
  else
    Result := SrNodeTree(pTreeNode.Parent, sRuta);
end;

сам поиск(сохраняет пути из дерева в файл с проверкой состояния выделения чекбоксов у листьев дерева):
Код

procedure TreeToFilePath(aTreeView: TJvCheckTreeView);
var
  sPath, Tmp,CH: String;
  i: integer;
begin
  AssignFile(Output, ExtractFilePath(Application.ExeName)+'\tree.txt');
  Rewrite(Output);
  for i := 0 to aTreeView.Items.Count - 1 do
  begin
    sPath := '';//путь к листу
    Tmp := '';//путь к родительским ветвям листа
    CH := '';//проверка состояния чекбоксов у листьев
    if aTreeView.Items.Item[i].HasChildren = False then
    begin
      if aTreeView.Checked[aTreeView.Items.Item[i]] = True then
        CH := 'CB_YES' else CH := 'CB_NO';
      sPath := '\' + SrNodeTree(aTreeView.Items[i], Tmp);
      Writeln(Output,CH,'|',sPath);
    end;
  end;
  CloseFile(Output);
end;

Автор: le0ne 19.11.2009, 17:35
Есть дерево построенное по результату процедуры БД в TTreeView,
Как определить последнего потомка каждого корня и добавить к ним новых потомков?

Пытался таким образом:
Код

Procedure TForm1.ExpandLevelWplace ;
var TreeNode : TTreeNode;
    i : integer;
Begin
     for i:= TVOrg.Items.Count-1 downto 0 do 
        TreeNode := ScanNodes(TVOrg.Items.Item[i]);
    TVOrg.Items.AddChild(TreeNode, 'Рабочие места');
end;

function TForm1.ScanNodes(Node: TTreeNode) : TTreeNode;
    begin
        Node := Node.GetFirstChild;
    while  Node <> nil  do begin
      if  Node.HasChildren  then
        ScanNodes(Node)
      else
      Node := Node.getNextSibling;
    end;
   
end;



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