oop - 如何将方法函数传递给另一个对象?
问题描述
如何将方法函数传递给另一个对象?在德尔福有这样的可能吗?
例如,我试图在 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;
不是有效的语法。
关于如何解决这个问题的任何建议?
解决方案
您最初的问题:如何将方法函数传递给另一个对象?
您可以为您的函数或过程原型声明一个类型,然后像传递任何其他变量一样传递它。查看TNotifyEvent
整个 RTL、VCL 和 FMX 的使用示例,了解如何做到这一点。
这样的事情可能吗?是的。
我不清楚你的用例到底是什么,所以我不确定给你最好的例子。您说您想使用 aTDataModule
创建 a TPopupMenu
,这似乎很清楚,但是您随后声明TCustomer
需要由TFrame
和TForm
调用它的对象提供。
为什么不直接将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
推荐阅读
- android - 首先在 RecyclerView 外滚动
- javascript - Office.js:使用 Excel.Range 类在 Excel 上添加多行
- excel - 将列总计写入任何位置
- r - 安装 R 包“WRS”
- google-sheets - 在 Google 表格中有条件的多个单元格中查找重复项
- java - UCanAccess 是否接受 SELECT table.* INTO ...?
- java - 有没有办法使用 apache POI 向 word 文件添加编码类型,以便表示 Umlaute?
- php - PHP curl_multi_init 更改代理
- c - 二进制文件读取错误,是字节序问题还是文件读取问题?
- javascript - 如何通过提交带有选中复选框的表单来打开网址