防止在VB6中触发事件的TreeView?

问题描述:

在一些VB6代码,我有一个TreeView的崩溃事件的处理程序:防止在VB6中触发事件的TreeView?

Private Sub MyTree_Collapse(ByVal Node as MSComCtlLib.Node) 

每当树中的一个节点是折叠这就是所谓的,无论是由用户或编程。事实证明,通过一些迂回的执行,可能会发生这样的事情:处理程序将结束告诉节点崩溃,导致无限递归。

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

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

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

@菲尔 - 我得出了同样的结论。我的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 

我想声明标志变量为静态在Sub。这样可以避免使全局变量变为全局变量,并保持其在调用之间的值。

+2

是VB中的一个函数静态变量,在类的所有实例*享,就像在C++中一样?我使用成员数据(不是全局数据),以便设置标志不会影响我班的所有实例 - 只是我关心的一个实例。 – 2008-09-29 12:04:01

在VB6的另一方式是具有一个备用WithEvents参考控制:

Private WithEvents alt as TreeView 

和在:

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 s的alt,而不需要他们进行侵入性更改。