|
本帖最后由 todaynew 于 2012-1-13 22:12 编辑
我一直对美女版友简的执着感到无奈,那是一种钻牛角尖和撞南墙的精神,呵呵。对于细节从来都有两种说法,一种是不拘泥细节,这说的是说需要有大局和宏观的意思。但同时也有一种说法,叫做魔鬼隐藏于细节,或者细节决定成败。这看起来有些矛盾,其实不然。其中的玄妙只是在于是何种细节,关键的细节当然是重要的。不过版友简的问题大多都是些无关大局的细节,我以为大可不必过多的钻研。
版友简这两日提出了一个关于必填控件为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
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|