Я нашел взлом # 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.
Я сомневаюсь, чего вы пытаетесь достичь, назначая TMyProc (с аргументом param) для 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.