vb6 - 如何传递参数函数?

时间:2009-09-29 16:37:33

标签: vb6

如何通过参数传递函数,稍后在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

3 个答案:

答案 0 :(得分:6)

IIRC在VB6中有一个“AddressOf”函数来获取函数地址,但实际上在VB6中使用该函数地址可能会很困难。

处理此问题的SOP方法是使用“CallByName()”,它允许通过名称来调用函数等。

最后,您还可以采用标准的OO解决方案来实现这一目标:不要传递函数,而是编写自己的类,实现您自己设计的特殊接口“MyFunctionInterface”。该接口只有一个方法“FunctionToCall(..)”,您可以在不同的类中实现它来调用您需要的不同功能。然后将其中一个类的实例传递给您的例程,将其作为“MyFunctonInterface”接收并在其上调用“FunctionToCall”方法。当然,这需要进行大量的设计变更......

答案 1 :(得分:3)

您无法传递函数,但您可以传递一个行为函数的对象(有时称为“仿函数”)。我经常用这个。如果你是“functor”类实现一个接口,那么这个调用将是类型安全的。例如:

抽象类(接口)IAction.cls:

Option Explicit

Public Sub Create(ByVal vInitArgs As Variant)

End Sub

Public Function exe() As Variant

End Function

在默认浏览器中显示网址的Functor:

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的函数或方法等等。

答案 2 :(得分:1)

您对使用Microsoft.XMLHTTP OnReadyStateChange的评论很有意思。 MSDN page for OnReadyStateChange表示它“设计用于脚本环境,并且无法在Microsoft®VisualBasic®中轻松访问”。

同一页说在Visual Basic 6中你应该这样做。将此变量声明置于模块级

 Dim WithEvents xmldoc As DOMDocument30

然后您将能够以通常的方式处理事件。

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

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