Предотвратить TreeView от запуска событий в VB6? - PullRequest
2 голосов
/ 19 августа 2008

В некотором коде VB6 у меня есть обработчик для события свертывания TreeView:

Private Sub MyTree_Collapse(ByVal Node as MSComCtlLib.Node)

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

Я могу придумать несколько способов убрать эту кошку, но мне кажется, что проще всего сказать TreeView не вызывать события в течение некоторого периода времени. Я не могу найти простой звонок, чтобы позволить мне сделать это, хотя. Кто-нибудь успешно сделал это, или мне нужно отслеживать состояние каким-либо другим образом, чтобы я мог соответствующим образом реагировать, когда происходят рекурсивные события?

Ответы [ 4 ]

3 голосов
/ 28 ноября 2009

Другой способ в 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 s для alt без необходимости внесения навязчивых изменений.

3 голосов
/ 19 августа 2008

@ Фил - я пришел к такому же выводу. Моя реализация 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
1 голос
/ 19 августа 2008

Я думаю, что, как и многие события в VB, его нельзя отключить.

Просто установите логический флаг, как вы предложили.

0 голосов
/ 29 сентября 2008

Я бы объявил переменную флага как STATIC в Sub. Это позволяет не делать переменную глобальной и сохранять ее значение между вызовами.

...