传递的方法作为一个参数一个参数是没有问题的:传递一个方法的代码作为一个类型安全的方式
type
TSomething = class
Msg: string;
procedure Show;
end;
procedure TSomething.Show;
begin
ShowMessage(Msg);
end;
type TProc = procedure of object;
procedure Test(Proc: TProc);
begin
Proc;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Smth: TSomething;
begin
Smth:= TSomething.Create;
Smth.Msg:= 'Hello';
Test(Smth.Show);
end;
我需要一些有难度的 - 只传递一个方法的代码部分。我知道我可以做到这一点:
procedure Test2(Code: Pointer);
var
Smth: TSomething;
Meth: TMethod;
begin
Smth:= TSomething.Create;
Smth.Msg:= 'Hello Hack';
Meth.Data:= Smth;
Meth.Code:= Code;
TProc(Meth);
Smth.Free;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Test2(@TSomething.Show);
end;
但这是一个黑客和不安全 - 编译器无法检查方法的参数。
问题:是否有可能以类型安全的方式做同样的事情?
出于兴趣,你为什么要这样做?第一个代码示例中的直接方法看起来简单得多。 – Johan 2012-03-15 14:12:16
我希望我的标题编辑更清楚地表明,你没有做一些初学者会做的事情,这是一个非常深刻的黑客攻击。 – 2012-03-15 14:22:47
@Johan - 摆脱很多重复的代码 – kludg 2012-03-15 14:25:50