設(shè)為首頁收藏本站Access中國

Office中國論壇/Access中國論壇

 找回密碼
 注冊

QQ登錄

只需一步,快速開始

ACCESS管理多個同一窗體的實例

2015-5-3 17:33| 發(fā)布者: admin| 查看: 3055| 評論: 4|原作者: 大熊|來自: m.mzhfr.cn

摘要: 參考資料: Purpose:當(dāng)我們想同時比較兩個或多個記錄時,建多個窗體實例是很好選擇. Method:一個簡單的方法就是放一個命令按鈕在窗體中,比如說窗體名叫frmClient,其中的命令按鈕命名為cmdNewInstance,該窗體的模塊中 ...

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
發(fā)表評論

最新評論

引用 tmtony 2002-5-2 03:19
思想非常不錯,大熊,上次有關(guān)collection的討論就給用上啦,看來,學(xué)以致用是關(guān)鍵
引用 binbow_z 2002-5-6 03:38
好東東
引用 李力軍2 2015-7-5 16:43
很有啟發(fā)
引用 lintina892 2015-8-5 15:46
思想非常不錯

查看全部評論(4)

QQ|站長郵箱|小黑屋|手機版|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.

返回頂部