阻止 TreeView 在 VB6 中触发事件?

Prevent a TreeView from firing events in VB6?

提问人:Matt Dillard 提问时间:8/19/2008 更新时间:11/29/2009 访问量:1334

问:

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

Private Sub MyTree_Collapse(ByVal Node as MSComCtlLib.Node)

每当树中的节点折叠时,无论是由用户还是以编程方式折叠,都会调用此函数。事实证明,通过一些迂回的执行,这个处理程序可能会告诉一个节点崩溃,导致无限递归。

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

事件 VB6 树视图

评论


答:

1赞 Phil Bachmann 8/19/2008 #1

我认为就像 VB 中的许多事件一样,它不能关闭。

只需按照您的建议设置一个布尔标志即可。

3赞 Matt Dillard 8/20/2008 #2

@Phil - 我得出了同样的结论。我现在的实现看起来像这样(其中是一个成员变量):MyTree_Collapsem_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
0赞 Guillermo Phillips 9/29/2008 #3

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

评论

2赞 Matt Dillard 9/29/2008
VB 中的函数静态变量是否像在 C++ 中一样在类的所有实例之间共享?我使用了成员数据(而不是全局数据),这样设置标志就不会影响我的类的所有实例 - 只影响我关心的实例。
3赞 quamrana 11/29/2009 #4

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

但是,在 期间,事件被解开 - 这也适用于所有其他事件,因为不需要它们进行侵入性更改。DoSomeStuffSubalt