Empêcher un TreeView de déclencher des événements dans VB6 ?
Question
Dans certains codes VB6, j'ai un gestionnaire pour l'événement Collapse d'un TreeView :
Private Sub MyTree_Collapse(ByVal Node as MSComCtlLib.Node)
Ceci est appelé chaque fois qu'un nœud de l'arborescence est réduit, que ce soit par l'utilisateur ou par programme.Il s'avère que, suite à une exécution détournée, il peut arriver que ce gestionnaire finisse par dire à un nœud de s'effondrer, conduisant à une récursion infinie.
Je peux penser à plusieurs façons d'écorcher ce chat, mais ce qui me semble le plus simple est de dire à TreeView de ne pas déclencher d'événements pendant un certain temps.Cependant, je ne trouve pas d'appel simple pour me permettre de faire cela.Quelqu'un a-t-il réussi à le faire ou dois-je suivre l'état d'une autre manière afin de pouvoir réagir de manière appropriée lorsque des événements récursifs surviennent ?
La solution
Je pense que comme beaucoup d'événements en VB, il ne peut pas être désactivé.
Définissez simplement un indicateur booléen comme vous l'avez suggéré.
Autres conseils
@Phil - Je suis arrivé à la même conclusion.Ma mise en œuvre de MyTree_Collapse
ressemble maintenant à quelque chose comme ceci (où m_bHandlingCallback
est une variable membre) :
Private Sub MyTree_Collapse(ByVal Node as MSComCtlLib.Node)
If m_bHandlingCallback Then Exit Sub
m_bHandlingCallback = True
DoSomeStuff
m_bHandlingCallback = False
End Sub
Une autre façon en VB6 est d'avoir un autre WithEvents
référence au contrôle :
Private WithEvents alt as TreeView
et en Form_Load
:
Private Sub Form_Load()
Set alt = MyTree
End Sub
Maintenant alt
recevra de nombreux événements comme celui-ci :
Private Sub alt_Collapse(ByVal Node as MSComCtlLib.Node)
Set alt = Nothing
'DoSomeStuff'
Set alt = MyTree
End Sub
Mais, pendant la DoSomeStuff
, les événements sont décrochés - ce qui s'applique également à tous les autres événements Sub
s pour alt
sans qu’ils aient besoin de changements intrusifs.
Je déclarerais la variable flag comme STATIC dans le Sub.Cela évite de rendre la variable globale et lui fait conserver sa valeur entre les appels.