【问题标题】:How to check if unit and function exists?如何检查单元和功能是否存在?
【发布时间】:2021-12-07 12:03:37
【问题描述】:

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

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

而不是这个:

myDataModule.myfunction(param);

会是这样的虚构代码:

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

【问题讨论】:

标签: delphi delphi-11-alexandria


【解决方案1】:

轻量级解决方案可以是 Messages(来自 System.Messaging 的那些)。

  1. 声明一个新的TMessage后代,保存调用所需的参数
  2. 创建数据模块时,它订阅此消息类型,处理程序执行操作。
  3. 只需发送消息,而不是搜索数据模块。

【讨论】:

  • 也许更简单:在一个通用单元中声明一个合适的事件类型(procedure ... of objectreference ...)和事件变量,并将其初始化为nil。在数据模块单元中,将事件变量更改为合适的处理程序。
  • @UliGerhardt 是的,这也是可能的。它只限于一个订阅者而不是多个订阅者。最近我倾向于更灵活的方法。
【解决方案2】:

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

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

负责“导入”和创建数据模块的代码部分将注册到事件。类似的东西:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-21
    • 1970-01-01
    • 2020-11-11
    • 2019-09-19
    • 1970-01-01
    • 1970-01-01
    • 2018-10-05
    相关资源
    最近更新 更多