Skip to content

Handles

过程头部上的尾部子句,将过程绑定为一个或多个特定事件的事件处理程序。

INFO

Handles 子句是twinBASIC扩展。经典VBA仅通过名称连接事件处理程序:名为 Form_LoadSub 自动处理 FormLoad 事件。twinBASIC仍然支持该模式——Handles 将过程名称与其处理的事件解耦,并允许一个函数体同时处理多个事件。IDE自动生成事件原型时是否插入新语法由"IDE: Use new handles/implements syntax"选项控制。

语法:

procedure-header Handles object.event [ , object.event ] …

procedure-header
完整的 SubFunctionProperty 头部,包括任何访问修饰符、名称、参数列表和(对于 Function / Property Get)返回类型。
object
命名封闭类、窗体或用户控件中可见的事件源的标识符:宿主的隐式标识符(FormUserControlMyClass)、窗体上声明的控件(Command1Text1、…)或 WithEvents 成员变量。
event
object 类型上声明的 Event 的名称。

过程的参数列表必须匹配其处理的每个事件的签名。当列出多个事件时,它们必须共享相同的签名,以便一个函数体可以互换地服务它们。

因为 Handles 将过程的名称与其处理的事件解耦,过程可以:

  • 使用描述性名称(OnLoadSyncOpacity)而非复合的 <Object>_<Event> 形式;
  • 将多个相关的事件处理程序合并到单个函数体中而无需重复代码;
  • 处理来自名称恰好与隐式命名模式冲突的过程的事件。

经典命名约定不受影响:字面上命名为 *object*_*event* 的过程继续自动连接为该事件的处理程序,无论同一事件上是否有其他 Handles 子句。

示例

为窗体的 Load 事件使用描述性名称的处理程序:

vb
Private Sub OnLoad() Handles Form.Load
    Debug.Print "Form is loading."
End Sub

单个函数体同时响应多个属性更改事件(改编自标准 CheckMark 控件):

vb
Protected Sub SignificantChange() _
        Handles BackColor.OnPropertyLet, _
                BackStyle.OnPropertyLet, _
                Appearance.OnPropertyLet, _
                Value.OnPropertyLet
    Me.WindowlessRefresh()
End Sub

作为对比,其中一个事件的等效经典VBA命名约定形式:

vb
Private Sub BackColor_OnPropertyLet()
    Me.WindowlessRefresh()
End Sub

——每个事件需要一个单独的过程体。

另请参阅

twinBASIC及其LOGO版权为作者"韦恩"所有