Небольшая, но полезная функция, думаю будет полезна многим, кто использует в своих программах разветвленные структуры данных и компонент TTreeView. У меня, правда, установлен TRzTreeView, но в данном случае разницы никакой не будет. Итак, у меня стоит задача поиска элемента по дереву. Использую я следующую функцию


function Search(Tree: TRzTreeView; Target: string): integer;
var
  Noddy: TTreeNode;
  Searching: boolean;
  I: Integer;
begin
   I := -1;
   Noddy := Tree.Items[0];
   Searching := true;
   while (Searching) and (Noddy <> nil) do
   begin
      if Noddy.Text = Target then
      begin
         Searching := false;
         Tree.Selected := Noddy;
         Tree.SetFocus;
      end
      else Noddy := Noddy.GetNext;
      Inc(I);
  end;
   result := I
end;

Здесь поиск происходит по всему дереву и функция возврещает порядковый номер элемента, начиная с самого корня. Если ничего не найдено, то функция вернет -1.
Иногда мне треуется искать не по всему дереву, а только на каком-нибудь определнном уровне. У узлов дерева TTreeNode есть свойство уровень Level, которое и определяет уровень вложенности узла. Модифицируем нашу функцию следующим образом.


function Search(Tree: TRzTreeView; Noddy: TTreeNode;
  Target: string): integer;
var
  Searching: boolean;
  I: Integer;
begin
   I := 0;
   Searching := true;
   while (Searching) and (Noddy <> nil) do
   begin
      if Noddy.Text = Target then
      begin
         Searching := false;
         Tree.Selected := Noddy;
         Tree.SetFocus;
      end
      else
      begin
         Noddy := Noddy.getNextSibling;
         inc(I)
      end;
   end;
   result := I
end;

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