Исходный код
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;
end
procedure TreeView.Expand;
begin
Expanded := true;
if Parent <> nil then
Parent.Expand
end
Извлечение процедуры сделало очень простым превращение алгоритма в рекурсивный.