2012-05-18 3 views
3

폼의 활성 컨트롤이 다른 컨트롤로 변경되었는지 확인할 수있는 MS-Access 폼 이벤트를 찾고 있습니다. 작은 스크립트가 실행될 때.액티브 컨트롤 변경 이벤트 - MS 액세스

이 기능은 양식이 활성화되어있을 때만 실행되는 기능이어야합니다 (예 : 양식 클릭 등). 그러나, Form_Click()은 어떻게 든 같은 창문이 아니므로 작동하지 않습니다. 나는 거기에서 무슨 일이 일어나는지 알지 못합니다. Form_Click()은 컨트롤이 아닌 양식 조각 (예 : 레코드 선택기)을 클릭하는 경우에만 작동합니다. 이 메서드는 컨트롤마다 하나의 메서드가 아닌 모든 메서드에 사용할 수 있습니다.

내 코드 : <<Form_ActiveHasChanged()>> 내 이벤트 인

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

..이 할 수있는 방법이 있나요? 사용자가 양식에서 벗어나는 것처럼 타이머를 사용할 수 없으며 Me.ActiveControl이 더 이상 창에 없으며 오류가 발생합니다. 또는 누군가가 점검 할 방법을 알고 있다면 : WithEvents을 사용하는 클래스 모듈을 통해이를 수행 할 수 있습니다 :

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

로스트 포커스가 맞지 않습니까? 그 후에 API가 적합 할 수 있습니다. – Fionnuala

+0

문제는 양식의 모든 컨트롤에서 작동하기를 원합니다. 나는 몇몇 양식 (수 많은 탭)에서 30 개 이상의 컨트롤을 가지고있다. 또한 Lost_Focus() 또한 "컨트롤이 활성 창에 없습니다"라는 오류를 겪고 있다고 생각합니다. 나는 내 질문에 대해 좀 더 명확히 할 것이다. – StuckAtWork

답변

3

아쉽게도 일반 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 이벤트 처리기를 사용하는 것입니다.