Предотвратить TreeView от запуска событий в VB6?

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

Private Sub MyTree_Collapse(ByVal Node as MSComCtlLib.Node)

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

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

18.08.2008 20:11:22
4 ОТВЕТА
РЕШЕНИЕ

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

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

1
19.08.2008 02:43:58

@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
3
2.10.2008 01:19:06

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

0
29.09.2008 11:10:56
Является ли статическая переменная функции в VB общей для всех экземпляров класса, как в C ++? Я использовал данные членов (не глобальные данные), чтобы установка флага не затронула все экземпляры моего класса - только тот, который меня волновал.
Matt Dillard 29.09.2008 12:04:01

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

3
28.11.2009 19:32:36