Function 如何使用VB6为参数传递函数?

Function 如何使用VB6为参数传递函数?,function,vb6,Function,Vb6,如何通过参数传递函数,稍后在VB6中调用? 将是我所需要的,可以是以下任何选项: Private Sub Command1_Click() Call callMethod(MyPrivateFunction) Call callMethod(MyPublicFunction) Call callMethod(MyPrivateSub) Call callMethod(MyPublicSub) End Sub Private Function MyPrivat

如何通过参数传递函数,稍后在VB6中调用? 将是我所需要的,可以是以下任何选项:

Private Sub Command1_Click()

    Call callMethod(MyPrivateFunction)
    Call callMethod(MyPublicFunction)
    Call callMethod(MyPrivateSub)
    Call callMethod(MyPublicSub)

End Sub

Private Function MyPrivateFunction()
    MsgBox "MyPrivateFunction"
End Function

Public Function MyPublicFunction()
    MsgBox "MyPublicFunction"
End Function

Private Sub MyPrivateSub()
    MsgBox "MyPrivateSub"
End Sub

Public Sub MyPublicSub()
    MsgBox "MyPublicSub"
End Sub

Public Function callMethod(ByRef func As Object)
    Call func
End Function

IIRC在VB6中有一个
AddressOf
函数来获取函数地址,但是从VB6中实际使用该函数地址可能会有很大的困难

处理这个问题的SOP方法是使用
CallByName()
,它允许您,您知道,按函数名调用函数等


最后,通过使用标准的OO解决方案,您还可以走捷径:不要传递函数,而是编写自己的类来实现自己设计的特殊接口
MyFunctionInterface
。此接口只有一个方法
FunctionToCall(..)
,您可以在不同的类中实现该方法来调用所需的不同函数。然后将其中一个类的实例传递给例程,例程将其作为
MyFunctonInterface
接收,并对其调用
FunctionToCall
方法。当然,这需要进行很多小的设计更改…

您关于使用Microsoft.XMLHTTP OnReadyStateChange的评论很有趣。该软件称其“设计用于脚本环境,在Microsoft®Visual Basic®中不易访问”

同一页说,在VisualBasic6中,您应该这样做。将此变量声明置于模块级别

 Dim WithEvents xmldoc As DOMDocument30
然后你就可以像这样处理这件事了

 Private Sub xmldoc_onreadystatechange()
   ' Deal with the event here '
 End Sub

另外,还有更多关于在中按名称调用函数的讨论。但是我认为对于你的问题,这是错误的解决方案。

你不能传递一个函数,但你可以传递一个表现为函数的对象(有时称为“函子”)。我一直用这个。如果“functor”类实现了接口,则调用将是类型安全的。例如:

抽象类(接口)IAction.cls:

Option Explicit

Public Sub Create(ByVal vInitArgs As Variant)

End Sub

Public Function exe() As Variant

End Function
在默认浏览器中显示url的函子:

Option Explicit

Implements IAction
Dim m_sUrl As String

Public Sub IAction_Create(ByVal vInitArgs As Variant)
        m_sUrl = vInitArgs    
End Sub

Public Function IAction_exe() As Variant


       Call RunUrl(m_sUrl) 'this function is defined elsewhere  

Exit Function

您现在可以创建一组此类,将它们保存在集合中,将它们传递给任何需要IAction的函数或方法,等等

它必须是函数对象本身吗?为什么不传递一个字符串,然后使用case语句调用相应的函数呢?我正在使用“Microsoft.XMLHTTP”,然后调用方法need myHttp.OnReadyStateChange=xFunction。xFunction应该通过参数传递。我记不太清楚vb6,但我认为您需要使用AddressOf来注册回调。函数必须在一个模块中声明。好的,考虑到我将选择另一个结构,因为我需要其他解决方案,谢谢谢谢,所有3个答案都帮助我做出了决定。谢谢,所有3个答案都帮助我做出了决定。