2009-09-29 13 views
7

¿Cómo puedo hacer para pasar una función por parámetro, que luego se invocó en VB6? sería algo así como lo que necesito, puede ser cualquiera de estas opciones:vb6 - ¿Cómo pasar una función para el parámetro?

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

¿tiene que ser el propio objeto de la función? ¿Por qué no pasar una cadena y luego usar una declaración de caso para llamar a la función apropiada? –

+0

estoy usando "Microsoft.XMLHTTP" y luego llamar al método necesita myHttp.OnReadyStateChange = xFunction. Y xFunction se debe pasar a través de parámetros –

+0

No recuerdo VB6 muy bien, pero creo que es necesario utilizar AddressOf para registrar una devolución de llamada. Y la función debe declararse en un módulo. – Joepro

Respuesta

6

IIRC hay una función de "AddressOf" en VB6 para obtener direcciones de las funciones, pero es probable que tenga gran dificultad en realidad usando esa dirección de la función desde dentro de VB6.

La manera de SOP para manejar esto es con "CallByName()" que le permite a usted, ya sabe, funciones de llamada, etc. por sus nombres.

Finalmente, también puede tomar el camino correcto, utilizando la solución OO estándar para esto: en lugar de pasar la función, escriba su propia clase que implemente una interfaz especial de su propio diseño "MyFunctionInterface". Esta interfaz tiene solo un método "FunctionToCall (..)", que puede implementar en diferentes clases para llamar a las diferentes funciones que necesita. Luego, pasa una instancia de una de estas clases a su rutina, que la recibe como "Mi InterfazFuncton" y llama al método "FunctionToCall" en ella. Por supuesto, eso requiere un montón de pequeños cambios de diseño ...

+0

Ok, dado que yo elegiré otra estructura, porque necesito otra solución, gracias –

1

Tu comentario de que estás usando Microsoft.XMLHTTP OnReadyStateChange es interesante. El MSDN page for OnReadyStateChange dice que "está diseñado para su uso en entornos de scripting y no es fácilmente accesible en Microsoft® Visual Basic®".

La misma página dice que en Visual Basic 6 que debe hacer esto. Ponga esta declaración de variables en el módulo

Dim WithEvents xmldoc As DOMDocument30 

y luego podrá manejar el evento de la manera habitual de esta manera.

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

En un aparte hay más discusión sobre llamar a las funciones por su nombre en this question. Pero creo que es la solución incorrecta para tu problema.

+0

gracias, los 3 respuestas me ayudaron mucho para decidir qué decisión tomar. –

3

No se puede pasar una función, pero se puede pasar un objeto que se comporta como una función (a veces llamado "functor"). Uso esto todo el tiempo. Si tu clase "functor" implementa una interfaz, la llamada será segura. Por ejemplo:

clase abstracta (interfaz): IAction.cls

Option Explicit 

Public Sub Create(ByVal vInitArgs As Variant) 

End Sub 

Public Function exe() As Variant 

End Function 

Functor que muestra una URL en el navegador por defecto:

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 

Ahora puede crear un montón de estas clases, guardarlos en una colección, pasarlos a cualquier función o un método que espera un IAction, etc ...

+0

gracias, las 3 respuestas me ayudaron mucho a decidir qué decisión tomar. –

Cuestiones relacionadas