技術(shù) 點(diǎn)
- 技術(shù)
- 點(diǎn)
- V幣
- 點(diǎn)
- 積分
- 29323
|
參考資料:
Purpose:當(dāng)我們想同時(shí)比較兩個(gè)或多個(gè)記錄時(shí),建多個(gè)窗體實(shí)例是很好選擇.
Method:一個(gè)簡(jiǎn)單的方法就是放一個(gè)命令按鈕在窗體中,比如說(shuō)窗體名叫frmClient,其中的命令按鈕命名為cmdNewInstance,該窗體的模塊中,你只需要寫(xiě)5行代碼.
Dim frmMulti As Form
Private Sub cmdNewInstance_Click()
Set frmMulti = New Form_frmClient
frmMulti.SetFocus
End Sub
打開(kāi)窗體并按這個(gè)按鈕,第二個(gè)client form會(huì)打開(kāi)在第一個(gè)之上,并且可以顯示一個(gè)不同的clinet,第二個(gè)窗體也有一個(gè)按鈕,所以你也可以打開(kāi)第三個(gè)…..。
但是有二個(gè)問(wèn)題,首先這些窗體并不是完全獨(dú)立的,關(guān)閉第一個(gè)窗體,所有窗體都會(huì)關(guān)閉.單擊第二個(gè)窗體的cmdNewInstance,第三,第四…個(gè)窗體會(huì)被替換掉.由于對(duì)象變量frmMulti被定義于窗體級(jí)模塊中,每個(gè)實(shí)例只支持隨后的窗體實(shí)例,所以會(huì)產(chǎn)生這種現(xiàn)象.其次對(duì)窗口實(shí)例的引用也是一個(gè)問(wèn)題,窗體的集體會(huì)有多個(gè)同樣名稱(chēng)的窗體,所以類(lèi)似Forms.frmClient這樣的引用會(huì)帶來(lái)問(wèn)題,而Forms(3)這類(lèi)的引用也不具操作性,因?yàn)榇翱诘木幪?hào)會(huì)隨窗口的打開(kāi)與關(guān)閉而相應(yīng)改變.
解決以上問(wèn)題,我們可以建立一個(gè)collection對(duì)象變量在一模塊中(不是窗口模塊),如basPublic模塊,每打開(kāi)一個(gè)窗口實(shí)例后添加一個(gè)條目,關(guān)閉一個(gè)實(shí)例就移去一個(gè)條目.每個(gè)實(shí)例現(xiàn)在就會(huì)彼此相對(duì)獨(dú)立.它們是僅依賴(lài)于collection對(duì)象.而解決窗品的標(biāo)識(shí)問(wèn)題,我們可以用窗口的句柄來(lái)作標(biāo)識(shí).
范例:
Public clnClient As New Collection '定義存儲(chǔ)窗口實(shí)例的集合變量
Function OpenAClient()
'Purpose: 建立frmClient的新實(shí)例.
Dim frm As Form
'打開(kāi)并顯示新實(shí)例,設(shè)置標(biāo)題屬性
Set frm = New Form_frmClient
frm.Visible = True
frm.Caption = frm.Hwnd & ", opened " & Now()
'添加窗口實(shí)例集合變量
clnClient.Add Item:=frm, Key:=CStr(frm.Hwnd)
Set frm = Nothing
End Function
Function CloseAllClients()
'關(guān)閉所有實(shí)例
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)閉所有窗口實(shí)例,通過(guò)在clnclient集合變量移去它們.而如果用戶關(guān)閉一個(gè)實(shí)例在應(yīng)用介面,我們需要在窗體的Close事件中寫(xiě)一段代碼.
Private Sub Form_Close()
'Purpose:移去當(dāng)前實(shí)例
Dim obj As Object
Dim blnRemove As Boolean '移除標(biāo)志.
'檢查是當(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
|
|