如何在VB6中实现"CanRaiseEvent"属性?

How to implement "CanRaiseEvent" property in VB6?

参考 Link 到 "CanRaiseEvent" 属性:https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.control.canraiseevents?view=netframework-4.8#System_Windows_Forms_Control_CanRaiseEvents

鉴于 VB6 中的事件是递归的,我想在事件处理程序子中禁用给定的控件事件。

例如,目前,如果在 TextBox 更改事件中更改了 TextBox 的内容(例如 "test"),则会触发另一个事件,导致当前事件的状态被堆叠并且 TextBox 发生更改事件将再次被调用。我可以使用简单的 "If" 来防止事件重复代码(例如,如果 Text1.Text = "test" Then Exit Sub)。这将立即退出第二个事件并return到第一个事件的状态继续处理。但是,我更愿意在进入初始事件时禁用 TextBox 事件。参考文献 link 中引用的 属性 似乎可以完成此操作,但 VB6 无法识别它。

在 VB6 中使用 "CanRaiseEvent" 属性 需要先声明什么吗?

谢谢 X

完成此操作的典型方法是使用 Static ... Boolean 变量:

   Sub SomeEvent
     Static inHere As Boolean

     If inHere Then 
        Exit Sub
     Else
        inHere = True
     End If
        .....
     inHere = False
   End Sub

您可以这样做,但这样做可能不值得。 (顺便说一句,我这台电脑上没有 VB6 IDE,所以这将被 un-syntax 检查,但它应该让你开始。

在您的表单中(对于此示例,假设您关心的文本框是 txtFirstName):

Private WithEvents mFirstNameEventListener As Textbox

Private Sub mFirstNameEventListener_TextChanged() 'or whatever the event is called in VB6
   DisableEvents

   'do work here, like forcing to upper-case etc

   EnableEvents
End Sub

Sub Form_Load()
   EnableEvents
End Sub

Sub Form_Unload()
   DisableEvents
End Sub


Private Sub EnableEvents()
   Set mFirstNameEventListener = txtFirstName
End Sub

Private Sub DisableEvents()
   Set mFirstNameEventListener = Nothing
End Sub

另请注意,您也不会使用标准的 VB6 存根事件处理程序。你只会这样做。 (否则两个事件处理程序都会被调用)