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 |
|站长邮箱|小黑屋|手机版|Office中国/Access中国
( 粤ICP备10043721号-1 )
GMT+8, 2025-4-1 00:14 , Processed in 0.087193 second(s), 24 queries .
Powered by Discuz! X3.3
© 2001-2017 Comsenz Inc.