如何检查单元和功能是不是存在?

Posted

技术标签:

【中文标题】如何检查单元和功能是不是存在?【英文标题】: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');

【问题讨论】:

为什么你认为你需要做你的 .Call('myfunction ...?你可以使用 as 运算符 ... @MartynA 我不知道怎么做,代码只是一个虚构的例子 如何包含数据模块? 好吧,请继续阅读:请参阅docwiki.embarcadero.com/RADStudio/Sydney/en/Class_References 中的“作为运算符”部分。 看看$IF Declared() 【参考方案1】:

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

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

【讨论】:

也许更简单:在一个通用单元中声明一个合适的事件类型(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,它实现了或多或少相同的概念。

【讨论】:

以上是关于如何检查单元和功能是不是存在?的主要内容,如果未能解决你的问题,请参考以下文章

jQuery 是不是有“存在”功能?

jQuery 是不是有“存在”功能?

如何检查图片是不是存在于url

如何使用 lua 检查 Roblox 中是不是存在对象?

Actionscript 2 - 如何检查电影剪辑是不是存在于舞台的特定位置?

如何在创建存储过程之前检查它是不是存在