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 ?

Était-ce utile?

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 Subs 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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top