Захват переменной в анонимной процедуре

wsnet
Дата: 06.06.2019 08:46:53
Коллеги, как вернуть значение переменной.

procedure CallActionFrm(var id: Integer);
var
  AfrmBaseDictionaryList: TfrmBaseDictionaryList;
begin
  with TfrmBaseDictionaryList.Create(UniApplication) do
  begin
    ShowModal(
      procedure(Sender: TComponent; AResult: Integer)
      begin
        if AResult = mrOk then
        begin
          id := 100;
        end;
      end
      );
  end;
end;


Ошибка - E2555 Cannot capture symbol 'id'

Как обойти?
X-Cite
Дата: 06.06.2019 09:35:48
Присвоить ее локальной. Захватить локальную. Потом по выходу локальную опять присвоить в var параметр.
var и иногда const не захватываются.
wsnet
Дата: 06.06.2019 09:43:03
X-Cite, делаю, не получается:

procedure CallActionFrm2(var I: integer);
var
  AfrmBaseDictionaryList: TfrmBaseDictionaryList;
  tmp: Integer;
begin
  tmp := I;
  with TfrmBaseDictionaryList.Create(UniApplication) do
  begin
    ShowModal(
      procedure(Sender: TComponent; AResult: Integer)
      begin
        if AResult = mrOk then
        begin
          tmp := 100;
        end;
      end
      );
    I := tmp;
  end;
end;

...

procedure TfrmAdmPlanItem.btnSearchClick(Sender: TObject);
var
  id: Integer;
begin
  id := 1;
  CallActionFrm2(id);
  edtInn.Text := IntToStr(id); // получаю id = 1, а не 100!
end;
X-Cite
Дата: 06.06.2019 10:09:54
А вы сделайте
if AResult = mrOk then
  tmp := 100
else
  tmp := 200;

Вангую что вернется 200
wsnet
Дата: 06.06.2019 10:54:36
X-Cite
А вы сделайте
if AResult = mrOk then
  tmp := 100
else
  tmp := 200;

Вангую что вернется 200


procedure CallActionFrm2(var I: integer);
var
  AfrmBaseDictionaryList: TfrmBaseDictionaryList;
  tmp: Integer;
begin
  tmp := I;
  with TfrmBaseDictionaryList.Create(UniApplication) do
  begin
    ShowModal(
      procedure(Sender: TComponent; AResult: Integer)
      begin
        if AResult = mrOk then
        begin
          tmp := 100;
        end
        else
          tmp := 200;
      end
      );
    I := tmp;
  end;
end;

...

procedure TfrmAdmPlanItem.btnSearchClick(Sender: TObject);
var
  id: Integer;
begin
  id := 1;
  CallActionFrm2(id);
  edtInn.Text := IntToStr(id); // Возвращает 1!
end;
Kazantsev Alexey
Дата: 06.06.2019 11:08:50
wsnet,

А так не сработает?
PInteger(@id)^ := 100;
wsnet
Дата: 06.06.2019 12:30:03
Kazantsev Alexey
wsnet,

А так не сработает?
PInteger(@id)^ := 100;


Тоже самое

procedure CallActionFrm2(var I: integer);
var
  AfrmBaseDictionaryList: TfrmBaseDictionaryList;
  tmp: Integer;
  PInteger: ^Integer;
begin
  PInteger := @I;
  with TfrmBaseDictionaryList.Create(UniApplication) do
  begin
    ShowModal(
      procedure(Sender: TComponent; AResult: Integer)
      begin
        if AResult = mrOk then
        begin
          PInteger^ := 100; //id = 1!
          ShowMessage('test');
        end
        else
          PInteger^ := 200;
      end
      );
  end;
end;
alekcvp
Дата: 06.06.2019 12:49:49
wsnet,

А отладчик на строке "I := tmp;" какое значение tmp показывает?
alekcvp
Дата: 06.06.2019 12:52:40
В 10.2 вот этот код работает корректно:

type
  TPR = reference to procedure;

procedure Test2(PR: TPR);
begin
  PR();
end;

procedure Test(var Id: Integer);
var
  Idd: Integer;
begin
  Idd := Id;
  Test2(procedure
    begin
      Idd := 200;
    end);
  Id := Idd;
end;

var
  Id: Integer;
begin
  try
    Id := 1;
    WriteLn(Id);
    Test(Id);
    WriteLn(Id);
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  ReadLn;
end.

А у вас?
X-Cite
Дата: 06.06.2019 14:16:42
А анонимная функция вызывается? Вангую, что нет.