如何检查单元和功能是不是存在?
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 object
或reference ...
)和事件变量,并将其初始化为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,它实现了或多或少相同的概念。
【讨论】:
以上是关于如何检查单元和功能是不是存在?的主要内容,如果未能解决你的问题,请参考以下文章