Отказ от ответственности : лично я никогда бы не использовал этот код и никогда не мог рекомендовать или оправдывать его использование.
Сделай так:
procedure Test2(Method: TProc);
var
Smth: TSomething;
begin
Smth:= TSomething.Create;
Smth.Msg:= 'Hello Hack';
TMethod(Method).Data:= Smth;
Method();
end;
Конечно, это все еще небезопасно, так как будет работать, только если то, что вы положили в Data
, действительно совместимо с методом.
Сергей спрашивает:
Как вы будете называть свой Test2 без создания фиктивного экземпляра TSomething?
Полагаю, вы можете сделать это следующим образом для статических (то есть не виртуальных и не динамических) методов:
var
Obj: TSomething;
....
Test2(Obj.Show);//no need to actually create Obj
Конечно, все это иллюстрирует, какой это гротескный хак. Я думаю, что это не лучше, чем версия в вашем вопросе. Там нет реального чистого способа сделать то, что вы просите.
Я подозреваю, что правильным способом решения вашей реальной проблемы было бы использование RTTI для вызова метода.