防止TreeView触发VB6中的事件?
时间:2020-03-05 18:40:30 来源:igfitidea点击:
在某些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
回答
我将在Sub中将flag变量声明为STATIC。这样可以避免使变量成为全局变量,并使其在两次调用之间保持其值。
回答
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",而无需进行侵入性更改。