我想这样做:“如果有一个模块X包含一个函数Y,然后调用它,否则不要。”
我知道我可以使用CallByName(Object, MethodName, ...)来调用对象实例的方法或属性。
是否可以调用不绑定到对象的全局子/函数?
//Module1
Public Sub DoSomething
End Sub
//Module2
Public Sub TriggerDoSomething
On Error Resume Next
CallByName2 "Module1", "DoSomething", ...
End Sub我知道,最好将我的代码重构成一个类,但目前不可能这样做,因为这会以几个小时内无法修复的方式破坏我的同事的代码。
发布于 2009-03-04 09:58:59
CallByName类真的会更容易一些--难道不能用重定向模块调用的类包装模块吗?
可以使用FunctionDelegator按名称调用模块中的例程。这在Matt的出色著作“高级Visual Basic 6”中得到了解释。
谷歌可能会发现一些使用CallWindowProc的黑客,但Matt说这很危险。这几乎是这件事的最后一句话:)
编辑: RS的答案不使用模块,使用具有GlobalMultiUse实例属性的类,您就可以使用CallByName了。如果您的代码位于DLL而不是EXE中,这将有效。RS Conley建议,在任何情况下,在DLL中拥有几乎所有功能的最小EXE是更灵活的:这很可能是真的。
发布于 2009-03-04 09:57:54
条件编译可以解决你的问题吗?
//Module2
Public Sub TriggerDoSomething
#If DoSomething_IsPresent Then
DoSomething
#End if
End Sub然后,在项目设置中添加以下条件编译参数:
顺便说一句,请注意下面的“恢复错误”:
//Module2
Public Sub TriggerDoSomething
On Error Resume Next
CallByName2 "Module1", "DoSomething", ...
End Sub如果DoSomething存在于Module1中,但有一个未处理的错误,您将不会注意到它。
发布于 2009-03-04 12:26:32
不要使用模块,使用具有GlobalMultiUse实例属性的类,您就可以使用CallbyName
https://stackoverflow.com/questions/609894
复制相似问题