【问题标题】:MS Access get sender textbox on KeyDown event in vbaMS Access在vba中的KeyDown事件上获取发件人文本框
【发布时间】:2017-08-04 05:19:26
【问题描述】:

我在 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 个相同的字段之间切换。

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

【问题讨论】:

    标签: vba forms ms-access ms-access-2007


    【解决方案1】:

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

    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 是当前的 TextBox,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
    

    【讨论】:

      【解决方案2】:

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

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

      然后在您的所有控件/文本框中,将参数传递给此过程:例如,您上面的事件将简单地传递 keycode,shift 作为对同一子的引用:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多