【问题标题】:Prevent a TreeView from firing events in VB6?防止 TreeView 在 VB6 中触发事件?
【发布时间】:2008-08-18 20:11:22
【问题描述】:

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

Private Sub MyTree_Collapse(ByVal Node as MSComCtlLib.Node)

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

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

【问题讨论】:

    标签: events vb6 treeview


    【解决方案1】:

    @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
    

    【讨论】:

      【解决方案2】:

      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 期间,这些事件是未挂钩的 - 这也适用于 alt 的所有其他事件 Subs,而无需对其进行侵入性更改。

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

          • VB 中的函数静态变量是否在类的所有实例之间共享,就像在 C++ 中一样?我使用了成员数据(不是全局数据),这样设置标志就不会影响我班级的所有个实例——只是我关心的那个。
          猜你喜欢
          • 1970-01-01
          • 2010-10-27
          • 1970-01-01
          • 2012-04-09
          • 1970-01-01
          • 1970-01-01
          • 2014-09-17
          • 1970-01-01
          • 2011-11-12
          相关资源
          最近更新 更多