首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否存在全局函数的CallByName等效?

是否存在全局函数的CallByName等效?
EN

Stack Overflow用户
提问于 2009-03-04 09:45:24
回答 4查看 2.2K关注 0票数 3

我想这样做:“如果有一个模块X包含一个函数Y,然后调用它,否则不要。”

我知道我可以使用CallByName(Object, MethodName, ...)来调用对象实例的方法或属性。

是否可以调用不绑定到对象的全局子/函数?

代码语言:javascript
复制
//Module1
Public Sub DoSomething
End Sub

//Module2
Public Sub TriggerDoSomething
  On Error Resume Next
  CallByName2 "Module1", "DoSomething", ...
End Sub

我知道,最好将我的代码重构成一个类,但目前不可能这样做,因为这会以几个小时内无法修复的方式破坏我的同事的代码。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-03-04 09:58:59

CallByName类真的会更容易一些--难道不能用重定向模块调用的类包装模块吗?

可以使用FunctionDelegator按名称调用模块中的例程。这在Matt的出色著作“高级Visual Basic 6”中得到了解释。

谷歌可能会发现一些使用CallWindowProc的黑客,但Matt说这很危险。这几乎是这件事的最后一句话:)

编辑: RS的答案不使用模块,使用具有GlobalMultiUse实例属性的类,您就可以使用CallByName了。如果您的代码位于DLL而不是EXE中,这将有效。RS Conley建议,在任何情况下,在DLL中拥有几乎所有功能的最小EXE是更灵活的:这很可能是真的。

票数 4
EN

Stack Overflow用户

发布于 2009-03-04 09:57:54

条件编译可以解决你的问题吗?

代码语言:javascript
复制
//Module2
Public Sub TriggerDoSomething
    #If DoSomething_IsPresent Then
        DoSomething
    #End if
End Sub

然后,在项目设置中添加以下条件编译参数:

  • 如果存在DoSomething : DoSomething_IsPresent = -1
  • 如果不存在DoSomething : DoSomething_IsPresent =0

顺便说一句,请注意下面的“恢复错误”:

代码语言:javascript
复制
//Module2
Public Sub TriggerDoSomething
  On Error Resume Next
  CallByName2 "Module1", "DoSomething", ...
End Sub

如果DoSomething存在于Module1中,但有一个未处理的错误,您将不会注意到它。

票数 1
EN

Stack Overflow用户

发布于 2009-03-04 12:26:32

不要使用模块,使用具有GlobalMultiUse实例属性的类,您就可以使用CallbyName

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/609894

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档