2009-09-29 82 views
7

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

它是否必须是函数对象本身?为什么不传递一个字符串,然后使用case语句来调用相应的函数? – 2009-09-29 16:42:51

+0

我正在使用“Microsoft.XMLHTTP”,然后调用该方法需要myHttp.OnReadyStateChange = xFunction。并且xFunction应该通过参数 – 2009-09-29 16:47:59

+0

传递我不太记得vb6,但是我认为你需要使用AddressOf来注册一个回调函数。该功能必须在模块中声明。 – Joepro 2009-09-29 16:55:16

回答

6

IIRC有在VB6的“AddressOf”功能来获取函数的地址,但你可能有很大的难度实际使用该函数的地址从VB6开始。

SOP处理这个问题的方法是使用“CallByName()”,它允许yuo通过它们的名字来调用函数等。通过使用标准的OO解决方案,您可以走高速公路:通过编写自己的类来实现自己的设计“MyFunctionInterface”的特殊界面,而不是传递函数。这个接口只有一个方法“FunctionToCall(..)”,你可以在不同的类中实现调用你需要的不同功能。然后,将这些类中的一个的实例传递给您的例程,并将其作为“MyFunctonInterface”接收,并在其上调用“FunctionToCall”方法。当然,这需要很多小的设计更改...

+0

好吧,鉴于我会选择另一种结构,因为我需要其他解决方案,谢谢 – 2009-09-29 19:19:25

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名称调用函数的更多讨论。但我认为这是您的问题的错误解决方案。

+0

谢谢,所有3个答案帮助我决定做出什么决定。 – 2009-09-30 12:40:15

3

你不能传递一个函数,但是你可以传递一个表现为函数的对象(有时称为“函子”)。我经常用这个。如果你的“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的函数或方法,等等......

+0

谢谢,所有3个答案帮助我决定做出什么决定。 – 2009-09-30 12:41:44