Exit 事件正好在焦点从一个控件转移到同一窗体上另一个控件之前发生。
Private Sub object_Exit()
Object 窗体上控件的名称。
该事件仅适用于窗体上的控件,不适用于报表上的控件。该事件不适用于选项组中的复选框、选项按钮或切换按钮,仅适用于选项组本身。
若要在该事件发生时运行宏或事件过程,请将 OnExit 属性设置为宏的名称或 [事件过程]。
因为 Enter 事件发生在焦点移动到一个指定控件之前,所以可以使用 Enter 宏或事件过程来显示指示。例如,可以使用宏或事件过程来显示一个较小的窗体或消息框,以指出控件通常包含的数据类型,或给出如何使用控件的帮助。
Exit 事件发生在 LostFocus 事件之前。
与 LostFocus 事件不同,Exit 事件在窗体失去焦点时并不发生。例如,如果在窗体上选中复选框,然后单击报表。在选中复选框时,Enter 和 GotFocus 事件将发生;而在单击报表时,只有 LostFocus 事件发生,Exit 事件并没发生(因为焦点正移动到不同的窗口)。如果再次选中窗体上的复选框,以将复选框成为前台对象,GotFocus 事件发生,但是 Enter 事件并不发生(因为在窗体第一次激活时,控件已获得焦点)。Exit 事件只有在单击窗体上的另一个控件时才发生。
如果将焦点移动到窗体上的另一控件上,而且该控件在窗体上没有焦点,则窗体原来拥有焦点的控件的 Exit 和 LostFocus 事件将发生在焦点移到的控件的 Enter 和 GotFocus 事件发生之前。
如果使用鼠标将焦点从主窗体上的控件移动到该窗体的子窗体中的控件(子窗体上没有获得焦点的控件),则将发生下列事件:
Exit (主窗体上的控件)
ß
LostFocus (主窗体上的控件)
ß
Enter (子窗体上的控件)
ß
LostFocus(子窗体上焦点将移到的控件)
ß
GotFocus(子窗体上焦点将移到的控件)
ß
Enter (子窗体上焦点将移到的控件)
ß
GotFocus (子窗体上焦点将移到的控件)
如果子窗体上焦点将移到的控件以前有焦点,则控件的 Enter 事件和 GotFocus 事件均不发生,但是子窗体控件的 Enter 事件将发生。如果将焦点从子窗体上的控件移动到主窗体上的控件,子窗体上这个控件的 Exit 事件和 LostFocus 事件不发生,只有子窗体控件的 Exit 事件以及主窗体上控件的 Enter 事件和 GotFocus 事件发生。
注释 一般使用鼠标或按键(例如 Tab )将焦点移到另一控件上。这不但会使本主题讨论的事件发生,还将发生鼠标或键盘事件。
当发生 Enter 或 Exit 事件时,可以运行一个宏,该宏通过使用 GoToControl 操作根据控件中的数据来更改 Tab 顺序。例如,如果用户在“婚姻状态”字段中使用“单身”,则可以确保焦点不会移至“配偶姓名”字段。
可以在 Exit 宏中使用 CancelEvent 操作来取消退出控件。不能在 Enter 宏中使用 CancelEvent 操作取消 Enter 事件。但是,可以在 Enter 宏中使用 GoToControl 操作将焦点移至其他控件。
在下面的示例中,“LastName”文本框中包含两个事件过程。Enter 事件过程显示一条消息,告诉用户在文本框中能输入何种类型的数据;Exit 事件过程则显示一个对话框,询问用户是否应该在焦点移动到另一控件之前保存更改。如果用户单击“取消”按钮,Cancel 参数将设置为 True,这会将焦点移到文本框而不保存更改。如果用户选择“确定”按钮,则会保存更改,然后焦点会移动到另一控件上。
若要试用该示例,请将下列事件过程添加到包含名为“姓氏”文本框的窗体上。
Private Sub LastName_Enter()
MsgBox "Enter your last name."
End Sub
Private Sub LastName_Exit(Cancel As Integer)
Dim strMsg As String
strMsg = "You entered '" & Me!LastName _
& "' as your last name." & _
vbCrLf & "Is this correct?"
If MsgBox(strMsg, vbYesNo) = vbNo Then
Cancel = True ' Cancel exit.
Else
Exit Sub ' Save changes and exit.
End If
End Sub