AsyncCalls AsyncCallEx E2036需要变量

时间:2017-04-02 09:46:49

标签: delphi

Delphi 10.1 Berlin

我无法理解为什么我会收到错误。

编译时我收到错误消息(而TestRec是简单函数 - 一切正常):

type
  TData = record
    Value: string;
  end;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    function TestRec(var Data: TData): Integer;
  end;

...

function TForm1.TestRec(var Data: TData): Integer;
begin
  Data.Value := 'TestOut';

  Result := 0;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  MyData: TData;

  a: IAsyncCall;
begin
  MyData.Value := 'TestIn';

  a := AsyncCallEx(@TestRec, MyData); //[dcc32 Error] Unit1.pas(47): E2036 Variable required
end;

错误显示: [dcc32错误] Unit1.pas(47):E2036需要变量

2 个答案:

答案 0 :(得分:3)

接受方法的重载print(a)的签名是:

AsyncCallEx()

在通话中引用该方法的正确方法是:

function AsyncCallEx(Method: TAsyncCallArgRecordMethod; var Arg{: TRecordType}): IAsyncCall;

由于方法的方法声明是:

a := AsyncCallEx(TestRec, MyData);

您必须从TAsyncCallArgRecordMethod = function(var Arg{: TRecordType}): integer of object; 中的方法参数中删除数据类型。

TestRec

function TestRec(var Data{: TData}): Integer; 来自图书馆AsyncCalls

答案 1 :(得分:-1)

更正示例代码,然后转到@LU RD:

type
  TData = record
    Value: string;
  end;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    MyData: TData; //Global variable

    procedure {function} TestRec(var Data){: Integer}; //procedure or function
  end;

...

uses AsyncCalls;

...

procedure {function} TForm1.TestRec(var Data){: Integer}; //untyped parameters
begin
  TData(Data).Value := 'TestOut'; //cast to type

  //Result := 0;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  a: IAsyncCall;
begin
  MyData.Value := 'TestIn';

  a := AsyncCallEx(TestRec, MyData); //without @ !!!
end;