2008-08-18 6 views
1

Dans un code VB6, j'ai un gestionnaire pour l'événement Réduire d'un TreeView:Empêcher un TreeView de déclencher des événements dans VB6?

Private Sub MyTree_Collapse(ByVal Node as MSComCtlLib.Node) 

Ceci est appelé à chaque fois qu'un nœud dans l'arborescence est réduite, que ce soit par l'utilisateur ou par programme. Comme il s'avère, à travers une certaine exécution de rond-point, 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'habiller 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. Je ne peux pas trouver un simple appel pour me laisser faire cela, cependant. Quelqu'un a-t-il réussi à le faire, ou dois-je faire le suivi de l'état d'une autre manière afin de pouvoir répondre de manière appropriée lorsque des événements récursifs surviennent?

Répondre

2

Je pense que comme de nombreux événements dans VB, il ne peut pas être désactivé.

Il suffit de définir un indicateur booléen comme vous l'avez suggéré.

2

@Phil - Je suis arrivé à la même conclusion. Ma mise en œuvre de MyTree_Collapse ressemble maintenant quelque chose comme ça (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 
0

je déclarerais la variable de marquer comme STATIC dans le Sous. Cela évite de rendre la variable globale et lui fait garder sa valeur entre les appels.

+2

Une variable statique de fonction dans VB est-elle partagée entre toutes les instances d'une classe, comme c'est le cas en C++? Je suis allé avec des données de membre (pas de données globales) de sorte que la définition du drapeau n'affecterait pas toutes les instances de ma classe - juste celle dont je me souciais. –

2

Une autre façon VB6 est d'avoir une WithEvents autre référence au contrôle:

Private WithEvents alt as TreeView 

et :

Private Sub Form_Load() 
Set alt = MyTree 
End Sub 

maintenant alt recevra beaucoup d'é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 le DoSomeStuff, les événements sont décrochés - ce qui s'applique également à tous les autres événements Sub s pour alt sans avoir besoin d'avoir des modifications intrusives.

Questions connexes