首页 > 解决方案 > 如何将方法函数传递给另一个对象?

问题描述

如何将方法函数传递给另一个对象?在德尔福有这样的可能吗?

例如,我试图在 DataModule 中创建一个 PopupMenu,因为此 PopupMenu 将在应用程序的多个位置使用。

PopupMenu 将使用一个特定的函数,例如:GetCustomer()它返回TCustomer,可以在其上执行各种操作。

创建和使用 DataModule 的每个 Form/Frame 都希望向其传递GetCustomer().

我想写这样的东西:

TGetCustomerFunc = function: TCustomer of object;

然后在 DataModule 上创建一个字段/属性:

TPopupDataModule = class(TDataModule)
public
  { Public declarations }
  GetCustomer: TGetCustomerFunc;
end;

GetCustomer将由创建 的每个框架分配一个方法PopupDataModule,并具有自己的特定实现。

但是,function: TCustomer of object;不是有效的语法。

关于如何解决这个问题的任何建议?

标签: oopdelphi

解决方案


您最初的问题:如何将方法函数传递给另一个对象?

您可以为您的函数或过程原型声明一个类型,然后像传递任何其他变量一样传递它。查看TNotifyEvent整个 RTL、VCL 和 FMX 的使用示例,了解如何做到这一点。

这样的事情可能吗?是的。

我不清楚你的用例到底是什么,所以我不确定给你最好的例子。您说您想使用 aTDataModule创建 a TPopupMenu,这似乎很清楚,但是您随后声明TCustomer需要由TFrameTForm调用它的对象提供。

为什么不直接将TCustomer对象传递给它?传递一个函数来获取一个对象似乎有点令人费解。

如果我明白你在找什么,你会想要这样的东西:

interface

  type
  TCustomer = class(TObject);
  TGetCustomerFunc = function(): TCustomer of Object;

  TPopupDataModule = class(TDataModule)
  public
    function BuildPopupMenu(fnGetCustomer: TGetCustomerFunc): TPopupMenu;
    ...
  end;

implementation

  function TPopupDataModule.BuildPopupMenu(fnGetCustomer: TGetCustomerFunc): TPopupMenu;
  var
    pCustomer: TCustomer;
  begin
    if(Assigned(fnGetCustomer)) then
    begin
      pCustomer:=fnGetCustomer();
      ...
    end;
  end;

要调用它,您可以在调用它的对象中传递函数的地址。因此,如果您在表单中定义:

  protected
    function GetTheCustomer(): TCustomer;

您可以像这样将此例程传递给 TPopupDataModule:

  { pPopupDM:=TPopupDataModule.Create(Application); // called previously }
  pPopupDM.BuildPopupMenu(Self.GetTheCustomer);    // in a Form method Self is the form

推荐阅读