3

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

Private Sub MyTree_Collapse(ByVal Node as MSComCtlLib.Node)

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

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

4

4 回答 4

3

@Phil - 我得出了同样的结论。我的MyTree_Collapsenow 实现看起来像这样(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
于 2008-08-19T17:56:39.843 回答
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,这些事件是未挂钩的——这也适用于所有其他事件Subalt而无需它们进行侵入性更改。

于 2009-11-28T19:32:36.030 回答
1

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

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

于 2008-08-19T02:43:58.220 回答
0

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

于 2008-09-29T11:10:56.597 回答