UserForm是一种交互界面,方便与用户交互。如果设计了一个这样的交互界面:需要用户输入名称,然后根据名称来运行程序,那么应该如何实现?
最简单的方法自然是在普通模块设置一个公用变量,在UsefForm内部使用这个变量来接收设置的值,然后再执行其他程序。
首先,设置窗体界面:
公用模块:
Public sName As String
Sub TestUserFrom()
FInputName.Show
'要执行的程序…………
MsgBox sName
End Sub
窗体代码:
Private Sub btnOK_Click()
sName = tbName.Text
Unload Me
End Sub
Private Sub btnCancel_Click()
Unload Me
End Sub
这种设计存在的问题:窗体内部的代码依赖了外部的变量,这里举的例子比较简单,只有一个变量,如果设计的是一个较为复杂的窗体,变量很多的情况下,一旦需要复用窗体到其他程序,这时候,还要把普通模块中的变量一起复制过去。
所以,上面这种设计是不合适的,作为这个只需要对外传递某些数据的窗体来说,它的功能应该仅仅是对外传递数据,不依赖外部变量,不包含逻辑代码,它就是一个独立的对象,能够对外提供接口读取数据,这就是类了。
窗体本身就是一种特殊的类,只是它多了一个交互界面,类的那些特性窗体是都具有的,所以,根据类的设计方法,给这个窗体设置一个可以读取的属性UserName:
'设置只读属性
Property Get UserName() As String
UserName = tbName.Text
End Property
Private Sub btnOK_Click()
'隐藏窗体
Me.Hide
End Sub
Private Sub btnCancel_Click()
tbName.Text = ""
Me.Hide
End Sub
这里必须用Me.Hide这种隐藏的方式,如果使用Unload Me,会销毁窗体,那么TextBox设置的内容也会被销毁,读取属性也会出错。
外部普通模块调用的时候,就像是使用一个普通的类一样:
Sub TestUserFrom()
Dim f As FInputName
'创建窗体实例
Set f = New FInputName
'显示窗体
f.Show
Dim sName As String
'获取设置的名称
sName = f.UserName
If sName <> "" Then
'要执行的程序…………
MsgBox sName
End If
Set f = Nothing
End Sub
这样,这个窗体就是一个独立完整的东西,可以在其他任何需要的地方直接调用它,然后读取它设置的数据。