Сведения о вопросе

DED

11:36, 18th August, 2020

Теги

events   vb6   treeview    

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

Просмотров: 431   Ответов: 4

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

Private Sub MyTree_Collapse(ByVal Node as MSComCtlLib.Node)

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

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



  Сведения об ответе

PROGA

10:08, 15th August, 2020

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


  Сведения об ответе

park

21:18, 7th August, 2020

@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


  Сведения об ответе

DO__IT

12:31, 13th August, 2020

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

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


  Сведения об ответе

+-*/

03:12, 10th August, 2020

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться