Выполните рефакторинг кода, чтобы он содержал два отдельных потока на основе параметра флага:
procedure TMyForm.DoSomething(list: TList<TMyObject>; const flag: boolean);
var
local: integer;
begin
if flag then
begin
//do something
//do something else
for i := 0 to Pred(list.Count) do
//do something
end
else
begin
local := ExpensiveFunctionCallThatCalculatesSomething;
//do something else
for i := 0 to Pred(list.Count) do
if list[i].IntValue > local then
//do something else
end;
end;
Это по существу повторяет ответ, данный neilwhitaker1 , но также проясняет, что инициализация локальной переменной должна быть перенесена в условную ветвь, то есть то, что обращается к предупреждение компилятора (которое выдается только в том случае, если переменная используется в ветви, где она не может быть инициализирована - в ветви, которая ее вообще не использует, такое предупреждение не выдается, а в ветви, где она используется, она наверняка быть инициализированным, и так как используется в одной ветви, вы также не получите подсказку "может не использоваться".
ПРИМЕЧАНИЕ: Если какие-либо "// что-то еще" являются общими для каждой ветви, они, конечно, могут быть преобразованы в локальные вложенные процедуры, чтобы избежать дублирования.
ТАКЖЕ ПРИМЕЧАНИЕ: В приведенном выше коде я исправил превышение индекса цикла в цикле for. :)