2008-08-18 2 views
1

В некоторых VB6 код, у меня есть обработчик для Collapse событиечрезвычайной TreeView в:Запретить TreeView от запуска событий в VB6?

Private Sub MyTree_Collapse(ByVal Node as MSComCtlLib.Node) 

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

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

ответ

2

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

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

2

@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 
0

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

+2

Является ли функция статической переменной в VB разделяемой во всех экземплярах класса, например, на C++? Я пошел с данными члена (не глобальными данными), так что установка флага не повлияла бы на _all_ экземпляры моего класса - только тот, о котором я заботился. – 2008-09-29 12:04:01

2

Другой способ в VB6, чтобы иметь альтернативный WithEvents ссылку на элемент управления:

Private WithEvents alt as TreeView 

и в :

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, не требуя для них навязчивых изменений.

Смежные вопросы