¿Evitar que un TreeView active eventos en VB6?
Pregunta
En algún código VB6, tengo un controlador para el evento de colapso de TreeView:
Private Sub MyTree_Collapse(ByVal Node as MSComCtlLib.Node)
Esto se llama cada vez que se colapsa un nodo en el árbol, ya sea por parte del usuario o mediante programación.Resulta que, a través de alguna ejecución indirecta, puede suceder que este controlador termine diciéndole a un nodo que colapse, lo que lleva a una recursividad infinita.
Puedo pensar en varias formas de despellejar a este gato, pero lo que me parece más simple es decirle a TreeView que no genere eventos durante un período de tiempo.Sin embargo, no puedo encontrar una llamada simple que me permita hacer esto.¿Alguien ha hecho esto con éxito o necesito realizar un seguimiento del estado de alguna otra manera para poder responder adecuadamente cuando se presenten eventos recursivos?
Solución
Creo que, como muchos eventos en VB, no se puede desactivar.
Simplemente configure una bandera booleana como sugirió.
Otros consejos
@Phil: llegué a la misma conclusión.Mi implementación de MyTree_Collapse
ahora se parece a esto (donde m_bHandlingCallback
es una variable miembro):
Private Sub MyTree_Collapse(ByVal Node as MSComCtlLib.Node)
If m_bHandlingCallback Then Exit Sub
m_bHandlingCallback = True
DoSomeStuff
m_bHandlingCallback = False
End Sub
Otra forma en VB6 es tener una alternativa WithEvents
referencia al control:
Private WithEvents alt as TreeView
y en Form_Load
:
Private Sub Form_Load()
Set alt = MyTree
End Sub
Ahora alt
Recibirá muchos eventos como este:
Private Sub alt_Collapse(ByVal Node as MSComCtlLib.Node)
Set alt = Nothing
'DoSomeStuff'
Set alt = MyTree
End Sub
Pero, durante el DoSomeStuff
, los eventos se desenganchan, lo que también se aplica a todos los demás eventos. Sub
s para alt
sin necesidad de que tengan cambios intrusivos.
Declararía la variable de bandera como ESTÁTICA en Sub.Esto evita que la variable sea global y hace que mantenga su valor entre llamadas.