vb6 - Как передать функцию для параметра?

Ryan Tomayko записал немного [приблизительно 110], которые он сказал:

†¦ [это] немного как фиксация мерзавца - исправление, скачкообразно перемещенное на кислоте и содержании цепной пилы †“абсолютно безумно и довольно опасно, но способно к представлению совершенно новых настроений. Здесь можно отредактировать, раздавить, переупорядочить, поддразнивание независимо, и аннотировать существующие фиксации способом that’s легче и более интуитивный, чем это должно быть.

я имею тенденцию часто фиксировать в мерзавце, но не обязательно хочу к dcommit каждый , соглашаются на svn, и давящий всю мою работу имеет так же мало смысла. Я пробую его теперь, чтобы переупорядочить и раздавить некоторых вместе в более логические единицы фиксации теперь.

8
задан andres descalzo 29 September 2009 в 16:37
поделиться

3 ответа

IIRC there is an "AddressOf" function in VB6 to get function addresses, but you will likely have great difficulty actually using that function address from within VB6.

The SOP way to handle this is with "CallByName()" which allows yuo to, you know, call functions, etc. by their names.

finally, you can also take the high road, by using the standard OO solution to this: Instead of passing the function, write your own class that implements a special interface of your own design "MyFunctionInterface". This interface has only one method "FunctionToCall(..)", which you can implement in different classes to call the different functions that you need. Then you pass an instance of one of these classes to your routine, that recieves it as "MyFunctonInterface" and calls the "FunctionToCall" method on it. Of course that takes a whole lot of minor design changes...

6
ответ дан 5 December 2019 в 17:38
поделиться

Вы не можете передать функцию, но можете передать объект, который ведет себя как функция (иногда называемый «функтором»). Я использую это все время. Если вы "функтор" класса реализует интерфейс, вызов будет безопасным по типу. Например:

Абстрактный класс (Интерфейс) 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

Теперь вы можете создать группу этих классов, сохранить их в коллекции, передать их любая функция или метод, который ожидает действия IA и т. д.

3
ответ дан 5 December 2019 в 17:38
поделиться

Ваш комментарий о том, что вы используете Microsoft.XMLHTTP OnReadyStateChange, интересен. На странице MSDN для OnReadyStateChange говорится, что он «предназначен для использования в средах сценариев и не всегда доступен в Microsoft® Visual Basic®».

На той же странице сказано, что в Visual Basic 6 вы должны это сделать. Поместите это объявление переменной на уровне модуля

 Dim WithEvents xmldoc As DOMDocument30

, и тогда вы сможете обрабатывать событие обычным способом, подобным этому.

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

Кроме того, в этом вопросе более подробно обсуждается вызов функций по имени. . Но я думаю, что это неправильное решение вашей проблемы.

1
ответ дан 5 December 2019 в 17:38
поделиться