所谓健壮的系统是指对于规范要求以外的输入能够判断出这个输入不符合规范要求,并能有合理的处理方式。软件健壮性是一个比较模糊的概念,但是却是非常重要的软件外部量度标准。软件设计的健壮与否直接反应了分析设计和编码人员的水平。即所谓的高手写的程序不容易死。 咱虽然不是什么高手,不过从自己刚做的机房收费系统屡屡败倒在文本框输入中,体会还是比较深的。
- 1、用户名登录。
那么结合SQL查询语句,如果避免了“'”和“=”,这些符号会直接造成语句的不正确,提示错误信息。可以实现如下:
Private Sub txtUserName_KeyPress(KeyAscii As Integer)
If KeyAscii = 39 Or KeyAscii = 61 Then
KeyAscii = 0
MsgBox "请不要输入非法字符", vbOKOnly + vbExclamation, "警告"
End If
End Sub
不知发现没有,这样确实保证了输入时的避免错误。可是万一用到右键粘贴,这招岂不就是歇菜了。
改进如下:
Private Sub txtUserName_KeyPress(KeyAscii As Integer)
Dim s As String
Dim i As Integer
For i = 1 To Len(txtUserName.Text)
s = Mid(txtUserName.Text, i, 1)
If s Like "'" Or s Like "=" Then
txtUserName = Replace(txtUserName.Text, s, "")
End If
Next
end sub
不过这样也不是万无一失。好多人在用文本框的文本做查询内容的时候都喜欢用Trim()函数,数据传递过程中的空格出现。结果是除了一个Bug,又增加了一个Bug。如果用户在注册的时候就用到了空格,并且数据保存类型是varchar,那么很可能没有匹配内容。解决方案就是要对存储和查询要有一个统一的规范:要么用户名不可以在开头和结尾输入空格,这样就可以继续用trim(),不过这样好像和用户的良好体验有冲突;再有就是不用trim,数据的存储类型要记得为varchar,用char的话不够定义的位数会自动补充空格,会出Bug。
- 2、密码控制。
不过要有位数的限制,这是一个很通有的报错点。数据类型设置的是7位,可是密码就是输入了10位,不出Bug才怪。我们就是要做好提醒并且做好完善的限制工作。
健壮的软件要经受的起任何变态的操作。- 3、小数输入。
在输入金额的时候,一开始我想限制为只能输入数字吧,可是,钱数不可能都是整数的啊,健壮要是以牺牲良好的用户体验那就得不偿失了,所以这个小数点还是必须的。
不过如何限制比较好呢?小数点之后限输入一位。
法一:
Private Sub txtCash_KeyPress(KeyAscii As Integer)
Dim s As String
s = InStr(txtCash, ".")
If s And Len(Mid(txtCash, s + 1)) > 0 Then KeyAscii = 0
End Sub
法二:
Private Sub txtCash_Change()
Dim S As String
Dim x() As String
If (IsNumeric(txtCash.Text)) Then
x = Split(txtCash.Text, ".")
If (UBound(x) >= 1) Then
If (Len(x(UBound(x))) > 1) Then
txtCash.Text = S
txtCash.SelStart = Len(txtCash.Text)
End If
End If
End If
S = txtCash.Text
End Sub
这两种是我找的,虽然基本实现了功能,可是禁不住测试。法一无法再次修改和输入,因为直接就禁用了键盘。法二在规规矩矩的前提下还可以,可是如果输入两个逗点,就无法限制了。在处理小数点的时候还要考虑鼠标的移动,以及可以修改补写整数部分。
改进代码:
Private Sub txtCash_Change()
Dim S As String
Dim i As Integer
Dim intStart As Integer
Dim intPos As Integer
'限制输入数字和小数点
For i = 1 To Len(txtCash.Text)
S = Mid(txtCash.Text, i, 1)
If S Like "[!0-9]" And Not S Like "." Then
txtCash.Text = Replace(txtCash.Text, S, "")
End If
Next i
'限制位数
intPos = InStr(txtCash, ".")
intStart = txtCash.SelStart
If intPos >= 1 Then
txtCash = Left(txtCash, intPos + 1)
If intStart > Len(txtCash) Then
txtCash.SelStart = Len(txtCash)
Else
txtCash.SelStart = intStart
End If
End If
End Sub
软件的健壮是我们的追求,同时不能阉割功能减少出错率,毕竟软件是做给用户看得,时刻想着为人民服务,越人性化才能推销出去。所以,我们要时刻多想想,一条条的把bug除掉。