如何在VB6中防止TreeView控件触发事件?

3

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

Private Sub MyTree_Collapse(ByVal Node as MSComCtlLib.Node)

每当树中的节点被折叠时,无论是由用户还是程序自动执行,都会调用此函数。但事实证明,通过一些迂回的执行,可能会导致此处理程序最终告诉某个节点要折叠,从而导致无限递归。
我可以想到多种方法来解决这个问题,但在我看来,最简单的方法是告诉TreeView在一段时间内不要触发事件。但是我找不到一个简单的调用让我这样做。有人成功地做到了这一点吗?还是我需要以其他方式跟踪状态,以便在递归事件出现时做出适当的响应?
4个回答

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期间,事件被取消挂钩 - 这也适用于所有其他alt事件Sub,无需进行侵入性更改。


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

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

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


0

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


2
在VB中,函数的静态变量是否像C++中一样在类的所有实例之间共享?我选择成员数据(而不是全局数据),以便设置标志不会影响我的类的所有实例 - 只影响我关心的那个。 - Matt Dillard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接