Запретить TreeView запускать события в VB6?
Вопрос
В некотором коде VB6 у меня есть обработчик для события свертывания 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
Другой способ в 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
без необходимости внесения в них навязчивых изменений.
Я бы объявил переменную flag как СТАТИЧЕСКУЮ в Подразделе.Это позволяет избежать придания переменной глобального характера и позволяет ей сохранять свое значение между вызовами.