Если действительно нужно использовать локальные процедуры в D7 или более ранних версиях, можно использовать этот трюк:
procedure GlobalProc;
var t,maxx:integer; itr,flag1,flag2:boolean; iterat10n:pointer;
//Local procs:
procedure iterat10n_01;begin {code #1 here} end;
procedure iterat10n_10;begin {code #2 here} end;
procedure iterat10n_11;begin {code #1+#2 here} end;
begin
//...
t:=ord(flag2)*$10 or ord(flag1);
if t=$11 then iterat10n:=@iterat10n_11
else if t=$10 then iterat10n:=@iterat10n_10
else if t=$01 then iterat10n:=@iterat10n_01
else iterat10n:=nil;
itr:=(iterat10n<>nil);
//...
for t:=1 to maxx do begin
//...
if(itr)then asm
push ebp;
call iterat10n;
pop ecx;
end;
//...
end;
//...
end;
Однако проблема в том, что адресные регистры могут различаться на разных машинах - поэтому необходимо написатькод с использованием локального вызова proc и просмотр через точку останова, какие регистры там используются ...
И да - в большинстве реальных производственных случаев этот трюк является просто своего рода паллиативным.