Access开发培训
网站公告
·Access专家课堂QQ群号:151711184    ·Access快速开发平台下载地址及教程    ·欢迎加入Access专家课堂微信群!    ·如何快速搜索本站文章|示例|资料    
您的位置: 首页 > 技术文章 > 源码示例

【access小品】大可不必--必填控件空值时不失去焦点示例

时 间:2012-01-13 22:03:40
作 者:煮江品茶   ID:10802  城市:武汉
摘 要:必填控件空值时不失去焦点示例
正 文:

  我一直对美女版友简的执着感到无奈,那是一种钻牛角尖和撞南墙的精神,呵呵。对于细节从来都有两种说法,一种是不拘泥细节,这说的是说需要有大局和宏观的意思。但同时也有一种说法,叫做魔鬼隐藏于细节,或者细节决定成败。这看起来有些矛盾,其实不然。其中的玄妙只是在于是何种细节,关键的细节当然是重要的。不过版友简的问题大多都是些无关大局的细节,我以为大可不必过多的钻研。

  版友简这两日提出了一个关于必填控件为null时不得失去焦点的问题,这个问题在我看来并不重要。把数据表中的字段设置为必填应该就可以了。这样做的差别仅仅在于,整条记录更新时,系统将作出提示。同样可以保证必填字段的数据不出现null,因此说这是一个非关重要的细节。

  不过对于版友简的问题,讨论的版友很多,给出了许多种的答案,似乎版友简都不大满意。于是乎我觉得这是一个同志们都感兴趣的问题,便觉得可以做一个示例供大家参考。不过这个问题探讨的层度需要进一步加深,我想推导出处理的整体思路来。这个问题的处理有以下的逻辑:

  1、一个控件不失去焦点,可以理解为除这个控件外,其他控件一旦获得焦点事件触发,都将导致该控件获得焦点。这是一个有意思的反向思维,这种思维内涵了佛学的“舍得”,也揭示了人人为我我为人人的科学发展观。

  2、控件的输入过程是有一定秩序的,这种秩序体现在控件的TabIndex属性上。TabIndex属性不一定与控件的位置或者建立的前后相关,原因在于TabIndex属性是可以调整的。因此当前不能失去焦点的那个控件,就是其值为null且TabIndex值最小的控件。

  3、当窗体控件繁多时(记得版友简同志善于这样做),逐一编写各个控件的获得焦点事件是一件不道德的事件。简化相同的控件事件处理的捷径,是在窗体加载时给控件的事件赋值为一个函数。

  依据以上的逻辑,这个问题的一种有效而简洁的处理方法便隆重推出了。

点击下载此附件

 


Private Sub Form_Load()
Dim ctrls As Controls
Dim ctrl As Control
Set ctrls = Me.Controls
For Each ctrl In ctrls
    If ctrl.ControlType = acTextBox or ctrl.ControlType = acComboBox Then
        ctrl.OnGotFocus = "=CtrlSetFocus()"
    End If
Next
End Sub

Function CtrlSetFocus()
Dim ctrls As Controls
Dim ctrl As Control
Dim i As Integer, m As Integer
m = 100
Set ctrls = Me.Controls

For i = 0 To ctrls.Count - 1
    'ControlType可根据需要进一步枚举,也可再套一层If用于排除非必填控件。
    If ctrls(i).ControlType = acTextBox or ctrls(i).ControlType = acComboBox Then
        If IsNull(ctrls(i).Value) = True Then
            If ctrls(i).TabIndex < m Then
                Set ctrl = ctrls(i)
                m = ctrls(i).TabIndex
            End If
        End If
    End If
Next
If m <> 100 Then
    ctrl.SetFocus
End If
End Function



Access软件网QQ交流群 (群号:54525238)       Access源码网店

常见问答:

技术分类:

相关资源:

专栏作家

关于我们 | 服务条款 | 在线投稿 | 友情链接 | 网站统计 | 网站帮助