2012-05-18 47 views
3

我正在尋找一個MS-Access窗體事件,它可以檢查窗體上的活動控件是否已更改爲另一個控件;當它運行一個小腳本時。活動控件更改事件 - MS Access

函數必須是隻在表單處於活動狀態時才能運行的函數(如單擊表單等)。然而,Form_Click()不起作用,因爲它不知道是不是同一個窗口..我不知道那裏發生了什麼。 Form_Click()也只適用於單擊表單件而不是控件(如記錄選擇器)的情況。此方法應該適用於所有控件,只有一種方法,而不是每個控件的一種方法。

我的代碼:

Private Sub <<Form_ActiveHasChanged()>> 
    desc = Forms(Me.Form.Name).Controls(Me.ActiveControl.Name).StatusBarText 
    Me.txtInfo.Caption = desc 
End Sub 

其中<<Form_ActiveHasChanged()>>是我的事件..是有辦法做到這一點?我不能使用定時器,就好像用戶從窗體導航離開,Me.ActiveControl不再在窗口中並引發錯誤。或者,如果有人知道檢查的方法:

If (Me.Form IS IN ACTIVE WINDOW) Then .... 
+0

失去焦點不適合嗎?之後,API可能適合。 – Fionnuala

+0

問題是我想讓它在窗體上的所有控件上工作;我有一些形式(無數標籤)的30多個控件。另外我相信Lost_Focus()也會受到「控件不在活動窗口」錯誤的影響。我會更多地澄清我的問題。 – StuckAtWork

回答

3

您可以通過使用WithEvents的類模塊來做到這一點。不幸的是,沒有事件附加到通用的Control對象,所以您將不得不爲每種不同類型的控件指定一個處理程序。我已經包含了三個常用控件來幫助您開始。

創建一個名爲weControlChange的新類模塊並將以下代碼粘貼到其中。然後按照類模塊頂部的使用註釋執行。

' Usage: 1. Add the following to the declaration section of the form module: 
'    Dim ControlChange As New weControlChange 
'  2. Add the following to the Form_Load OR Form_Open event: 
'    ControlChange.Setup Me.Form 
Option Compare Database 
Option Explicit 

Private WithEvents weTextBox As TextBox 
Private WithEvents weComboBox As ComboBox 
Private WithEvents weCheckBox As CheckBox 

Private CtlColl As Collection 

Public Sub Setup(Frm As Form) 
Dim Ctl As Control, CtlChng As weControlChange 
    Set CtlColl = New Collection 
    For Each Ctl In Frm.Section(acDetail).Controls 
    'For Each Ctl In Frm.Controls ''to include controls from all sections' 
     Select Case Ctl.ControlType 
     Case acTextBox, acComboBox, acCheckBox 
      If Ctl.Enabled And Ctl.Visible Then 
       Set CtlChng = New weControlChange 
       Set CtlChng.Control = Ctl 
       CtlColl.Add CtlChng 
      End If 
     End Select 
    Next Ctl 
End Sub 

Public Property Set Control(ByVal Ctl As Control) 
    Select Case Ctl.ControlType 
    Case acTextBox 
     Set weTextBox = Ctl 
     weTextBox.OnEnter = "[Event Procedure]" 
    Case acComboBox 
     Set weComboBox = Ctl 
     weComboBox.OnEnter = "[Event Procedure]" 
    Case acCheckBox 
     Set weCheckBox = Ctl 
     weCheckBox.OnEnter = "[Event Procedure]" 
    End Select 
End Property 

Private Sub weCheckBox_Enter() 
    MyScript weCheckBox 
End Sub 

Private Sub weComboBox_Enter() 
    MyScript weComboBox 
End Sub 

Private Sub weTextBox_Enter() 
    MyScript weTextBox 
End Sub 

Private Sub MyScript(Ctl As Control) 
    'Your code goes here 
End Function 

Private Sub Class_Terminate() 
Dim Ctl As Object 
On Error Resume Next 
    If Not CtlColl Is Nothing Then 
     For Each Ctl In CtlColl 
      Set Ctl = Nothing 
     Next Ctl 
     Set CtlColl = Nothing 
    End If 
End Sub 
2

您可以創建一個單一的事件處理程序,將其存儲在一個模塊中,然後簡單地設置成爲每一個單獨控制的OnExit事件。只需按Ctrl-A即可全部選中它們,打開「屬性」對話框並設置OnExit事件。大約需要20秒。

+0

最新評論,但這也應該工作..我不知道你可以多選和批處理設置屬性。新信息+1! – StuckAtWork

0

最簡單的方法是對每個控件使用OnEnter事件處理函數。