如何在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 存根事件处理程序。你只会这样做。 (否则两个事件处理程序都会被调用)
参考 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 存根事件处理程序。你只会这样做。 (否则两个事件处理程序都会被调用)