gab*_*abr 5 delphi anonymous-methods delphi-2009
以下代码(仅用于演示问题)构建并在Delphi 2010中工作.在Delphi 2009中,编译器失败并显示"E2035实际参数不足".
program Project50;
{$APPTYPE CONSOLE}
uses
SysUtils;
type
TMyProc = reference to procedure(param: integer);
var
a: TProc;
b: TMyProc;
begin
b := procedure (param: integer)
begin
end;
a := TProc(b); // <-- [DCC Error] Project50.dpr(19): E2035 Not enough actual parameters
end.
Run Code Online (Sandbox Code Playgroud)
我发现只有一个非常难看的黑客来解决这个问题(a:TProc绝对b).有没有人知道这个编译器缺陷的更好的解决方法?
[TProc字段实际上隐藏在可以存储各种'可执行'代码的记录中 - TProcedure,TMethod和TProc.Casting用于将特定的匿名proc存储到此字段中.]
我发现了一个技巧#2:
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils;
type
TMyProc = reference to procedure(param: integer);
var
a: TProc;
b: TMyProc;
begin
b := procedure (param: integer)
begin
Writeln('asdf');
end;
PPointer(@a)^ := PPointer(@b)^;
a;
readln;
end.
Run Code Online (Sandbox Code Playgroud)
我怀疑您想通过将 TMyProc (带参数参数)分配给 TProc (不带参数)来实现什么目的?
更新:黑客 #3(应该增加引用计数器,这个想法是从 System._IntfCopy 窃取的):
procedure AnonCopy(var Dest; const Source);
var
P: Pointer;
begin
P:= Pointer(Dest);
if Pointer(Source) <> nil
then IInterface(Source)._AddRef;
Pointer(Dest):= Pointer(Source);
if P <> nil then
IInterface(P)._Release;
end;
var
a: TProc;
b: TMyProc;
begin
b := procedure (param: integer)
begin
Writeln('asdf');
end;
AnonCopy(a, b);
// PPointer(@a)^ := PPointer(@b)^;
a;
readln;
end.
Run Code Online (Sandbox Code Playgroud)