按名称调用方法 Delphi 10 Firemonkey
Calling method by name Delphi 10 Firemonkey
我正在尝试在 firemonkey 项目中按名称调用方法。但到目前为止还没有运气。
下面是我的代码:
type
TExecute = procedure of object;
TUpdates= class(TDataModule)
procedure UpdateToVersion(Version: Integer);
private
procedure UpdateToVersion1;
procedure UpdateToVersion2;
procedure UpdateToVersion3;
procedure Call(Name: string);
public
end;
procedure TUpdates.Call(Name: String);
var
m:TMethod;
Exe:TExecute;
begin
m.Data := pointer(Self);
m.Code := Self.MethodAddress(Name);
Exe := TExecute(m);
Exe;
end;
procedure TUpdates.UpdateToVersion(Version: Integer);
begin
Call('UpdateToVersion'+version.ToString);
end;
procedure TUpdates.UpdateToVersion1;
begin
//code
end;
procedure TUpdates.UpdateToVersion2;
begin
//code
end;
procedure TUpdates.UpdateToVersion3;
begin
//code
end;
结果:
例如,当我调用 UpdateToVersion(1) 时,我遇到访问冲突并且过程 UpdateToVersion1 没有被调用。
我从下面 link 的一个例子中得到了这段代码:
http://www.swissdelphicenter.ch/torry/showcode.php?id=799
MethodAddress
要求方法已发布,示例代码中的方法也是如此。你的方法是私有的。因此 MethodAddress
失败并且 returns nil
。
通过发布方法解决问题。
如果您希望使用未发布的方法执行此类任务,则需要使用增强型 RTTI。
我正在尝试在 firemonkey 项目中按名称调用方法。但到目前为止还没有运气。
下面是我的代码:
type
TExecute = procedure of object;
TUpdates= class(TDataModule)
procedure UpdateToVersion(Version: Integer);
private
procedure UpdateToVersion1;
procedure UpdateToVersion2;
procedure UpdateToVersion3;
procedure Call(Name: string);
public
end;
procedure TUpdates.Call(Name: String);
var
m:TMethod;
Exe:TExecute;
begin
m.Data := pointer(Self);
m.Code := Self.MethodAddress(Name);
Exe := TExecute(m);
Exe;
end;
procedure TUpdates.UpdateToVersion(Version: Integer);
begin
Call('UpdateToVersion'+version.ToString);
end;
procedure TUpdates.UpdateToVersion1;
begin
//code
end;
procedure TUpdates.UpdateToVersion2;
begin
//code
end;
procedure TUpdates.UpdateToVersion3;
begin
//code
end;
结果: 例如,当我调用 UpdateToVersion(1) 时,我遇到访问冲突并且过程 UpdateToVersion1 没有被调用。
我从下面 link 的一个例子中得到了这段代码: http://www.swissdelphicenter.ch/torry/showcode.php?id=799
MethodAddress
要求方法已发布,示例代码中的方法也是如此。你的方法是私有的。因此 MethodAddress
失败并且 returns nil
。
通过发布方法解决问题。
如果您希望使用未发布的方法执行此类任务,则需要使用增强型 RTTI。