AsyncCall
1 つのパラメータを受け取るプロシージャを渡すことを想定しています。パラメータを渡したくない場合は、パラメータを追加して無視してください。
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
プロシージャはそれをレジスタから読み取りません。