0

Is it possible to convert this:

program RangeLoop;

type
  TIndexedProc = reference to procedure(idx: Integer);

var
  i: Integer;
  p: TIndexedProc;

begin
  p := procedure(ix: Integer)
  var LocalVar: Integer;
  begin
    //Do some processing
  end;
  for i in [2..7] do p(i);
end.

into something like this:

program RangeLoop;

var
  i: Integer;

begin
  for i in [2..7] do procedure(ix: Integer)
  var LocalVar: Boolean;
  begin
    //Do some processing
  end;
end.

?

I know that the last code block is invalid.

0

1 Answer 1

1

In Delphi 10.3 and later, you can use an inline variable inside the loop to hold the anonymous procedure, eg:

program RangeLoop;

var
  i: Integer;

begin
  for i in [2..7] do
  begin
    var p := procedure(ix: Integer)
    begin
      //Do some processing
      var LocalVar := ...;
    end;
    p(i);
  end;
end.

Prior to 10.3, what you are asking for is simply not doable the way you want. Defining p above the loop is your best choice, unless you use a standalone procedure, eg:

program RangeLoop;

procedure p(ix: Integer);
var
  LocalVar: Integer;
begin
  //Do some processing
end;

var
  i: Integer;

begin
  for i in [2..7] do p(i);
end.

Or, if you can use TParallel.For() instead, if your loop iterations are thread-safe and not dependent on each other's results:

program RangeLoop;

uses
  System.Threading;

begin
  TParallel.For(2, 7, procedure(ix: Integer)
    begin
      //Do some processing
    end;
  );
end.
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.