阻止TreeView在VB6中触发事件?

时间:2008-08-18 20:11:23

标签: events vb6 treeview

在某些VB6代码中,我有一个TreeView的Collapse事件的处理程序:

Private Sub MyTree_Collapse(ByVal Node as MSComCtlLib.Node)

无论是用户还是以编程方式折叠树中的节点,都会调用此方法。事实证明,通过一些环形交叉执行,可能会发生这样的处理程序最终会告诉节点崩溃,导致无限递归。

我可以想到多种方法来修饰这只猫,但对我来说最简单的是告诉TreeView不要在一段时间内引发事件。但是,我找不到一个简单的电话让我这样做。有没有人成功地做过这个,或者我是否需要以其他方式跟踪状态,以便在递归事件发生时我能做出适当的回应?

4 个答案:

答案 0 :(得分:3)

@Phil - 我得出了同样的结论。我对MyTree_Collapse的实现现在看起来像这样(其中m_bHandlingCallback是成员变量):

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

    m_bHandlingCallback = True
    DoSomeStuff
    m_bHandlingCallback = False
End Sub

答案 1 :(得分:3)

VB6的另一种方法是对控件进行备用WithEvents引用:

Private WithEvents alt as TreeView

Form_Load

Private Sub Form_Load()
Set alt = MyTree
End Sub

现在alt会收到很多这样的事件:

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

但是,在DoSomeStuff期间,事件处于取消状态 - 这也适用于Sub的所有其他事件alt,而无需他们进行侵入性更改。

答案 2 :(得分:1)

我认为像VB中的许多事件一样,它无法关闭。

按照你的建议设置一个布尔标志。

答案 3 :(得分:0)

我会在Sub中将标志变量声明为STATIC。这样可以避免使变量成为全局变量,并使其在调用之间保持其值。