Oop 如何将方法函数传递给另一个对象?

Oop 如何将方法函数传递给另一个对象?,oop,delphi,Oop,Delphi,如何将方法函数传递给另一个对象?这样的事情在德尔菲可能发生吗 例如,我试图在DataModule中创建一个PopupMenu,因为这个PopupMenu将在应用程序中的多个位置使用 弹出菜单将使用一个特定函数,例如:GetCustomer(),它返回TCustomer,可以对其执行各种操作 创建和使用DataModule的每个表单/框架都希望向其传递GetCustomer()的自定义实现 我想写一些像这样的东西: TGetCustomerFunc = function: TCustomer of

如何将方法函数传递给另一个对象?这样的事情在德尔菲可能发生吗

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

弹出菜单将使用一个特定函数,例如:
GetCustomer()
,它返回
TCustomer
,可以对其执行各种操作

创建和使用DataModule的每个表单/框架都希望向其传递
GetCustomer()
的自定义实现

我想写一些像这样的东西:

TGetCustomerFunc = function: TCustomer of object;
然后在DataModule上创建字段/属性:

TPopupDataModule = class(TDataModule)
public
  { Public declarations }
  GetCustomer: TGetCustomerFunc;
end;
GetCustomer
将由创建
popdatamodule
的每个帧分配一个方法,并有其自己的特定实现


但是,
函数:t对象的客户不是有效的语法


有什么建议吗?

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

您可以为您的函数或过程原型声明一个类型,然后像传递任何其他变量一样传递该类型。查看RTL、VCL和FMX中使用的
TNotifyEvent
,了解如何执行此操作的示例

这可能吗?对

我不清楚您的用例是什么,所以我不确定能给您提供的最佳示例。您说您想使用
TDataModule
创建一个
tpopmpmenu
,这似乎很清楚,但随后您说
tccustomer
需要由调用它的
TFrame
TForm
对象提供

为什么不将
t客户
对象传递给它呢?传递函数以获取对象似乎有点复杂

如果我理解了你在寻找什么,你会想要这样的东西:

TGetCustomerFunc = function: TCustomer of object;
接口
类型
t客户=类别(待标的);
TGetCustomerFunc=function():t对象的客户;
TPopupDataModule=类(TDataModule)
公众的
函数BuildPopupMenu(fnGetCustomer:TGetCustomerFunc):TPopupMenu;
...
结束;
实施
函数TPopupDataModule.BuildPopupMenu(fnGetCustomer:TGetCustomerFunc):TPopupMenu;
变量
p客户:t客户;
开始
如果(已分配(fnGetCustomer)),则
开始
pccustomer:=fnGetCustomer();
...
结束;
结束;
要调用它,您可以在调用它的对象中传递函数的地址。因此,如果您在表单中定义:

受保护
函数GetTheCustomer():t客户;
您可以如下方式将此例程传递给TPopUpData模块:

TGetCustomerFunc = function: TCustomer of object;
{ppopuppdm:=TPopupDataModule.Create(Application);//以前调用过}
ppoppdm.BuildPopupMenu(Self.GetTheCustomer);//在形式方法中,自我就是形式

“但是,
函数:t对象的客户
;的语法无效。”。是的,它是完全有效的。@潜伏者:
function:TCustomer
是一个返回
TCustomer
的无参数函数,而
function:TCustomer of object
是一个返回
TCustomer
的无参数方法(因此,它有一个隐藏的
Self
参数)。@AndreasRejbrand谢谢,我不熟悉这种语法。@AndreasRejbrand:你说得很对。我的错。不知何故,它在某一点上没有编译,可能是因为我的语法不正确。@RaelB显示的代码完全有效。那你为什么认为不是呢?您是否遇到编译器错误?如果是,错误到底是什么?请提供一份报告。