了解操作的顺序,是否有办法让OnExit或OnLostFocus脚本知道点击了什么控件来获得焦点?
我有一个包含列表框的表单,您必须从中选择要保存的表单中输入的其余数据的项目,以便在打开表单时控件具有焦点。如果您单击任何其他控件而未从列表中选择项目,OnExit会向您发出警告,表示您尚未做出选择。
创建的问题是,如果您打开表单然后决定不想要它,则在关闭表单时会收到该消息(使用表单上的关闭按钮或内置的关闭按钮) )。
我希望能够告诉OnExit已经点击了关闭按钮或者表单本身正在关闭,所以不要显示无条目消息。
任何想法都会受到赞赏。
答案 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