Office中國(guó)論壇/Access中國(guó)論壇

 找回密碼
 注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

返回列表 發(fā)新帖
查看: 5424|回復(fù): 4
打印 上一主題 下一主題

[窗體] ACCESS FAQ問(wèn)答:管理多個(gè)同一窗體的多實(shí)例

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
1#
發(fā)表于 2002-5-1 22:42:00 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
參考資料:
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
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 分享淘帖 訂閱訂閱

點(diǎn)擊這里給我發(fā)消息

2#
發(fā)表于 2002-5-2 03:19:00 | 只看該作者
思想非常不錯(cuò),大熊,上次有關(guān)collection的討論就給用上啦,看來(lái),學(xué)以致用是關(guān)鍵
3#
發(fā)表于 2002-5-6 03:38:00 | 只看該作者

ACCESS FAQ問(wèn)答:管理多個(gè)同一窗體的多實(shí)例

好東東
4#
發(fā)表于 2015-7-5 16:43:01 | 只看該作者
很有啟發(fā)
回復(fù)

使用道具 舉報(bào)

5#
發(fā)表于 2015-8-5 15:46:06 | 只看該作者
思想非常不錯(cuò)
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則

QQ|站長(zhǎng)郵箱|小黑屋|手機(jī)版|Office中國(guó)/Access中國(guó) ( 粵ICP備10043721號(hào)-1 )  

GMT+8, 2025-7-17 00:32 , Processed in 0.099908 second(s), 28 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回復(fù) 返回頂部 返回列表