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 ответов
IIRC существует функция "AddressOf" в VB6 для получения адресов функций, но у вас, вероятно, возникнут большие трудности с использованием этого адреса функции из VB6.
способ SOP справиться с этим - с " CallByName ()", который позволяет yuo, вы знаете, вызывать функции и т. д. по их именам.
наконец, вы также можете пойти по большой дороге, используя стандартное решение OO для этого: вместо передачи функции напишите свой собственный класс, который реализует специальный интерфейс собственного дизайна "MyFunctionInterface". Этот интерфейс имеет только один метод " FunctionToCall(..) ", который вы можете реализовать в разных классах, чтобы вызвать различные функции, которые вам нужны. Затем вы передаете экземпляр одного из этих классов в свою подпрограмму, которая получает его как "MyFunctonInterface" и вызывает на нем метод "FunctionToCall". Конечно, для этого требуется много незначительных изменений в дизайне...
вы не можете передать функцию, но вы можете передать объект, который ведет себя как функция (иногда называемый "функтором"). Я использую это все время. Если класс "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 и т. д...
ваш комментарий, что вы используете Microsoft.Xmlhttp OnReadyStateChange интересен. The страница MSDN для OnReadyStateChange говорит, что он " предназначен для использования в средах сценариев и не доступен в Microsoft® Visual Basic®".
на той же странице говорится, что в Visual Basic 6 Вы должны это сделать. Поместите это объявление переменной на уровень модуля
Dim WithEvents xmldoc As DOMDocument30
и тогда вы сможете обрабатывать событие обычным способом, как этот.
Private Sub xmldoc_onreadystatechange()
' Deal with the event here '
End Sub
в стороне есть больше обсуждений о вызове функций по имени в этот вопрос. Но я думаю, что это неправильное решение твоей проблемы.