2017-04-02 40 views
0

德爾福10.1柏林AsyncCalls AsyncCallEx E2036變量所需

我無法理解爲什麼我收到錯誤。

我得到當編譯該錯誤消息(而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變量所需

+0

@TestRec是不變量,但是邁德特是。考慮到您顯示的代碼和錯誤消息,這沒什麼意義。你確定你已經正確地轉錄了東西。控制檯應用程序中的一個簡單的MCVE將消除疑問。 –

+0

@DavidHeffernan,參見我的[鏈接](https://github.com/ahausladen/AsyncCalls/blob/master/DOCUMENTATION.md)庫文檔。在'AsyncCallEx'的例子中,通過這種方式調用普通函數。 –

+0

@LURD提問者提供了來自該鏈接的示例代碼,並報告似乎不可信的錯誤消息,不是? –

回答

3

用於重載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; 

AsyncCallEx是從庫AsyncCalls

+0

@LU RD,非常感謝你,你是對的! –

-1

正確示例代碼,thahk到@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;