最佳实践

UserForm 是具有设计器和默认实例的类模块。的设计者可以通过按被访问 Shift + F7 在观看代码隐藏,并且隐藏代码可以按被访问 F7,同时观看的设计者

每次都使用新实例

作为一个类模块,一个形式因此是蓝图用于对象。因为表单可以保存状态和数据,所以使用类的新实例而不是默认/全局实例更好的做法 :

With New UserForm1
    .Show vbModal
    If Not .IsCancelled Then
        '...
    End If
End With

代替:

UserForm1.Show vbModal
If Not UserForm1.IsCancelled Then
    '...
End If

当使用红色 X 按钮关闭表单和/或在代码隐藏中使用 Unload Me 时,使用默认实例可能会导致细微错误。

在其他地方实施逻辑

表单应该只关注表示 :一个连接到数据库并根据用户输入运行参数化查询的按钮 Click 处理程序正在做太多事情

相反,在代码中实现应用程序逻辑,该代码负责在专用模块和过程中显示表单,甚至更好。

编写代码的方式使得 UserForm 只负责知道如何显示和收集数据:数据来自何处,或之后数据发生的情况,都不是它的问题。

来电者不应该受到控制的困扰

为要使用的表单创建一个定义良好的模型,可以在其自己的专用类模块中,也可以封装在表单的代码隐藏本身中 - 使用 Property Get 过程公开模型,并让客户端代码使用这些:这使得形成对控件及其细节的抽象,仅将相关数据暴露给客户端代码。

这意味着代码如下所示:

With New UserForm1
    .Show vbModal
    If Not .IsCancelled Then
        MsgBox .Message, vbInformation
    End If
End With

而不是这个:

With New UserForm1
    .Show vbModal
    If Not .IsCancelled Then
        MsgBox .txtMessage.Text, vbInformation
    End If
End With

处理 QueryClose 事件

表单通常有一个 Close 按钮,提示/对话框 Ok 和 Cancel 按钮; 用户可以使用表单的控件框 (红色的 X 按钮) 关闭表单,默认情况下会破坏表单实例( 每次都使用新实例的另一个好理由 )。

With New UserForm1
    .Show vbModal
    If Not .IsCancelled Then 'if QueryClose isn't handled, this can raise a runtime error.
        '...
    End With
End With

处理 QueryClose 事件的最简单方法是将 Cancel 参数设置为 True,然后隐藏表单而不是关闭它:

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    Cancel = True
    Me.Hide
End Sub

这样,X 按钮永远不会破坏实例,并且调用者可以安全地访问所有公共成员。

隐藏,不要关闭

创建对象的代码应该负责销毁它:卸载和终止自身不是表单的责任。

避免在表单的代码隐藏中使用 Unload Me。改为调用 Me.Hide,这样调用代码仍然可以使用窗体关闭时创建的对象。

命名的东西

使用属性 toolwindow( F4 )仔细命名表单上的每个控件。控件的名称在代码隐藏中使用,因此,除非你使用可以处理此问题的重构工具,否则重命名控件将破坏代码 - 因此,首先要做的事情要比尝试更容易,而不是尝试准确地解决了 TextBox12 代表的 20 个文本框中的哪一个。

传统上,UserForm 控件以匈牙利风格的前缀命名:

  • lblUserName 用于指示用户名的 Label 控件。
  • txtUserName 用于 TextBox 控件,用户可以在其中输入用户名。
  • cboUserName 用于 ComboBox 控件,用户可以在其中输入或选择用户名。
  • lstUserName 用于 ListBox 控件,用户可以在其中选择用户名。
  • btnOkcmdOk 用于标记为 OkButton 控件。

问题是,当如用户界面被重新设计和 ComboBox 变为 ListBox,名称需要改变以反映新的控制型:这是最好的名字控制他们代表什么,而不是他们的控制类型之后 -对分离的来自 UI 的代码尽可能多。

  • UserNameLabel 用于指示用户名的只读标签。
  • UserNameInput 用于控件,用户可以在其中输入或选择用户名。
  • OkButton 用于标有 Ok 的命令按钮。

无论选择哪种风格,任何事情都比将所有控件保留为默认名称更好。命名风格的一致性也是理想的。