Purpose:當(dāng)我們想同時比較兩個或多個記錄時,建多個窗體實例是很好選擇. Method:一個簡單的方法就是放一個命令按鈕在窗體中,比如說窗體名叫frmClient,其中的命令按鈕命名為cmdNewInstance,該窗體的模塊中,你只需要寫5行 代碼. Dim frmMulti As Form Private Sub cmdNewInstance_Click() Set frmMulti = New Form_frmClient frmMulti.SetFocus End Sub 打開窗體并按這個按鈕,第二個client form會打開在第一個之上,并且可以顯示一個不同的clinet,第二個窗體也有一個按鈕,所以你也可以打開第三個…..。 但是有二個問題,首先這些窗體并不是完全獨立的,關(guān)閉第一個窗體,所有窗體都會關(guān)閉.單擊第二個窗體的cmdNewInstance,第三,第四…個窗體會被替換掉.由于對象變量frmMulti被定義于窗體級模塊中,每個實例只支持隨后的窗體實例,所以會產(chǎn)生這種現(xiàn)象.其次對窗口實例的引用也是一個問題,窗體的集體會有多個同樣名稱的窗體,所以類似Forms.frmClient這樣的引用會帶來問題,而Forms(3)這類的引用也不具操作性,因為窗口的編號會隨窗口的打開與關(guān)閉而相應(yīng)改變. 解決以上問題,我們可以建立一個collection對象變量在一模塊中(不是窗口模塊),如basPublic模塊,每打開一個窗口實例后添加一個條目,關(guān)閉一個實例就移去一個條目.每個實例現(xiàn)在就會彼此相對獨立.它們是僅依賴于collection對象.而解決窗品的標識問題,我們可以用窗口的句柄來作標識.
范例: Public clnClient As New Collection '定義存儲窗口實例的集合變量 Function OpenAClient() 'Purpose: 建立frmClient的新實例. Dim frm As Form '打開并顯示新實例,設(shè)置標題屬性 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() '關(guān)閉所有實例 Dim lngKt As Long Dim lngI As Long lngKt = clnClient.Count For lngI = 1 To lngKt clnClient.Remove 1 Next End Function CloseAllClients()顯示了怎么關(guān)閉所有窗口實例,通過在clnclient集合變量移去它們.而如果用戶關(guān)閉一個實例在應(yīng)用介面,我們需要在窗體的Close事件中寫一段代碼. Private Sub Form_Close() 'Purpose:移去當(dāng)前實例 Dim obj As Object Dim blnRemove As Boolean '移除標志. '檢查是當(dāng)前窗口的句柄是否在集合變量中 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-7-13 05:28 , Processed in 0.102347 second(s), 23 queries .
Powered by Discuz! X3.3
© 2001-2017 Comsenz Inc.