在MS Access VBA中确定下一个具有焦点的控件

时间:2015-07-31 18:09:52

标签: forms vba controls

了解操作的顺序,是否有办法让OnExit或OnLostFocus脚本知道点击了什么控件来获得焦点?

我有一个包含列表框的表单,您必须从中选择要保存的表单中输入的其余数据的项目,以便在打开表单时控件具有焦点。如果您单击任何其他控件而未从列表中选择项目,OnExit会向您发出警告,表示您尚未做出选择。

创建的问题是,如果您打开表单然后决定不想要它,则在关闭表单时会收到该消息(使用表单上的关闭按钮或内置的关闭按钮) )。

我希望能够告诉OnExit已经点击了关闭按钮或者表单本身正在关闭,所以不要显示无条目消息。

任何想法都会受到赞赏。

2 个答案:

答案 0 :(得分:0)

不是我知道的。

如果您的表单相当简单(不是很多控件。)将警告从onExit移到子表单。当他们获得焦点时,从其他控件中调用它。但不是从关闭按钮。

Dim bDidUserSelectSomething As Boolean

'In the list box 
Private sub ListBox1_Click()
    'Do some code here

    'Set the flag that they did something
    bDidUserSelectSomething = True
End sub

'When you enter the other controls, check if they have done what they should have.
Private Sub TextBox1_Enter()
    If bDidUserSelectSomething = False Then
        'Warning
    End If
End Sub

答案 1 :(得分:0)

考虑更改警告检查。

而不是列表框的OnExit()事件,在所有其他相关控件的BeforeUpdate()事件中添加验证。通常,此事件是进行验证检查的地方。

首先,在调用警告的表单后面构建一个通用函数:

Public Function WarningMessage() As Boolean
    If IsNull(Me.Listbox) Then
       Msgbox "Please first select an option in listbox.", vbExclamation, _
               "MISSING LISTBOX SELECTION"
       WarningMessage = True
    Else
       WarningMessage = False
    End If

End Function

然后将函数调用到每个控件:

Private Sub cntr1_BeforeUpdate(Cancel As Integer)
     Cancel = WarningMessage
End Sub

Private Sub cntr2_BeforeUpdate(Cancel As Integer)
     Cancel = WarningMessage
End Sub

...

从上面可以看出,如果列表框为null,则会显示消息并返回True,然后返回到控件的BeforeUpdate()子例程以取消更新。

现在,如果有太多的控件使这个可行。考虑在Form的OnCurrent()事件中隐藏除列表框之外的所有相关控件。更新列表框时,渲染其他控件可见。许多软件和Web应用程序都是这样动态运行的,以防止用户丢失重要字段。

Private Sub Form_Current()
  If IsNull(Me.listbox) Then
     Me.ctnrl1.Visible = False
     Me.ctnrl2.Visible = False
     Me.ctnrl3.Visible = False
     ...
  Else
     Me.ctnrl1.Visible = True
     Me.ctnrl2.Visible = True
     Me.ctnrl3.Visible = True
     ...
  End if
End Sub 

Private Sub listbox_AfterUpdate()
     Me.ctnrl1.Visible = True
     Me.ctnrl2.Visible = True
     Me.ctnrl3.Visible = True
     ...
End Sub