题
在一些 VB6 代码中,我有一个 TreeView 的 Collapse 事件的处理程序:
Private Sub MyTree_Collapse(ByVal Node as MSComCtlLib.Node)
每当树中的节点折叠时(无论是由用户还是以编程方式折叠)都会调用此函数。事实证明,通过一些迂回执行,该处理程序可能最终会告诉节点崩溃,从而导致无限递归。
我可以想到多种方法来给这只猫剥皮,但对我来说最简单的是告诉 TreeView 在一段时间内不要引发事件。不过,我找不到一个简单的调用来让我这样做。有没有人成功地做到了这一点,或者我是否需要以其他方式跟踪状态,以便在递归事件发生时我可以做出适当的响应?
解决方案
我认为就像 VB 中的许多事件一样,它无法关闭。
只需按照您的建议设置一个布尔标志即可。
其他提示
@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
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
不需要他们进行侵入性的改变。
我会在 Sub 中将标志变量声明为 STATIC。这避免了使变量成为全局变量并使其在调用之间保持其值。
不隶属于 StackOverflow