最佳实践
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
控件,用户可以在其中选择用户名。btnOk
或cmdOk
用于标记为Ok
的Button
控件。
问题是,当如用户界面被重新设计和 ComboBox
变为 ListBox
,名称需要改变以反映新的控制型:这是最好的名字控制他们代表什么,而不是他们的控制类型之后 -对分离的来自 UI 的代码尽可能多。
UserNameLabel
用于指示用户名的只读标签。UserNameInput
用于控件,用户可以在其中输入或选择用户名。OkButton
用于标有Ok
的命令按钮。
无论选择哪种风格,任何事情都比将所有控件保留为默认名称更好。命名风格的一致性也是理想的。