Исходный код
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Извлечение процедуры сделало очень простым превращение алгоритма в рекурсивный.