Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Forms Access 2007表单:撤消后的事件_Forms_Ms Access_Vba_Ms Access 2007_Keyevent - Fatal编程技术网

Forms Access 2007表单:撤消后的事件

Forms Access 2007表单:撤消后的事件,forms,ms-access,vba,ms-access-2007,keyevent,Forms,Ms Access,Vba,Ms Access 2007,Keyevent,我在Access 2007中有一个表单,它有一个“更新”例程,根据其他字段(文本框、复选框、组合框)中的值启用或禁用某些文本框。这一例行程序的正常运行效果良好 现在我发现按ESC键调用undo函数,该函数将恢复所有字段中的原始值。但此撤消操作不会调用这些字段上的事件,因此表单处于错误状态,文本框处于禁用/启用状态,尽管它们不应该处于禁用/启用状态 我还发现有一个undo事件,但这对我来说是无用的,因为它是在undo之前调用的。撤销后我需要一个事件。按下ESC键时,我可以在这里做些什么来更新字段?

我在Access 2007中有一个表单,它有一个“更新”例程,根据其他字段(文本框、复选框、组合框)中的值启用或禁用某些文本框。这一例行程序的正常运行效果良好

现在我发现按ESC键调用undo函数,该函数将恢复所有字段中的原始值。但此撤消操作不会调用这些字段上的事件,因此表单处于错误状态,文本框处于禁用/启用状态,尽管它们不应该处于禁用/启用状态


我还发现有一个undo事件,但这对我来说是无用的,因为它是在undo之前调用的。撤销后我需要一个事件。按下ESC键时,我可以在这里做些什么来更新字段?

好吧,就像我在发布问题后想出解决方案之前的很多次一样


这里的解决方案是在表单上启用KeyPreview并使用KeyUp事件。撤销是在KeyDown上调用的,因此当KeyUp被提升时,表单已经再次具有恢复的值,并且更新例程可以工作。

我更喜欢这个解决方案,因为它不仅可以在“ESC”-键上工作:


这个问题的另一个解决方案是使用每个控件的
OldValue
属性。通过实验,我发现控件的三种不同值属性在不同的情况下发挥作用:

  • 控件。值
    或简单地
    控件

    • 大多数时候控件的当前值
    • 当控件具有焦点时,它是控件在获得焦点之前具有的值
    • Form.Undo
      事件期间,它是控件在撤销之前的值
    • 控制期间相关。更新后
      控制。撤消
      事件
  • 控件.文本

    • 控件具有焦点时的值
    • 在用户键入时发生的事件期间相关,例如
      Control.Change
      Control.KeyUp
      Control.KeyDown
  • 控件.OldValue

    • 第一次打开当前记录时控件的值
    • 表单级撤消将控件重置为的值
    • 窗体期间相关。撤消
      事件
这个问题的基于计时器的答案是我的go-to解决方案,但是如果您已经在按照用户类型处理事件(例如,用于实时验证),那么这样的代码是合理的:

Private Sub LastName_Change()
    ValidateLastName SourceProperty:="Text"
End Sub

Private Sub LastName_Undo(Cancel As Integer)
    ValidateLastName SourceProperty:="Value"
End Sub

Private Sub Form_Undo(Cancel As Integer)
    ValidateLastName SourceProperty:="OldValue"
End Sub

Private Sub ValidateLastName(SourceProperty As Variant)
    Dim LastName As String
    Select Case SourceProperty
        Case "LastName"
            LastName = Nz(Me.LastName.Text, "")
        Case "Value"
            LastName = Nz(Me.LastName.Value, "")
        Case "OldValue"
            LastName = Nz(Me.LastName.OldValue, "")
        Case Else
            Debug.Print "Invalid case in ValidateLastName"
            Exit Sub
    End Select

    ' <Do something to validate LastName>
End Sub
Private Sub LastName\u Change()
ValidateLastName SourceProperty:=“文本”
端接头
私有子LastName_Undo(取消为整数)
ValidateLastName SourceProperty:=“值”
端接头
私有子表单\u撤消(取消为整数)
ValidateLastName SourceProperty:=“OldValue”
端接头
私有子ValidateLastName(SourceProperty作为变量)
将LastName设置为字符串
选择案例SourceProperty
案例“LastName”
LastName=Nz(Me.LastName.Text,“”)
案例“价值”
LastName=Nz(Me.LastName.Value,“”)
案例“OldValue”
LastName=Nz(Me.LastName.OldValue,“”)
其他情况
调试。打印“ValidateLastName中的无效大小写”
出口接头
结束选择
' 
端接头
请注意,此方法无法访问组合框/列表框的
Control.Column(x)
的post Form Undo值。您可以通过在
Control.OldValue
上使用
DLOOKUP
来获得它,但您最好还是使用基于计时器的解决方案

Private Sub LastName_Change()
    ValidateLastName SourceProperty:="Text"
End Sub

Private Sub LastName_Undo(Cancel As Integer)
    ValidateLastName SourceProperty:="Value"
End Sub

Private Sub Form_Undo(Cancel As Integer)
    ValidateLastName SourceProperty:="OldValue"
End Sub

Private Sub ValidateLastName(SourceProperty As Variant)
    Dim LastName As String
    Select Case SourceProperty
        Case "LastName"
            LastName = Nz(Me.LastName.Text, "")
        Case "Value"
            LastName = Nz(Me.LastName.Value, "")
        Case "OldValue"
            LastName = Nz(Me.LastName.OldValue, "")
        Case Else
            Debug.Print "Invalid case in ValidateLastName"
            Exit Sub
    End Select

    ' <Do something to validate LastName>
End Sub