Исходный код
if currIndex=2 then begin
    // разкрываем выделенные узлы
    TreeView_U.Items[r].Expanded:=true;
    if TreeView_U.Items[r].Parent <> nil then begin
        TreeView_U.Items[r].Parent.Expanded:=true;
        if TreeView_U.Items[r].Parent.Parent <> nil then begin
            TreeView_U.Items[r].Parent.Parent.Expanded:=true;
            if TreeView_U.Items[r].Parent.Parent.Parent <> nil then
                TreeView_U.Items[r].Parent.Parent.Parent.Expanded:=true;
    end
endЧто не так в исходном коде
Рекурсивный по сути алгоритм реализован в виде линейного кода.
Здесь также присутствует запах «завистливый метод», который слишком много знает о внутреннем устройстве узла дерева. Устранять его следует с помощью извлечения метода.
Вариант рефакторинга исходного кода
if currIndex=2 then begin
    TreeView_U.Items[r].Expand;
endprocedure TreeView.Expand;
begin
  Expanded := true;
  if Parent <> nil then
    Parent.Expand
endИзвлечение процедуры сделало очень простым превращение алгоритма в рекурсивный.