<output id="os3gq"><ruby id="os3gq"></ruby></output>

    1. <mark id="os3gq"></mark>
    2. 關閉除剛打開的窗體以外的所有窗體的方法-錢玉煒
      Access軟件網QQ交流學習群(群號碼198465573),歡迎您的加入!
      首頁 >技術文章> 綜合其它


      關閉除剛打開的窗體以外的所有窗體的方法

      發表時間:2009/2/9 9:04:33 評論(1) 瀏覽(5379)  評論 | 加入收藏 | 復制
         
      摘 要:關閉除剛打開的窗體以外的所有窗體的方法
      正 文:

      問題詳述
      如果已經在屏幕上打開了若干個窗體,如何使用代碼一次性關閉除指定名稱之外的所有其他窗體?如果是保留多個指定名稱的窗體呢?

      專家解答
      所有打開的窗體都會添加到Forms集合中,如果要關閉打開的窗體,只需循環Forms集合里的對象,然后逐個關閉除指定名稱之外的窗體。不過這里有個比較技巧性的地方,那就是如何循環Forms集合里的對象才能正確關閉所有窗體。

       

      不能使用For i = 0 To Application.forms.count -1或For Each frm In Application.Forms這兩種方法,因為Forms集合的索引從零開始。如果按照索引引用窗體,則第一個打開的窗體是Forms(0),第二個打開的是Forms(1),依此類推。如果打開Form1,然后打開Form2,則Form2在Forms集合中的索引為Forms(1)。如果關閉Form1,Form2在Forms集合的索引將變為Forms(0),所以當有窗體打開和關閉時,Application.forms里的對象和索引時刻在變化著,而Application.forms.count的值也是變化的,所以使用上述兩種方法都無法正確關閉所有窗體。

       

      由于在任何時候都可以獲取到所有打開的窗體的個數,而窗體的索引是從0開始的,而最后一個窗體的序號永遠是窗體的個數減1,只要每次都關閉最后那個窗體,則循環所有窗體直到最后一個窗體之后,就能關閉所有打開的窗體,所以使用下面巧妙的方法來實現關閉所有窗體的功能。

       

      Dim intCount As Integer ''用來保存打開窗體的個數

      Dim i As Integer ''循環變量

      intCount = Application.forms.Count ''將打開窗體的個數保存到intCount變量

       


      For i = intCount - 1 To 0 Step -1 ''從大到小循環所有的窗體

      DoCmd.Close acForm, Application.forms(i).Name ''關閉最后那個窗體

      Next i

      上面的代碼實現關閉所有打開窗體的功能,如果要保留指定名稱的窗體,則創建一個新的函數并改進一下代碼。

       

      Private Function CloseAllForms(Optional rstrDontClose As String)

       


      Dim intCount As Integer ''用來保存打開窗體的個數

      Dim i As Integer ''循環變量

      intCount = Application.forms.Count ''將打開窗體的個數保存到intCount變量

       


      For i = intCount - 1 To 0 Step -1 ''從大到小循環所有的窗體

      If Application.forms(i).Name <> Nz(rstrDontClose) Then ''如果不是指定的窗體則關閉它

      DoCmd.Close acForm, Application.forms(i).Name ''關閉最后那個窗體

      End If

      Next i

       


      End Function

      然后再使用下面的代碼來調用這個函數,將要保留的窗體名傳遞過去。

       

      CloseAllForms "窗體2"
      程序執行后就會關閉除“窗體2”之外的所有已經打開的窗體。

       

      上面的方法只能指定一個窗體名稱,如果需要指定多個窗體不關閉,則需要從傳遞過來的參數中提取每個窗體的名稱,然后按照上述同樣的方法進行處理,改進后的代碼如下。

      Private Function CloseAllForms(Optional rstrDontClose As String)

      Dim varName As Variant ''存儲窗體名稱拆分后的數組變量

      Dim strFormName As String

      Dim intCount As Integer ''用來保存打開窗體的個數

      Dim i As Integer ''外循環變量

      Dim j As Integer ''內循環變量

      Dim blnDontClose As Boolean ''是否需要保留的窗體的標志

      intCount = Application.forms.Count ''將打開窗體的個數保存到intCount變量

      varName = Split(rstrDontClose, ",") ''將傳遞過來的參數按分隔符","拆分到數組varName

       


      For i = intCount - 1 To 0 Step -1 ''從大到小循環所有的窗體

      blnDontClose = False

      For j = 0 To UBound(varName) ''循環指定名稱的所有窗體

      If Application.forms(i).Name = Nz(varName(j)) Then ''如果是指定的窗體則設置標志

      blnDontClose = True

      Exit For

      End If

      Next

      If blnDontClose = False Then

      DoCmd.Close acForm, Application.forms(i).Name ''如果不在保留的窗體之列,則關閉窗體

      End If

      Next i

       


      End Function

      再使用下面的方法調用上面的函數,多個窗體名稱之間使用“,”符號隔開。

       

      CloseAllForms "窗體2,窗體4"

      專家點評
      從上面的分析得知,無法使用代碼在Forms集合中添加或刪除Form對象,系統自動維護Forms集合里的對象和索引,所以如果要引用Forms集合中特定的窗體,最好按窗體名稱來引用該窗體,而不是使用索引來引用窗體,因為窗體的集合索引可能隨時會改變。

       

      由于包含CloseAllForms "窗體2,窗體4" 這句代碼的窗體也是打開的窗體,所以在關閉時也會關閉這個窗體。另外,不管窗體是打開在設計視圖、窗體視圖、數據表視圖還是其他視圖,都是屬于打開的窗體,如果在設計視圖里的窗體還沒有保存,則在關閉時會提示是否保存窗體。

      對于Access的報表,也可使用類似的方法來處理,只不過,已打開的報表集合是“Reports”,而不是“Forms”。

       


      Access軟件網交流QQ群(群號:198465573)
       
       相關文章
      打開和關閉窗體事件順序過程(一)  【久石讓的粉絲  2013/7/16】
      窗體修改數據事件過程(二)  【久石讓的粉絲  2013/7/16】
      鎖定子窗體滾動條的位置  【蟹仔  2013/7/17】
      Access快速選定日期范圍值 窗體  【沈軍  2013/7/18】
      【Access基礎掃盲】窗體的數量合計  【小趙  2013/7/22】
       
       訪客評論
      總記錄:0篇  頁次:0/0 9 1 :
       
       發表評論
      評論內容 (必填)

      常見問答
      技術分類
      相關資源
      文章搜索
      關于作者

      錢玉煒

      文章分類

      文章存檔

      友情鏈接
       
         
      湖北11选5