代码之家  ›  专栏  ›  技术社区  ›  Matt Dillard

阻止TreeView在VB6中触发事件?

  •  3
  • Matt Dillard  · 技术社区  · 18 年前

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

    Private Sub MyTree_Collapse(ByVal Node as MSComCtlLib.Node)
    

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

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

    4 回复  |  直到 18 年前
        1
  •  3
  •   Matt Dillard    17 年前

    @菲尔,我也得出了同样的结论。我的实施 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
    
        2
  •  3
  •   quamrana Ryuzaki L    16 年前

    VB6中的另一种方法是使用备用 WithEvents 参考控制:

    Private WithEvents alt as TreeView
    

    和in 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 s for 中高音 而不需要他们进行侵入性的更改。

        3
  •  1
  •   Phil Bachmann    18 年前

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

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

        4
  •  0
  •   Guillermo Phillips    17 年前

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