В некотором коде VB6 у меня есть обработчик для события Collapse TreeView:
Private Sub MyTree_Collapse(ByVal Node as MSComCtlLib.Node)
Это вызывается всякий раз, когда узел в дереве свернут, пользователем или программно. Как выясняется, при некотором обходном выполнении может случиться так, что этот обработчик в конечном итоге скажет узлу свернуть, что приведет к бесконечной рекурсии.
Я могу придумать несколько способов убрать этого кота из кожи, но мне кажется, что проще всего сказать TreeView не вызывать события в течение некоторого периода времени. Я не могу найти простой звонок, чтобы позволить мне сделать это, хотя. Кто-нибудь успешно сделал это, или мне нужно отслеживать состояние каким-то другим образом, чтобы я мог адекватно реагировать, когда происходят рекурсивные события?
Я думаю, что, как и многие другие события в VB, его нельзя отключить.
Просто установите логический флаг, как вы предложили.
@Phil - я пришел к такому же выводу. Моя реализация MyTree_Collapse
сейчас выглядит примерно так (где m_bHandlingCallback
переменная-член):
Private Sub MyTree_Collapse(ByVal Node as MSComCtlLib.Node)
If m_bHandlingCallback Then Exit Sub
m_bHandlingCallback = True
DoSomeStuff
m_bHandlingCallback = False
End Sub
Я бы объявил переменную флага как STATIC в Sub. Это позволяет не делать переменную глобальной и сохранять ее значение между вызовами.
Другой способ в VB6 - иметь альтернативную WithEvents
ссылку на элемент управления:
Private WithEvents alt as TreeView
и в Form_Load
:
Private Sub Form_Load()
Set alt = MyTree
End Sub
Теперь alt
будет много событий, подобных этому:
Private Sub alt_Collapse(ByVal Node as MSComCtlLib.Node)
Set alt = Nothing
'DoSomeStuff'
Set alt = MyTree
End Sub
Но, во время DoSomeStuff
, события отцепляются - что также относится ко всем другим событиям, Sub
поскольку alt
нет необходимости вносить в них навязчивые изменения.