gpt4 book ai didi

delphi - 以类型安全的方式将方法的代码作为参数传递

转载 作者:行者123 更新时间:2023-12-03 15:04:54 30 4
gpt4 key购买 nike

将方法作为参数传递不是问题:

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;

但这是一种黑客行为并且不安全 - 编译器无法检查方法的参数。

问题:是否可以以类型安全的方式做同样的事情?

最佳答案

我终于明白了。通过类型检查,无需为调用事件声明变量!

type

TSomething = class
Msg: string;
procedure Show;
procedure ShowWithHeader(Header : String);
end;

TProc = procedure of object;
TStringMethod = procedure(S : String) of Object;

procedure TSomething.Show;
begin
ShowMessage(Msg);
end;

procedure TSomething.ShowWithHeader(Header: String);
begin
ShowMessage(Header + ' : ' + Msg);
end;

procedure Test2(Code: TProc);
var
Smth: TSomething;
begin
Smth:= TSomething.Create;
Smth.Msg:= 'Hello Hack 2';
TMethod(Code).Data := Smth;
Code;
Smth.Free;
end;

procedure Test3(Code: TStringMethod; S : String);
var
Smth: TSomething;
begin
Smth:= TSomething.Create;
Smth.Msg:= 'Hello Hack 3';
TMethod(Code).Data := Smth;
Code(S);
Smth.Free;
end;

procedure TForm4.btn1Click(Sender: TObject);
begin
Test2(TSomething(nil).Show);
// Test2(TSomething(nil).ShowWithHeader); // Cannot Compile
end;

procedure TForm4.btn2Click(Sender: TObject);
begin
// Test3(TSomething(nil).Show,'Hack Header'); // Cannot Compile
Test3(TSomething(nil).ShowWithHeader,'Hack Header');
end;

关于delphi - 以类型安全的方式将方法的代码作为参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9721396/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com