|
参考资料:
Purpose:当我们想同时比较两个或多个记录时,建多个窗体实例是很好选择.
Method:一个简单的方法就是放一个命令按钮在窗体中,比如说窗体名叫frmClient,其中的命令按钮命名为cmdNewInstance,该窗体的模块中,你只需要写5行代码.
Dim frmMulti As Form
Private Sub cmdNewInstance_Click()
Set frmMulti = New Form_frmClient
frmMulti.SetFocus
End Sub
打开窗体并按这个按钮,第二个client form会打开在第一个之上,并且可以显示一个不同的clinet,第二个窗体也有一个按钮,所以你也可以打开第三个…..。
但是有二个问题,首先这些窗体并不是完全独立的,关闭第一个窗体,所有窗体都会关闭.单击第二个窗体的cmdNewInstance,第三,第四…个窗体会被替换掉.由于对象变量frmMulti被定义于窗体级模块中,每个实例只支持随后的窗体实例,所以会产生这种现象.其次对窗口实例的引用也是一个问题,窗体的集体会有多个同样名称的窗体,所以类似Forms.frmClient这样的引用会带来问题,而Forms(3)这类的引用也不具操作性,因为窗口的编号会随窗口的打开与关闭而相应改变.
解决以上问题,我们可以建立一个collection对象变量在一模块中(不是窗口模块),如basPublic模块,每打开一个窗口实例后添加一个条目,关闭一个实例就移去一个条目.每个实例现在就会彼此相对独立.它们是仅依赖于collection对象.而解决窗品的标识问题,我们可以用窗口的句柄来作标识.
范例:
Public clnClient As New Collection '定义存储窗口实例的集合变量
Function OpenAClient()
'Purpose: 建立frmClient的新实例.
Dim frm As Form
'打开并显示新实例,设置标题属性
Set frm = New Form_frmClient
frm.Visible = True
frm.Caption = frm.Hwnd & ", opened " & Now()
'添加窗口实例集合变量
clnClient.Add Item:=frm, Key:=CStr(frm.Hwnd)
Set frm = Nothing
End Function
Function CloseAllClients()
'关闭所有实例
Dim lngKt As Long
Dim lngI As Long
lngKt = clnClient.Count
For lngI = 1 To lngKt
clnClient.Remove 1
Next
End Function
CloseAllClients()显示了怎么关闭所有窗口实例,通过在clnclient集合变量移去它们.而如果用户关闭一个实例在应用介面,我们需要在窗体的Close事件中写一段代码.
Private Sub Form_Close()
'Purpose:移去当前实例
Dim obj As Object
Dim blnRemove As Boolean '移除标志.
'检查是当前窗口的句柄是否在集合变量中
For Each obj In clnClient
If obj.Hwnd = Me.Hwnd Then
blnRemove = True
Exit For
End If
Next
Set obj = Nothing
If blnRemove Then
clnClient.Remove CStr(Me.Hwnd)
End If
End Sub
|
|