MS Access 在 vba 中的 KeyDown 事件中获取发件人文本框

MS Access get sender textbox on KeyDown event in vba

我在 MS Access 2007 中的表单上有 KeyDonw 事件处理程序,我用它代替掩码,因为它们的工作方式不像我需要的那样。

这是我的代码:

Private Sub date_rogd_s_d_KeyDown(KeyCode As Integer, Shift As Integer)
    If ([Forms]![aForm].Form.date_rogd_s_d.SelLength = 2) Then
        [Forms]![aForm].Form.date_rogd_s_d.Text = ""
    End If

    If (val([Forms]![aForm].Form.date_rogd_s_d.Text) > 31) Then
        Select Case KeyCode
           Case vbKeyDelete, vbKeyBack, vbKeyReturn
                X = Y
                Exit Sub
        Case Else
            KeyCode = 0
            Exit Sub
        End Select
    End If


    If (Len([Forms]![aForm].Form.date_rogd_s_d.Text) < 2) Then
        Select Case KeyCode
            Case 48, 49, 50, 51, 52, 53, 54, 55, 56, 57
            Case 96, 97, 98, 99, 100, 101, 102, 103, 104, 105
           Case vbKeyDelete, vbKeyBack, vbKeyReturn
            X = Y
        Case Else
            KeyCode = 0
        End Select
    Else
        Select Case KeyCode
           Case vbKeyDelete, vbKeyBack, vbKeyReturn
                X = Y
                Exit Sub
        End Select
        [Forms]![aForm].Form.date_rogd_s_m.SetFocus
    End If
End Sub

这段代码工作得很好,但我还有 5 个相同的字段需要在它们之间切换。

获取事件发送者的任何方法,我的意思是按键内的文本框对象,我想为所有文本框创建通用函数,我不想复制粘贴此代码。

将您的程序重命名为这个,保留所有其余代码:

Private Sub On_KeyDown(KeyCode As Integer, Shift As Integer)

然后在你的所有 controls/textboxes 中,将参数传递给此过程:例如,你上面的事件将简单地传递键码,shift 作为对同一子的引用:

Private Sub date_rogd_s_d_KeyDown(KeyCode As Integer, Shift As Integer)
 Call On_KeyDown(KeyCode, Shift)
End Sub

我用这个函数解决了这个问题:

Private Sub onKeyDownForDateFields(KeyCode As Integer, Shift As Integer, Sender As Object, NextObject As Object, count As Integer, maxValue As Integer, Is_submit As Boolean)
    If (Sender.SelLength = count) Then
        Sender.Text = ""
    End If

    If (val(Sender.Text) > maxValue) Then
        Select Case KeyCode
           Case vbKeyDelete, vbKeyBack
                X = Y
                Exit Sub
        Case Else
            KeyCode = 0
            Exit Sub
        End Select
    End If


    If (Len(Sender.Text) < count) Then
        Select Case KeyCode
            Case 48, 49, 50, 51, 52, 53, 54, 55, 56, 57
            Case 96, 97, 98, 99, 100, 101, 102, 103, 104, 105
           Case vbKeyDelete, vbKeyBack, vbKeyReturn
            X = Y
        Case Else
            KeyCode = 0
        End Select
    Else
        Select Case KeyCode
           Case vbKeyDelete, vbKeyBack
                X = Y
                Exit Sub
            Case vbKeyReturn
                Êíîïêà48_Click
                Exit Sub
        End Select
        If (Is_submit = True) Then
            Êíîïêà48_Click
        Else
            NextObject.SetFocus
        End If
    End If
End Sub

其中 Sender 是当前文本框和 NextObject 我接下来需要关注的对象。

它还会测试是否在文本框中输入了最大数量的符号,例如它是否没有达到允许的最大数量,例如 31 天。

现在,如果我需要处理事件,我会这样做:

Private Sub date_rogd_s_d_KeyDown(KeyCode As Integer, Shift As Integer)

  onKeyDownForDateFields KeyCode, Shift, [Forms]![aForm].Form.date_rogd_s_d, [Forms]![aForm].Form.date_rogd_s_M, 2, 31, False  

End Sub