0

我正在使用 Delphi 11。有没有办法在 TDataModule 中运行特定函数,但前提是这个数据模块存在于我的项目中?

我需要一种方法来检查数据模块是否存在并将函数作为字符串调用,因为有些项目会添加这个数据模块,而其他项目则不会。

而不是这个:

myDataModule.myfunction(param);

会是这样的虚构代码:

if TDataModule(findcomponent('myDataModule')) <> nil then
   TDataModule(findcomponent('myDataModule')).call('myfunction','param');
4

2 回答 2

4

一个轻量级的解决方案可能是消息(来自System.Messaging的那些)。

  1. 声明一个新的TMessage后代,保存调用所需的参数
  2. 创建数据模块时,它使用执行操作的处理程序订阅此消息类型。
  3. 无需搜索数据模块,只需发送消息。
于 2021-10-20T20:16:20.953 回答
-1

这可能适用于您的情况,也可能不适用……但这似乎是我通过多播事件解决的那种情况。

您的代码将调用Event.Execute('Param')而不是myDataModule.myfunction(param).

负责“导入”和创建数据模块的代码部分将注册到事件中。就像是 :

EventClient := TEventClient.create(
                    procedure (const AParam : ParamType)
                    begin
                      myDataModule.myfunction(AParam)
                    end);
EventClient.Observe(Event);

现在,如果调用函数的原因是“类事件”,这种方法是有意义的,但在其他情况下这可能不太有意义。

至于实现多播事件的库,我不能推荐任何库,因为我总是使用专有的。如果您需要灵感来实现自己的,您可以查看单元 Vcl.AppEvnts 中的 TMultiCaster,它实现了或多或少相同的概念。

于 2021-10-20T19:09:41.703 回答