3

フォーム上のアクティブなコントロールが別のコントロールに変更されたかどうかを確認できる MS-Access フォーム イベントを探しています。小さなスクリプトが実行されるとき。

関数は、フォームがアクティブなとき (フォームのクリックなど) にのみ実行されるものでなければなりません。ただし、 Form_Click() は、どういうわけか同じウィンドウではないため機能しません..そこで何が起こっているのかわかりません。Form_Click() は、コントロール (レコード セレクターなど) ではなく、フォームの一部をクリックした場合にのみ機能します。このメソッドは、コントロールごとに 1 つのメソッドではなく、1 つのメソッドを持つすべてのコントロールで機能する必要があります。

私のコード:

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 ....
4

3 に答える 3

3

を使用してクラスモジュールを介してこれを行うことができますWithEvents。残念ながら、ジェネリックControlオブジェクトにはイベントが関連付けられていないため、異なる種類のコントロールごとにハンドラーを指定する必要があります。すぐに始められるように、3 つの一般的なコントロールを含めました。

という名前の新しいクラス モジュールを作成し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
于 2012-05-18T20:23:02.873 に答える
2

1 つのイベント ハンドラーを作成し、それをモジュールに格納してから、それをすべてのコントロールの OnExit イベントに個別に設定することができます。Ctrl-A を押してすべてを選択し、[プロパティ] ダイアログを開き、OnExit イベントを設定します。約20秒かかります。

于 2012-05-18T21:04:30.337 に答える
0

最も簡単な方法は、すべてのコントロールに対して OnEnter イベント ハンドラーを使用することです。

于 2012-05-21T07:27:02.310 に答える