delphi - 通过名称调用方法 Delphi 10 Firemonkey

标签 delphi call firemonkey procedure delphi-10-seattle

我正在尝试在 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 不会被调用。

我从以下链接的示例中获取了此代码: http://www.swissdelphicenter.ch/torry/showcode.php?id=799

最佳答案

MethodAddress 要求发布该方法,如示例代码中的方法。您的方法是私有(private)的。因此 MethodAddress 失败并返回 nil

通过发布方法来解决问题。

如果您希望使用未发布的方法执行此类任务,那么您将需要使用增强型 RTTI。

关于delphi - 通过名称调用方法 Delphi 10 Firemonkey,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36085168/

相关文章:

delphi - 为什么我的 TFrame "seeing"不是已发布的消息?

delphi - Delphi XE5 中的 Firemonkey。如何为托盘中的图标创建弹出菜单?

delphi - C++ Builder 和 chm 帮助文件

objective-c - 在文档加载时执行 Objective-C 方法

android - 如何使用 Delphi XE6 区分 Firemonkey TListView 项目上的 OnClick 和 Swipe

delphi - FMX Delphi 中任务栏后面显示的弹出菜单

delphi - 可以在delphi数据集中创建一个假数据字段吗?

c# - 使用 for 循环的实例号作为函数调用名称的一部分

javascript - 如何调用函数

delphi - 如何在单个表单上创建多个单选按钮组?