AsyncCall
期望您将传递一个接收一个参数的过程。如果你不想传递参数,只需添加一个并忽略它。
procedure TestCalculation(IgnoreMe: Integer);
....
TestCall := AsyncCall(TestCalculation, 0);
您可以编写一个适配器来使调用者的代码更清晰:
type
TAsyncCallParameterlessProc = procedure of object;
function AsyncCall(Proc: TAsyncCallParameterlessProc): IAsyncCall; overload;
......
type
TAsyncCallParameterlessProcAdapter = class
private
FProc: TAsyncCallParameterlessProc;
public
constructor Create(Proc: TAsyncCallParameterlessProc);
procedure IntegerProc(IgnoreMe: Integer);
end;
{ TAsyncCallParameterlessProcAdapter }
constructor TAsyncCallParameterlessProcAdapter.Create(
Proc: TAsyncCallParameterlessProc);
begin
inherited Create;
FProc := Proc;
end;
procedure TAsyncCallParameterlessProcAdapter.IntegerProc(IgnoreMe: Integer);
begin
try
FProc;
finally
Free;
end;
end;
function AsyncCall(Proc: TAsyncCallParameterlessProc): IAsyncCall;
var
Adapter: TAsyncCallParameterlessProcAdapter;
begin
Adapter := TAsyncCallParameterlessProcAdapter.Create(Proc);
Result := AsyncCall(Adapter.IntegerProc, 0);
end;
使用该适配器,您问题中的代码将编译并工作。
由于 AsyncCalls 已停止使用,并且不会再次修改,因此您可以轻松地修改该代码以支持您想要的用法。
我个人会修改AsyncCalls
并添加另一个子类TInternalAsyncCall
来完成这项工作。
作为一个非常肮脏的黑客,这将起作用:
type
TAsyncCallParameterlessProc = procedure of object;
function AsyncCall(Proc: TAsyncCallParameterlessProc): IAsyncCall; overload;
.....
function AsyncCall(Proc: TAsyncCallParameterlessProc): IAsyncCall;
begin
Result := AsyncCall(TAsyncCallArgIntegerEvent(Proc), 0);
end;
TAsyncCallArgIntegerEvent
这依赖于整数参数在易失性寄存器中传递的事实。因此,当框架通过0
时,您的程序不会从寄存器中读取它。