2008-08-18 9 views
1

In einigem VB6-Code, habe ich einen Handler für eine kürzere Veranstaltung TreeView:Verhindern, dass eine TreeView Ereignisse in VB6 auslöst?

Private Sub MyTree_Collapse(ByVal Node as MSComCtlLib.Node) 

Dies wird aufgerufen, wenn ein Knoten im Baum kollabiert ist, ob durch den Benutzer oder programmatisch. Wie sich herausstellt, kann es passieren, dass dieser Handler bei einer Umgehungsoperation einen Knoten zum Kollaps bringt, was zu einer unendlichen Rekursion führt.

Ich kann mir mehrere Möglichkeiten vorstellen, diese Katze zu häuten, aber was mir am einfachsten erscheint, ist, der TreeView zu sagen, dass sie für eine gewisse Zeit keine Ereignisse auslösen soll. Ich kann jedoch keinen einfachen Anruf finden, um mich das tun zu lassen. Hat jemand dies erfolgreich getan, oder muss ich den Status auf eine andere Art und Weise überwachen, damit ich angemessen reagieren kann, wenn rekursive Ereignisse auftreten?

Antwort

2

Ich denke, dass wie viele Ereignisse in VB, kann es nicht ausgeschaltet werden.

Setzen Sie einfach eine boolesche Flagge, wie Sie es vorgeschlagen haben.

2

@Phil - Ich kam zu dem gleichen Schluss. Meine Implementierung von MyTree_Collapse sieht nun so etwas wie diese (wo m_bHandlingCallback ist eine Membervariable):

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

Ich würde das Flag-Variable als STATIC im Sub deklarieren. Dadurch wird vermieden, dass die Variable global wird, und sie behält ihren Wert zwischen den Aufrufen bei.

+2

Ist eine statische Variablen in VB in allen Instanzen einer Klasse wie in C++ gemeinsam? Ich ging mit Member-Daten (nicht globale Daten), so dass die Einstellung der Flagge nicht Auswirkungen auf alle Instanzen meiner Klasse - nur die, die mir wichtig war. –

2

Eine weitere Möglichkeit, in VB6 ist eine alternative WithEvents Bezug auf die Kontrolle haben:

Private WithEvents alt as TreeView 

und in :

Private Sub Form_Load() 
Set alt = MyTree 
End Sub 

Jetzt alt werden viele Veranstaltungen wie diese erhalten:

Private Sub alt_Collapse(ByVal Node as MSComCtlLib.Node) 
Set alt = Nothing 
'DoSomeStuff' 
Set alt = MyTree 
End Sub 

Aber während der DoSomeStuff werden die Ereignisse abgehakt - was auch für alle anderen Ereignisse Sub für alt gilt, ohne dass diese aufdringliche Änderungen haben müssen.