加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

vb 自定义格式输入文本框

(2014-11-18 07:59:30)
标签:

股票

分类: 编程相关

凡用过VB的读者都知道,VB中有一个文本框(TextBox控件),它可显示设计时程序员输入的或运行时用户输入的或在代码中赋予的信息(包括字母、数字和其他符号)。但在很多场合我们需要的仅仅是数值数据,这时在TextBox中无意输入的非数值数据就会给我们带来不便,因此需将非数值信息过滤掉。为实现这一目标,我们设计一个只能输入数值的“数值框”。

初步设想与比较

设计时,我们通常采用IsNumeric函数来判断文本框的信息是不是数值,但是这个函数有一些不足:若在TextBox控件的Change事件过程中用IsNumeric函数来判断,在空文本框中输入“+”、“-”、“.”(正负号、小数点)时,它会将这些符号认为是非数值从而加以拒绝,而逗号、分节号处于非首位时,无论多少个均认为是合法数值,这显然不符合实际,在参加数学运算时也会出错;若将函数放在TextBox控件的Validate事件(VB6新增)过程中,则多少有点“事后诸葛亮”之嫌,因为该事件是在焦点转换到另一个控件之前才发生。

当然,我们还可以在TextBox控件的KeyPress事件过程中进行过滤,这时,需对“+”、“-”、“.”出现的个数及位置加以控制,对其他非数字符号加以拒绝。但这个方法也有一个致命弱点,就是无法控制从剪贴板中粘贴来的数据。

实现步骤和方法

为了使进入TextBox中的数据全为“数值”,我们综合上述前后两种方法,即可达到我们的目的:

1.新建一标准EXE工程。

2. 在窗体Form1的适当位置放置一个适当大小的文本框(Text1)。

3.在窗体Form1的代码窗口Text1_KeyPress过程中输入下列代码:

Private Sub Text1_KeyPress(KeyAscii As Integer)

’相关字符的ASCII码

’字符: (退格键) +(正号),(逗号) -(负号)

’Ascii: 8 43 44 45

’字符: .(小数点) /(斜杠) 0~9

’ Ascii: 46 47 48~57

’退格键有效

If KeyAscii = 8 Then Exit Sub

’正号(+)、负号(-)、小数点及数字以外的字符视为无效键入

If KeyAscii < Asc(“+”) Or KeyAscii = Asc(“,”) Or KeyAscii = Asc(“/”) Or KeyAscii > Asc(“9”) Then

KeyAscii = 0

Exit Sub

End If

’正负号(未被选取)前不能再键入字符

If Left(Text1.Text, 1) = “+” Or Left(Text1.Text, 1) = “-” Then

If Text1.SelStart=0 Then

If InStr(Text1.SelText, “+”) = 0 And InStr(Text1.SelText, “-”) = 0 Then

KeyAscii = 0

Exit Sub

End If

End If

End If

’键入小数点

If KeyAscii = Asc(“.”) Then

’原TextBox中已有小数点

If InStr(Text1.Text, “.”) > 0 Then

’原TextBox中的小数点未被选取,作为无效处理(不能有两个小数点)

If InStr(Text1.SelText, “.”) = 0 Then

KeyAscii = 0

End If

’原TextBox中的小数点已被选取(选取的部分将被替换),键入有效

End If

’原TextBox中没有小数点,键入有效,可以是首位

Exit Sub

End If

’键入正号或负号

If KeyAscii = Asc(“+”) Or KeyAscii = Asc(“-”) Then

’原TextBox中已有正号或负号

If InStr(Text1.Text, “+”) > 0 Or InStr(Text1.Text, “-”) > 0 Then

’原TextBox中的正负号未被选取,作为无效处理(不能有两个正负号)

If InStr(Text1.SelText, “+”) = 0 And InStr(Text1.SelText, “-”) = 0 Then

KeyAscii = 0

End If

’原TextBox中的正号或负号已被选取(选取的部分将被替换),键入有效

Else ’原TextBox中没有正号或负号

’光标不位于首位,正号或负号也无效

If Text1.SelStart > 0 Then

KeyAscii = 0

End If

’光标只有在首位时正号或负号才键入有效

End If

End If

End Sub

4.在代码窗口的Text1_Change过程中输入下列代码:

Private Sub Text1_Change()

Static a As String ’暂存文本框中的数据

Static i As Integer ’光标位置变量

’允许清空TextBox,允许首先键入的是

“+”、“-”

If Text1.Text = “” Or Text1.Text =

“+” Or Text1.Text = “-” Then

’保存目前数据

a = Text1.Text

Exit Sub

End If

’若文本改变后的内容为非数值类型,则键入或粘贴的数据无效

If Not IsNumeric(Text1.Text) Then

’保存光标原来位置

i = Text1.SelStart-Len(Text1.Text) + Len(a)

’恢复原数据

Text1.Text = a

’恢复光标位置

If i < 0 Then i = 0

Text1.SelStart = i

End If

’保存目前数据

a = Text1.Text

End Sub

代码输入完毕,按F5运行,这时在Text1中不论是键入还是粘贴数据,它只能“容”下数值,而对其他数据一概拒之“框”外。

控件制作及使用

由上述过程可知,Text1中的数据虽是“数值”,但其数据类型仍然是String,因此只能说是一个“伪数值框”。为使之成为一个真正的数值框,更重要的是为解决今后遇到的同样问题,下面我们用制作控件的方法来实现。

1.选择菜单“文件/新建工程”打开“新建工程”对话框(这将关闭当前工程或工程组,系统会提示保存所做的修改。注意:上面的代码下面还会用到)。双击“ActiveX 控件”图标创建一新工程。

2.在“属性”窗口中双击“名称” ,把用户控件名称“UserControl1”改为“NumberBox”。

3.选择菜单“工程/工程1 属性”,打开“工程属性” 对话框。选“通用”选项卡,工程名称中填: “数值框”(不要与控件名相同); 工程描述中填:“ActiveX 控件_数值框”,其他取默认值,然后单击“确定”。

4.在工具箱中双击“TextBox”图标,将一文本框(Text1)加载到“控件设计器”窗口的控件容器中(位置与大小由下面的代码确定)。并将其Text属性改为0(作为默认值),再为属性“ToolBoxBitmap”选择或制作(可用画图程序)一个能代表控件特点的图形(将以它作为工具箱中该控件的图标)。

5.打开控件的代码窗口,将上述两个过程代码完整地添加到该窗口,并再添加下列代码:

Private Sub UserControl_InitProperties()

’控件的初始大小

UserControl.Width = 1600

UserControl.Height = 400

End Sub

Private Sub UserControl_Resize()

’让Text1占据整个控件容器

Text1.Move 0, 0, UserControl.Width,

UserControl.Height

End Sub

6. 为控件生成属性并设置映射。

作为初学者,可用向导完成。选择菜单“外接程序/ VB ActiveX控件界面向导”(若没有该项,则选择菜单“外接程序/外接程序管理器”,加载列表中的“VB ActiveX Control Interface Wizard”),启动该向导。在“选定接口成员”中,可取默认项目,也可添加诸如“Change”、“Locked”等常用属性、方法和事件到右边列表框中,也可从右边框中删除一些不常用的属性、方法和事件(如“BackStyle”、“Refresh”等)。在下一步的“创建自定义接口成员”中,新建一名为“Value”、类型为“属性”的成员。然后设置映射,把左边列表框中的各成员映射到控件“Text1”或“UserControl”的对应成员中,对于新建属性“Value”一定将它映射到“Text1”的“Text”成员中,其他视具体成员特点而定。最后您可以查看一下总结报告。

7.进一步修改。

选择窗口上端的对象:通用,在过程:Value(PropertyGet)中,找到“Public Property Get Value() As String”这一行,将“String”改为“Double”或其他数值类型。用同样的方法找到“Public Property Let Value(ByVal New_Value As String)”(一般相邻),也将“String”改为“Double”或其他的数值类型(两处的类型必须相同)。其目的是使Value的数据类型为Double或其他的数值类型。

选“工具/过程属性”,在名称中选“Value”,将描述中的“返回/设置控件中包含的文本”中的“文本”改为“数值”(对属性Value作简要阐述)。

这样一个标准的“数值框”控件初步制作完成。

8.调试。

首先保存该控件工程,关闭用户控件设计器(必须,但代码窗口不必关闭),进入运行模式(这时工具箱中的自制控件图标变为可用。然后从“文件/添加工程”中添加一个标准EXE工程。在工具箱中双击自制控件图标,在标准EXE工程的Form1上放置一个自制控件实例(默认名称为NumberBox1)。您可以根据需要调整控件大小和位置,在属性窗口修改有关属性。还可以编写相关代码,检验有关属性、方法、事件是否正常(控件中的数据可用NumberBox1

.Value获得)。按F5试运行,检验最后结果。

调试完毕,使数值框工程成为当前工程,然后生成一个OCX文件,这样这个文件所包含的控件就可被其他应用程序所共享了。

9.将新建的控件投入使用。

新建(不是添加)一标准EXE工程,右击工具箱,选“部件”,在“控件”选项卡上单击“浏览”,找到刚生成的OCX文件,打开它,就会在控件列表中增加一项“ActiveX 控件_数值框”,选中后按“确定”,该控件图标就会添加在工具箱中,这样您就可以像使用标准控件一样使用这个NumberBox控件了。

说明: 上述步骤只对NumberBox控件的制作做了一个简要的介绍,基本上使TextBox“脱胎换骨”变成了“NumberBox”,但也有控件的部分属性生成得还不是很完美,如对新建的属性Value,它的数据类型只能是一种(如Double),其实,我们可以再新建一个属性DataType(它的取值范围通过枚举Enum限定在Integer、Single等数值类型范围内),由DataType决定Value的数据类型(事先将Value的数据类型定义为Variant),然后修改过程“Public Property Get Value() As Variant”中的语句:“Value=Text1.Text”,根据DataType的值将Text1.Text由类型转换函数(如CInt 、CSng等)转换后赋给Value,这样,Value的数据类型就是DataType规定的类型了。详细过程限于篇幅,本文从略。

(计算机世界报 第02期 C16、C17)

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有