Frage

In einigen VB6-Codes habe ich einen Handler für das Collapse-Ereignis eines TreeView:

Private Sub MyTree_Collapse(ByVal Node as MSComCtlLib.Node)

Dies wird immer dann aufgerufen, wenn ein Knoten im Baum ausgeblendet wird, sei es durch den Benutzer oder programmgesteuert.Wie sich herausstellt, kann es durch eine Umwegausführung dazu kommen, dass dieser Handler einen Knoten anweist, zu kollabieren, 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, TreeView anzuweisen, für einen bestimmten Zeitraum keine Ereignisse auszulösen.Ich kann jedoch keinen einfachen Anruf finden, der mir dies ermöglichen würde.Hat dies jemand erfolgreich gemacht, oder muss ich den Status auf andere Weise verfolgen, damit ich angemessen reagieren kann, wenn rekursive Ereignisse auftreten?

War es hilfreich?

Lösung

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

Setzen Sie einfach ein boolesches Flag, wie Sie vorgeschlagen haben.

Andere Tipps

@Phil - Ich bin zum gleichen Schluss gekommen.Meine Implementierung von MyTree_Collapse jetzt sieht es ungefähr so ​​aus (wo m_bHandlingCallback ist eine Mitgliedsvariable):

Private Sub MyTree_Collapse(ByVal Node as MSComCtlLib.Node)
    If m_bHandlingCallback Then Exit Sub

    m_bHandlingCallback = True
    DoSomeStuff
    m_bHandlingCallback = False
End Sub

Eine andere Möglichkeit in VB6 besteht darin, eine Alternative zu haben WithEvents Hinweis auf die Steuerung:

Private WithEvents alt as TreeView

und in Form_Load:

Private Sub Form_Load()
Set alt = MyTree
End Sub

Jetzt alt wird 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 Events ausgehakt – das gilt auch für alle anderen Events Subs für alt ohne dass sie aufdringliche Änderungen vornehmen müssen.

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top