Обход узлов и их дочерних элементов и изменение данных

Я использую список виртуальных деревьев для delphi 2009. Я создал дерево с такими данными, как:

type
  PTreeData = ^TTreeData;
  TTreeData = record
    FCaption: String;
    FPath: String;
  end;

Я хочу перебрать все элементы, но в определенном порядке. Мне нужно получить первый узел верхнего уровня, а затем перебрать все его дочерние элементы и изменить поле FPath. Когда я закончу с его дочерними элементами, я хочу получить еще один узел верхнего уровня и так далее.

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

Заранее благодарим за любые советы по этому поводу


person Jacek Kwiecień    schedule 05.03.2012    source источник
comment
Не подходит для этого конкретного вопроса, но см. Также метод IterateSubtree.   -  person Rob Kennedy    schedule 05.03.2012


Ответы (1)


Вот как перебирать узлы верхнего уровня. Обратите внимание (как оставил Смашер в своем комментарии), что при необходимости узлы инициализируются с использованием GetFirst и GetNextSibling, что может немного замедлить итерацию. Однако вы можете использовать функции GetFirstNoInit и GetNextNoInit (если у вас уже есть инициализированные узлы), и вы можете повысить производительность.

procedure TForm1.Button1Click(Sender: TObject);
var
  Data: PTreeData;
  Node: PVirtualNode;
begin
  Node := VirtualStringTree1.GetFirst;
  while Assigned(Node) do
  begin
    Data := VirtualStringTree1.GetNodeData(Node);
    // here you can access your data
    Node := VirtualStringTree1.GetNextSibling(Node);
  end;
end;
person TLama    schedule 05.03.2012
comment
Это почти работает :) Вместо GetNext мне нужно использовать GetNextSibling для итерации только по узлам верхнего уровня. Пожалуйста, исправьте это, чтобы я мог принять ваш ответ. И спасибо! :) - person Jacek Kwiecień; 05.03.2012
comment
Но, Яцек, в вашем вопросе прямо говорится, что вам нужно перебрать все узлы верхнего уровня и их дочерние элементы. - person Rob Kennedy; 05.03.2012