Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top