【问题标题】:MS Access Multi-control KeyPress CTRL+A HandlerMS Access 多控制 KeyPress CTRL+A 处理程序
【发布时间】:2018-05-23 22:15:34
【问题描述】:

我有一个带有 10 多个文本控件的 Access 数据库。我想要一些代码来处理 CTRL + A KeyPress 事件。通常,在 Access 中按 CTRL + A 时,会选择 所有 记录。我的最终目标是让 CTRL + A 只选择该控件的文本(就像在浏览器的 URL 栏中按 CTRL + A ,它只选择那个文本),这样我就可以只删除那个控件的文本。我检查了this article,因为我想要可以处理任何文本框的东西(处理每个文本框的 KeyPress = 60+ 行代码)。有什么方法可以让我拥有一个 for-next 循环?

Function HandleKeyPress(frm As Form, KeyAscii As Integer, ByVal e As KeyPressEventArgs) 'should it be a function or a sub?
    For Each ctl In Me.Controls
        If KeyAscii = 1 Then    'I think this is CTRL + A?
            e.Handled = True    'Stop this keypress from doing anything in access
            focused_text_box.SelStart = 0
            focused_text_box.SelLength = Len(focused_text_box.Text)
        End If
    Next
End Function

除此之外,我怎样才能将文本框的名称传递给这个子/函数?

注意:如果您还没有注意到,我仍然是 VBA/Access 的菜鸟。

【问题讨论】:

  • 您是否将此代码放入 VBA 模块中?您是否运行了调试>编译?它在 KeyPressEventArgs 上出错。这似乎是一个 VB.net 类,Access VBA 无法识别它,除非有我需要激活的参考库。
  • 如果你想要的就是选择控件内容以便你可以删除它,然后直接删除而不选择control.text = ""
  • 我知道这很可能会导致错误,我只是不确定 VBA 中的等价物是什么。回想起来,我应该只是查一下,我很抱歉。

标签: ms-access vba ms-access-2016


【解决方案1】:

您当前的方法行不通,因为它包含多种在 VBA 中无法以这种方式工作的东西(如 June7 所述),并且由于表单 keydown 事件优先于文本框 keydown 事件

您可以改用以下代码(受this answer on SU 启发):

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
    If KeyCode = vbKeyA And Shift = acCtrlMask Then 'Catch Ctrl+A
        KeyCode = 0 'Suppress normal effect
        On Error GoTo ExitSub 'ActiveControl causes a runtime error if none is active
        If TypeOf Me.ActiveControl Is TextBox Then
            With Me.ActiveControl
                .SelStart = 0
                .SelLength = Len(.Text)
            End With
        End If
    End If
ExitSub:
End Sub

使用 VBA 或仅使用属性窗格将 Form.KeyPreview 属性设置为 True 非常重要,以允许此函数优先于默认行为。

【讨论】:

  • 谢谢你们!很抱歉,June7 一直不得不处理我的蹩脚问题!哈哈对不起六月
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-28
  • 2011-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-27
  • 1970-01-01
相关资源
最近更新 更多