12.1 限制文本框的输入
用户在使用文本框输入数据时,往往希望可以限制输入数据的类型,例如,只允许输入数字,但是文本框的现有属性无法直接实现这样的要求。此时可以在文本框的KeyPress事件过程和Change事件过程中编写代码来判断输入的字符类型。只允许输入数字字符和一个"-"号、一个"."号,示例代码如下。
Private Sub txtDemo_KeyPress(ByVal KeyANSI As MSForms.ReturnInteger) Select Case KeyANSI'判断参数的值 Case Asc("0") To Asc("9") Case Asc("-") If InStr(1, Me.txtDemo.Text, "-") > 0 Or _ Me.txtDemo.SelStart > 0 Then KeyANSI = 0 End If Case Asc(".") If InStr(1, Me.txtDemo.Text, ".") > 0 Then KeyANSI = 0 End If Case Else KeyANSI = 0 End Select End Sub
当用户按下一个ANSI键时触发KeyPress事件。
KeyPress事件的语法格式如下。
Private Sub object_KeyPress( ByVal KeyANSI As MSForms.ReturnInteger)
其中,Object是必需的,代表一个有效的对象。
参数KeyANSI是可选的,其值为整数型,代表标准的ANSI键代码。
第3行代码利用Asc函数将字符串转换为字符代码。
第4~8行用来判断字符"-",只能在文本框第1位输入单个"-"。如果键盘输入的是"-",先使用InStr函数判断文本框中是否存在"-",如果InStr函数的返回值大于0,说明文本框已存在"-"。接下来使用文本框的SelStart属性来检测插入点,如果文本框SelStart的属性值大于0,说明插入点不是第1个。
将KeyANSI参数值设置为0,取消键盘输入。
第5行代码中的Me表示当前窗体,txtDemo是窗体中文本框的名称,如下图所示。文本框的Text属性返回当前文本框中的字符串。
但是以上代码无法禁止中文字符的输入和粘贴。利用文本框的Change事件可以解决此问题,示例代码如下。
Private Sub txtDemo_Change() Dim i As Integer Dim strEntry As String With txtDemo For i = 1 To Len(.Text)'逐个提起文本框中的字符进行判断 strEntry = Mid(.Text, i, 1) Select Case strEntry Case ".", "-", "0" To "9" Case Else .Text = Replace(.Text, strEntry, "") End Select Next i End With End Sub
第10行代码使用Replace函数将非法输入字符替换成空字符串。当替换文本框的字符时,会触发Change事件。
增加Change事件过程后,在文本框中只能输入数字和一个"."以及在第一位输入一个"-"。
12.2 自动换行的文本框
当使用文本框显示一段很长的文本时,需要将文本框设置成多行显示,否则文本内容只能在一行中显示,此时应设置文本框的WordWrap属性和MultiLine属性,示例代码如下。
Private Sub UserForm_Initialize() With Me.txtDemo .WordWrap = True .MultiLine = True .Text = "文本框是一个灵活的控件,受下列属性的影响:Text、" _ & "MultiLine、WordWrap和AutoSize。" & vbCrLf _ & "Text 包含显示在文本框中的文本。" & Chr(10) _ & "MultiLine 控制文本框是单行还是多行显示文本。" _ & "换行字符用于标识在何处结束一行并开始新的一行。" _ & "如果 MultiLine 的值为False,则文本将被截断," _ & "而不会换行。如果文本的长度大于文本框的宽度," _ & "WordWrap允许文本框根据其宽度自动换行。" & Chr(10) _ & "如果不使用 WordWrap,当文本框在文本中遇到换行字符时," _ & "开始一个新行。如果关闭WordWrap,TextBox中可以有不能" _ & "完全适合其宽度的文本行。文本框根据该宽度,显示宽度以" _ & "内的文本部分,截断宽度以外的那部分文本。只有当" _ & "MultiLine为True时,WordWrap才起作用。" & Chr(10) _ & "AutoSize 控制是否调节文本框的大小,以便显示所有文本。" _ & "当文本框使用AutoSize 时,文本框的宽度按照文本框中的" _ & "文字量以及显示该文本的字体大小收缩或扩大。" End With End Sub
第3行代码设置文本框的WordWrap属性为True。
WordWrap属性指定控件的内容在行末是否自动换行。设置为True,文本将自动换行;设置为False,文本不换行。
第4行代码设置文本框的MultiLine属性为True。
MultiLine属性指定控件能否接受和显示多行文本。设置为True,支持多行显示文本。
如果将文本框的MultiLine属性设置为False,则文本框的所有字符都合并为一行,包括非打印字符(如回车符和换行符)。
注:对于同时支持这两个属性的控件,当MultiLine属性设置为False时,WordWrap属性将被忽略。
当需要强制换行时,可以在文本中插入vbCrLf进行换行。
运行结果如下。
12.3 自动选择文本框内容
如果希望文本框获得焦点时能自动选中其内容,可以在MouseUp事件和Enter事件中设置文本框的SelLength属性,示例代码如下。
Private Sub txtDemo_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) If Button = 2 Then'被释放的是否为鼠标右键 With txtDemo .SelStart = 0 .SelLength = Len(.Text) End With End If End Sub Private Sub txtDemo_Enter() txtDemo.SelStart = 0 txtDemo.SelLength = Len(txtDemo.Text) End Sub
第1~8行代码为文本框的MouseUp事件过程,在文本框中右击时自动选中文本框中的内容。
按下鼠标右键时触发控件的MouseDown事件,释放鼠标时触发控件的MouseUp事件,其语法格式如下。
Private Sub object_MouseUp( ByVal Button As fmButton, ByVal Shift As fmShiftState, ByVal X As Single, ByVal Y As Single)
MouseDown 和 MouseUp 事件的语法包含以下成分:
成分 | 说明 |
---|---|
object | 必需。一个有效的对象。 |
index | 必需。发生特定事件的多页和 TabStrip 中的页索引或标签索引。 |
Button | 必需。标识引起该事件的鼠标按键的整数值。 |
Shift | 必需。规定 Shift、Ctrl 和 Alt 的状态。 |
X, Y | 必需。窗体、框架或页的位置的横坐标与纵坐标,以磅为单位,分别从左边和顶边开始测量。 |
参数Button是必需的,标识引起该事件的鼠标按键值,如下表所示。
Button 的设置如下:
常量 | 值 | 说明 |
---|---|---|
fmButtonLeft | 1 | 按下左键。 |
fmButtonRight | 2 | 按下右键。 |
fmButtonMiddle | 4 | 按下中键。 |
Shift 的设置如下:
值 | 说明 |
---|---|
1 | 按下 Shift。 |
2 | 按下 Ctrl。 |
3 | 同时按下 Shift 和 Ctrl。 |
4 | 按下 Alt。 |
5 | 同时按下 Alt 和 Shift。 |
6 | 同时按下 Alt 和 Ctrl。 |
7 | 同时按下 Alt 、Shift 和 Ctrl。 |
第3~6行代码设置文本框的SelStart属性为0,SelLength属性为文本框中字符串的长度。
SelStart属性指定选中文本的起点,如果没有选中的文本,则指定插入点。
SelLength属性指定文本框或组合框中的文本被选中的字符数。
对于SelLength和SelStart,其默认值均为0,设置值的有效范围是从0到组合框或文本框编辑区中的全部字符的长度。
第9~12行代码为文本框的Enter事件过程,在文本框实际接收焦点前自动选中文本框中的内容。