Access911.net   |   a9BBS   |   OTaA System  
  搜索文章︰  
Access911歡迎您光臨  
   主頁      上傳      简体版       論壇     
設為首頁  |  加入收藏   
  
你現在的位置︰文章索引 -> 文章分類 -> 窗体  
 首頁|  近日更新|  下載  |  文章索引  |  搜索|  朮語|  承接工程|  
 
系統正在加載內容,請耐心等待...
 
 查詢
 窗体
 報表
 
 
 VBA
 函數
 ADO/DAO/ADO.NET
 API
 ADP
 安全
 發布
 OA
 ASP/ASP.NET
 其他語言
 控件
 DELPHI
 C#/.Net
 本站
 其他
 小例程
 常用軟件
 參考文檔
 業主作品
 网友大作
 
 
友情鏈接
 access911.net
 
訪問人次
 1701847
 
站長 E-Mail
 net911@sina.com
 access911@gmail.com
 
RSS 訂閱

顯示附加信息 >>>

如何為所有窗体的文本框定義多個公共事件?

作者︰cg1  摘自︰access911.net  ︰cg1  更新日期︰2012-5-13  瀏覽人次︰

 

問題︰

需要為所有的窗体的所有的文本框的獲得焦點事件定義2個以上的公共方法,但是我不想一個一個去定義,該如何操作?有沒有一次性就可以全部定義的方法?

 

回答︰


方法有很多,最簡單的就是直接用Controls循環得到窗体的所有控件并定義文本框的 OnGotFocus="過程名"。但是這樣只能定義一個方法,而且傳參比較麻煩,不能按地址傳對象。

另一個方法就是用 WithEvents 來委托控件的事件,但是ACCESS的form和control比較特別,需要額外設定 On....="[Event Procedure]" 否則這個事件是不會被觸發的。

Access2010 示例下載︰
http://access911.net/down/eg/eg_withevents.rar
(37.7KB)


基本操作方法如下︰

1、寫一個公共的類模塊,類模塊公共部分 public withevents t as treeview
類里面寫 on....方法

2、在需要調用這個類的窗体的公共部分 dim c(11) as new clsComm

3、在這個窗体的 form_load 用controls列舉出需要委托事件的控件,放入這個類,也就是
dim i as long 
for each ctl in me.controls
    i=i+1
    set c(i).t = ctl
next


圖片如下︰
按此在新窗口瀏覽圖片

圖片如下︰
按此在新窗口瀏覽圖片

圖片如下︰
按此在新窗口瀏覽圖片

實際代碼如下︰

類模塊 clsComm
Option Compare Database
Public WithEvents t As Access.TextBox
Public WithEvents t2 As Access.TextBox


Private Sub t_GotFocus()
    Debug.Print "first:" & Now
    t.Text = "first:" & Now
End Sub

Private Sub t2_GotFocus()
    Debug.Print "second :" & Now()
    
    t2.Text = "second :" & Now() & vbCrLf & t2.Text
End Sub



窗体2
Option Compare Database
Dim c(11) As clsComm

Private Sub Command0_Click()
    Dim i As Long
    Dim ctl As Control
    
    
    
    If IsFormLoad("窗体1") = False Then
        DoCmd.OpenForm "窗体1"
    End If
    For Each ctl In Forms("窗体1").Controls
        i = i + 1
        
        Debug.Print ctl.Name
        If TypeOf ctl Is TextBox Then
            Set c(i) = New clsComm
            Set c(i).t = ctl
            '注意,ACCESS FORM 的机制和普通UserForm不一樣,所以
            'clsComm中這個文本框要觸發哪個事件,在這里的 t.On... = "[Event Procedure]"
            '否則這個事件是不會被觸發的。
            c(i).t.OnGotFocus = "[Event Procedure]"
            Debug.Print c(i).t.OnGotFocus
            '注意,將文本框委托2遍,它會分別觸發2個不同的事件。
            Set c(i).t2 = ctl
        End If
    Next
End Sub

Private Function IsFormLoad(ByVal formName As String) As Boolean
    Dim f As Form
    For Each f In Application.Forms
        If f.Name = formName Then
            IsFormLoad = True
            Exit For
        End If
        
    Next
    

End Function

Private Sub Command1_Click()
On Error Resume Next
    Dim i As Long
    For i = 0 To UBound(c) - 1
        Debug.Print c(i).t.Name, i
    Next
End Sub

Private Sub Command2_Click()
On Error Resume Next
    Dim i As Long
    For i = 0 To UBound(c) - 1
        Debug.Print c(i).t.Name, i
        '從委托列表中取消第一個委托的對象(或事件)
        If TypeOf c(i).t Is Access.TextBox Then
            Set c(i).t = Nothing
        End If
    Next
    
End Sub


 

本站文章旨在為該問題提供解決思路及關鍵性代碼,并不能完成應該由网友自己完成的所有工作,請网友在仔細看文章并理解思路的基礎上舉一反三、靈活運用。

access911.net 原創文章,作者本人對文章保留一切權利。
如需轉載必須征得作者同意并注明本站鏈接

 

 
相關文章
     沒有手動相關文章
 
評論
     查看或發表更多的評論,請單擊這里。
 
 
 
 
 
   
  Access911.net   |   a9BBS   |   OTaA System   |
建站日期︰2000年4月2日  |  設計施工︰陳格 ( access911 & cg1 )
 Copyright © 2000 - 2003 COMET, 陳格 保留所有權利