Dus, versie 1 doet botweg wat jij doet, volgens mij: Ik maak 3 procedures die allemaal i tonen. Het resultaat: 3 keer de message "3" (waarde van i na de lus):
Delphi Code:
procedure Versie1;
const
MaxProcs = 3;
var
procs: array[0..MaxProcs-1] of TProc;
proc: TProc;
i: Integer;
begin
i := 0;
while i < MaxProcs do
begin
procs[i] :=
procedure
begin
ShowMessage(i.ToString);
end;
Inc(i);
end;
for proc in procs do
proc();
end;
Versie 2, met een direct aangeroepen anonieme wrapper functie, die zijn parameter, i, kopieert in de vorm van de parameter value, en een procedure teruggeeft die niet i, maar value toont. Het resultaat: messages met de waardes 0 t/m 2:
Delphi Code:
procedure Versie2;
const
MaxProcs = 3;
var
procs: array[0..MaxProcs-1] of TProc;
proc: TProc;
i: Integer;
begin
i := 0;
while i < MaxProcs do
begin
procs[i] := (function(value: Integer): TProc
begin
Result :=
procedure
begin
ShowMessage(value.ToString);
end;
end)(i);
Inc(i);
end;
for proc in procs do
proc();
end;
Hier zit wel een aanname in. Dit werkt met integers, maar jij met objecten waarvoor het niet per se hetzelfde zou hoeven te zijn...
Bookmarks