第六章:输入
我们为什么要设计计算机程序呢,当然是为了计算机能为我们完成工作,但是要完成不同的任务,我们就必须对计算机下达命令,然后计算机在把信息返馈回来――任务是否完成。以上就是所谓的人机对话或交互功能,尤其是在Windows操作里我们需要进行更多的输入工作,我们需要填写各种各样的表格,设置程序的重要参数,把数据输入给计算机,再又它完成既定的工作就是今天我们本章要重点讨论的问题――在VB中如何建立完整的输入机制。
在VB中提供了一个函数InputBox能帮助我们建立一个最简单的输入窗体,语法如下:
InputBox(prompt[,title][,default][,xpos][,ypos][,helpfile,context])
该函数返回一个字符串表达式,其参数含义为:(“[]”表示可缺省)
prompt――字符串表达式,最大长度为1024字符,窗体上的提示部分。
Title――字符串表达式,显示标题栏里的文本。
Default――字符串表达式,窗体中文本框的缺省值。
xpos,ypos――数值表达式,以Twips为单位指定窗体出现在屏幕上的位置。
helpfile――字符串表达式,是帮助文件的完整路径。
Context――数值表达式,指定适合的帮助主题。
可能你看了上面的说明并不明白,那么下面我们就用Input语句完成一个最简单的程序。
小知识:屏幕坐标
在计算机的屏幕上也有一个类似于我们在中学里常用到的直角坐标系,之不过它的原点不在左下,而是在屏幕的右上角,屏幕的最右上方坐标为(0,0),它的横坐标和我们的习惯是一致的,而纵坐标则是越向下越大,不仅是屏幕,所有的对象里都是一样,需要记清。见图6-1

新建一个项目(project),在Form_load里填写一行代码:
a$ = InputBox("举荐你最欣赏的网站", "最佳网站投票", "VB小驿")’不算无耻吧?:->
按下F5运行程序,在Form1出现之前先会弹出一个输入对话框,如图6-2。这时,无论你按下OK还是Cancel都是没有区别的,因为我们并没有对输入数据进行处理,下面我们完成一个更加复杂些的程序。

新建一个项目文件,把窗口布局成类似于图6-3的结构,各对象属性如下表:

|
Form1 |
Caption “最佳网站投票演示”
BorderStyle 3’不可调整大小
ControlBox 0’False |
|
Frame1 |
Caption “输入框属性“ |
|
Label1 |
Autosize 1’True
Index 0至5
0至5 Caption “提示语句”
“标题”
“缺省网站”
“X坐标”
“Y坐标”
“”
Index 4 Enabled False
Index 4 Enabled False |
|
Text1 |
Text “”’(空字符串)
Index 0至4
Index 3 Text 0
Index 4 Text 0 |
|
Check1 |
Caption “指定输入框位置” |
|
Button1 |
Index 0,1
Index 0 Caption “显示输入框”
1 Caption “退出程序” |
本例中出现了一个Frame1控件,它是一种框架,可以用来把窗体分成好几个部分,首先应该在窗体上画出Frame1控件,然后再选择相应的控件,在Frame1上描出轮廓,使其是出现在Frame1之上,本例中除去两个按钮,其余都在Frame1上面。本例中用到了几组控件数组,其创建方法是,在选定的点右键,选择Copy,再在窗体其他部位单击右键,选择Paste即可,注意,若要使粘贴的对象在Frame1上,请在Frame1上单击右键选择Paste。
我们通过这个窗体,对输入框进行完整的控制,原理是这样的:当我们把窗体中要填写的对输入框的参数完成后按下OK按钮,就会出现我们设计的那个输入框,我们从输入框退出时则返回我们投票的结果,代码如下.
窗体初次被装入时,Label1(3)、Label(4)和Text1(3)、Text1(4)的Enabled属性都是False,我们需要通过改变Check1的Value(1,被选中,0,未选中)是他们有效或无效。
声明全局变量(General):
Dim PosChk As Boolean '检查X、Y坐标是否有效
Check1_Click 事件:
Private Sub Check1_Click()
If Check1.Value = 1 Then
Label1(3).Enabled = True
Label1(4).Enabled = True
Text1(3).Enabled = True
Text1(4).Enabled = True
PosChk = True
Else
Label1(3).Enabled = False
Label1(4).Enabled = False
Text1(3).Enabled = False
Text1(4).Enabled = False
PosChk = False
End If
End Sub
接着在按钮中填写代码:
Private Sub Command1_Click(Index As Integer)
Dim Prompt, Title, Default As String
Dim xPos, yPos As Integer
Select Case Index
Case 0
Prompt = Text1(0).Text
Title = Text1(1).Text
Default = Text1(2).Text
If PosChk Then
xPos = Val(Text1(3).Text)
yPos = Val(Text1(4).Text)
a$ = InputBox(Prompt, Title, Default, xPos, yPos)
Else
a$ = InputBox(Prompt, Title, Default, xPos, yPos)
End If
Label1(5).Caption = "谢谢您的投票,您的选择是" & a$ & "!"
Case 1
Unload Me
End Select
End Sub
按下F5运行程序,你会看到这样的结果。图6-4,6-5。是不是有种受骗的感觉,啊哟哟,可不是我的错,就是这么容易嘛!


从刚才的例子里,我们接触了一些VB中的输入方法,其实数据输入不仅仅局限于向Text框中输入数据,数据的输入还有许多其他的方法,譬如前面的Check1也是向程序发出一定的信息,只要是通过操作向计算机发布命令就可以叫做输入,下面我们来一一介绍。
首先要介绍的当然是输入用到最多的Text框。Text没有Click事件,它的缺省事件是Change,也就是当Text框里的一旦内容改变就会激发该事件发生,还是让我们用实例说话吧。
Text有几个特殊的属性,一是MultiLine(多行)属性,MultiLine属性为False的时候,不论文本有多长,它都会在一行里显示下去,换行符无效,当它为True的时候,字符串显示到Text框边缘的时候就会自动换行。另一个与之配合的属性是ScrollBars属性,它有4个值,0到3,分别是没有滚动条,水平滚动条,垂直滚动条,和二者都有,它是一个只读属性,也就是说只有在程序设计过程中才能改变,而不能在程序运行中改变,但是我们可以通过API解决运行中改变的问题,我们放在以后再讲。PasswordChart属性,我们经常在程序操作中遇到要填写密码的部分,为了保密起见,在屏幕上显示的字符一般“*”表示,并且这时是无法用剪贴板的,这在VB中非常容易做到,把PasswordChart中设一个用来代替字符串的字符即可,并不一定是“*”哦。
下面我们完成一个有趣的小程序,是我以前遇到过的一个程序,我对其进行了部分修改。程序的意思是这样的,假设你是一个司机应超速被警察扣留,现在需要你向警察陈述你的理由,如果你的话能打动他,就可以免交罚金,如果你在规定的字数里没有说出什么有震撼力的话,那老兄你可就惨了,交钱吧。J
这个程序比原来的英文程序有了几点不同,第一,由于用到的是双字节中文的中文,所以对于检测中文字符和英文有很大不同,第二,原来的英文程序不管你说多少,警察依然是依法从事,本例中给了犯规者10%的免罚机会(有点无聊……L ,不过也是为了学一些东东嘛)。下面就跟我来设计窗体吧。(如图6-6)

|
Form1 |
Icon Stop图标
Caption 停车检查
BorderStyle 3 |
|
Label1 |
Caption 警官,我超速是有原因的,请听我说:
BackColor &H00808080&
ForeColor &H80000012& |
|
Label2 |
Caption 你必须在30字之内完成你理由的申诉,否则将受到罚款!
BackColor &H00808080&
ForeColor &H00FF0000& |
|
Text1 |
MultiLink True
Text “” |
|
Picture1 |
Autosize True
BackColor &H00808080&
Visible True |
|
Picture2 |
Autosize True
BackColor &H00808080&
Visible False |
|
Picture3 |
Autosize True
BackColor &H00808080&
Visible False |
|
Command1 |
Visible False |
三个图片框Picture1-3的Picture属性分别为绿灯,黄灯和红灯,这些图标在VB目录下的Graphics\Icons\Traffic下(VB5),或是VB目录下的Icons\Traffic下(VB4、VB3),你还可以为Label1在Font属性里选一个合适的字体和字重。下面我们来看代码:
首先初始化程序:
Private Sub Form_Load()
'把Command1放在水平的中央
Command1.Top = Label2.Top+200
Command1.Left = (Form1.Width - Command1.Width) / 2
'重叠三个图片框
Picture2.Left = Picture1.Left
Picture2.Top = Picture1.Top
Picture3.Left = Picture1.Left
Picture3.Top = Picture1.Top
End Sub
下面我来讲一讲程序是怎样运行的,我们将用到Text的Change事件,每当字符串改变一次就对它进行一次检查,算出已经说的字数,当字数超过10时,下面的红绿灯会变成黄色,并且在这时随机抽取一个数,它在一个范围内出现的可能是10%,如果在这个范围内就可以免交罚金,如果不在范围则继续,当文字超过20的时候,红绿灯会变成红色,再一次抽取随机数字,步骤同上,如果30个字已满,再进行一次检查,如果你真的那么不幸就该罚款了。
程序的步骤清楚了,我们在来看看程序的要点。由于中文是双字节字符,也就是说一个汉字占两个ASC码的位置,而VB显然是为英语国家设计的用Len函数无法返回汉字字节,也就是说一个汉字和和一个ASC字符在Len函数中得到的值是一样的,这就需要特殊处理。用Asc()函数,在括号内放入一个ASC字符或字符串,它会把第一个ASC码转化为0-255的数值,而把一个汉字放入,它的值必然不在0-255,这也就可以作为判定汉字的基础。我们可以把英文算作半个汉字。
下面我们来看看代码:
在General 里声明窗体级变量:
Dim Level As Integer
Private Sub Command1_Click()
Unload Me
End Sub
Private Sub Text1_Change()
Dim StrLength As Integer’字符串长度
Dim RandomNum As Single’随机数
Dim Str1 As String
Dim a As String
Dim i, Temp
StrLength = 0’每次开始时把字符串长度还原为0
a = Text1.Text
For i = 1 To Len(a)’Len(a)代表字符串的长度
Temp = Asc(Mid$(a, i, 1))’挨个取字符
If Temp > 255 Or Temp < 0 Then’不是ASC码
StrLength = StrLength + 2
Else
StrLength = StrLength + 1
End If
Next i
StrLength = StrLength / 2
Select Case StrLength
Case 0 To 9
Picture1.Visible = True
Picture2.Visible = False
Picture3.Visible = False
Label2.Caption = "慢慢说。你还有" & Str(30 - StrLength) & "个字可以说"
Level = 1
Case 10 To 19
If Level = 1 Then
RandomNum = Rnd * 10’得到随机数
If RandomNum <= 10 And RandomNum > 9 Then
Text1.Enabled = False
Label2.Caption = "很抱歉这是个误会……"
Command1.Visible = True
Command1.Caption = "您可以离开了"
End If
Level = 2
Else
Picture1.Visible = False
Picture2.Visible = True
Picture3.Visible = False
Str1 = "怎么还没说完!"
Label2.Caption = Str1 & "你还有" & Str(30 - StrLength) & "个字可以说"
End If
Case 20 To 29
If Level = 2 Then
RandomNum = Rnd * 10
If RandomNum <= 10 And RandomNum > 9 Then
Text1.Enabled = False
Label2.Caption = "很抱歉这是个误会……"
Command1.Visible = True
Command1.Caption = "您可以离开了"
End If
Level = 3
Else
Picture1.Visible = False
Picture2.Visible = False
Picture3.Visible = True
Str1 = "我已经不耐烦了!"
Label2.Caption = Str1 & "你还有" & Str(30 - StrLength) & "个字可以说"
End If
Case Else
Text1.Enabled = False
Label2.Caption = "你已经没有机会了!"
Command1.Visible = True
Command1.Caption = "交钱吧,肇事犯!"
End Select
End Sub

中间有几个函数需要解释一下:
Mid可以从字符串中取出一部分,返回字符型,格式:
Mid(字符串,从第几个字符开始,取字符的长度)
Asc可以把字符转换为ASCII码,格式:
Asc(字符串)
Rnd,取得大于0但小于1 的数值,可以没有参数。
怎么样,十分简单吧,我们将在下一次继续讨论VB的输入机制,再见!
在继续上面的内容时,我想再回顾和强调几个在字符串操作中经常函数:
先是几个已经接触过的,Mid(),Asc(),Len(),它们的语法分别是:
Mid(字符型,起始字符,长度)
返回子字符串,如果从字符串的第一个字符取起,起始字符为1,依此类推。
Asc(字符型)
返回数值,如果参数不是一个字符,而是字符串(多个字符),将返回参数的第一个字符ASCII值。
Len(字符型)
返回字符串的长度。
下面我再为你解释几个新的函数:
Left(字符串,长度)
将返回字符型,从字符串的第一个字符向左取字符串,与之相对应的是Right(),它将从字符串的最后一个字符向右取字符串。
Chr(数值型)
该数值范围从0-255,返回字符型,如Chr(65)可返回字符“A”,这样可以输入一些用键盘无法输入的字符。
Str(数值型)
该函数把数值型转换为字符型,也许你觉得数值“123”和字符串“123”没什么区别,但在内存中一个ASCII字符是占一个字节,也就是说字符串“123”占3个字节,而当数值“123”是整型时,它占两个字符,当它是长整型时,占4个字节。与之向对应的是Val(数值型),它把数值型转换为字符型。
上面的函数都是以后要经常用到的,请将它们熟悉。
上次讲到文本框的用处,还有意思吗?你是否能把上次的程序稍稍变动一下,来计算出输入的单词数,提示一下,单词与单词之间是用空格分隔开的。
我们继续下面的内容。
上次说到,输入不仅仅是向文本框输入字符,凡是从外界向程序传递数据都可以叫做输入,我们一一说明白。
无线钮,记得我们曾在第一章中完成过我们的第一个程序――“Hello World!”它就是一种输入的方法,在设计VB程序时可以通过一组这样的无线钮,它们之间互相排斥,也就是说,只能有一个按钮被选中。它因为很象无线电收音机上的按钮因而得名无线钮。如果要在一个窗体内放置多组无线钮必须用Frame控件把它们区分开来。下面我们在来完成一个例子,顺便熟悉一下另外两个处理字符串的函数――LTrim()和Rtrim(),它们分别用来删除字符串左边的空格和右边的空格,让我们看看它们是如何工作的。

程序窗体如图6-8,由于窗体比较简单,无需修改更多的属性,一共有三个文本框(Text1到3),分别用来显示输入字符,显示把空格换成星号的字符,和经过处理的字符,还有三个无线钮(Option1到3),要修改的只有Caption属性,分别是“删除左边的空格”、“删除右边的空格”和“删除两边的空格”。因为空格在我们在文本框中无法看到空格,所以我们通过一个称作AddStar的函数把原有字符串中的空格转换为星号,使我们能够看到函数的效果。下面在程序中添加代码,首先在General中声明窗体级变量:
Dim LTrimmedword$, RTrimmedword$ '删除左边空格和右边空格后的字符串
Dim LRTrimmedword$ '删除两边空格后的字符串
然后,我们通过一个叫做addstar的函数为字符串加上星号,以前曾说过函数与过程的分别,函数会返回一个函数值,所以addstar也就相当于一个变量,其实这很好理解,就象中学代数中的函数,函数就相当于变量Y,而函数中的参数则相当于自变量X,当然可能有很多自变量X1、X2……请原谅,我并不想在这里上数学课,因为我厌恶那玩意儿,特别是上了大学之后,好在大二以后就再也不会有数学课了,哈哈……
Function addstar(tempword As String) As String
Dim charindex% Dim pasteword$ '加星号后的字符串 For charindex = 1 To Len(tempword)
If Mid(tempword, charindex, 1) = " " Then '如果字符为空格
pasteword = pasteword + "*"
Else: pasteword = pasteword + Mid(tempword, charindex, 1) End If
Next addstar = pasteword '返回函数值
End Function
下面的代码很简单,并且我为它做了注释,就不再一一解释了,我只想简要的提几句,Ltrim和Rtrim只有一个参数(字符型),另外下面用到了焦点事件,我们曾在第三章中介绍过,当Text1得到焦点(GotFocus)时,清空所有的文本框,当它失去焦点(LostFocus)时,对字符进行addstar并且在Text2中显示。
Private Sub Text1_GotFocus() '但焦点于Text1
'清除所有文本框中的字符 Text1.Text = "" Text2.Text = "" Text3.Text = ""
End Sub
Private Sub Text1_LostFocus()
Dim Origionword As String Origionword = Text1.Text Text2.Text = addstar(Origionword) LTrimmedword = addstar(LTrim(Origionword)) RTrimmedword = addstar(RTrim(Origionword)) LRTrimmedword = LTrim(RTrim(Origionword))
End Sub
Private Sub Option1_Click()
Text3.Text = LTrimmedword '显示删除左空格后的字符串
End Sub
Private Sub Option2_Click()
Text3.Text = RTrimmedword '显示删除右空格后的字符串
End Sub
Private Sub Option3_Click()
Text3.Text = LRTrimmedword '显示删除两边空格后的字符串
End Sub
最后结果如图6-9。

与无线钮相对的是检查框,在同一范围内一组无线钮只能有一个被选中,而检查框则可以有多个选择,就象在添表时,性别那项只能有一个选择,而在描述你以前的职业时可以有学生、程序员、家庭教师或者什么,总之有很多选择,下面我们举一个简单的例子加以说明。
假设编写了一个共享软件,在让用户注册的时候你想知道你的用户使用的计算机情况,你就需要一个调查表,为了使这个调查表不止枯燥,可以在这个程序中加入一些图形。新建一个项目文件,窗体布局如图6-10。

程序很简单,一共有两个框架(Frame1和Frame2),它们的Caption分别为“选择你的计算机拥有的配置”和“这是你的计算机系统”,在Frame1有四个检查框(Check1到Check4),Caption分别为“网络系统”、“鼠标”、“密码保护”和“电子邮件”,另把Check4的Enabled属性改为False,使其无效;在Frame2中放置四个图片框(Picture1到Picture4)与四个检查框向对应,请把所有图片框的BorderStyle属性设为0(无边框),它们的Picture属性请根据上图,在存放图标的目录中找到相对的图标。下面是程序代码:
Private Sub Check1_Click()
If Check1.Value Then
Check4.Enabled = -1 Picture1.Visible = -1
Else: Check4.Enabled = 0 Picture1.Visible = 0 Check4.Value = 0 Picture4.Visible = 0
End If
End Sub
Private Sub Check2_Click()
If Check2.Value Then
Picture2.Visible = -1
Else: Picture2.Visible = 0
End If
End Sub
Private Sub Check3_Click()
If Check3.Value Then
Picture3.Visible = -1
Else: Picture3.Visible = 0
End If
End Sub
Private Sub Check4_Click()
If Check4.Value Then
Picture4.Visible = -1
Else: Picture4.Visible = 0
End If
End Sub

这个程序比我们见过的任何程序都简单,就不再做说明。
首先,我想先对第六章的拖拖拉拉表示歉意,一是因为它实在太长了,二也是因为我自己太懒了,今天写几个字,明天添两笔,以致于写了三次才将它真正完成,还请大家原谅。
好,废话少说,让我们赶快切入正题。上次我们讨论了无线钮和检查框的使用方法,相信你已经熟悉,因为它们实在太简单了,现在让我们继续“输入”的最后几个部分。
滚动条(ScrollBar)在视窗中也是一个不可缺少的部分,由于面积所限,我们不得把屏幕上的内容滚来滚去,以显示大量的内容,这就是我们经常要用到的滚动条。但滚动条除去滚动窗口,还有一个很重要的作用――输入,想想你经常用到的一些家用电器上调节声音或别的什么东西的滑块,你把它滑向大的一方音量就会增大,而你把它滑向小的一方音量就会减小,或者一个控制左右两个音箱的均衡器,当滑块在正中央的时候,两个音箱的音量是相同的,当你把滑块偏向一方时,音箱的音量有了大小之分,在Windows操作中,我们也经常要用到类似的效果。
在VB中提供了两个常规的滚动条控件――Vscroll和Hscroll,分别代表垂直的和水平的滚动条,它们只不过是方向不同而已,而它们的属性,以及会发生的事件都是相同的。,滚动条有几个特殊的属性:
Value属性,当滑块挪动后停在某一位置时,就改变了滚动条的Value属性。
Max和Min属性,用来设置滚动条的最大值和最小值,譬如把Max设为100,把Min设为0时,滚动条的Value就在0到100之间移动,当Max和Min倒置时,滚动条的方向也会相反,也就是说,当Max<Min时,原来Value增加的方向就会变成相反的方向。Max和Min也可设为负值。
SmallChange和LargeChange属性,当鼠标在滚动条两头的箭头上单击时,就会把滚动条向相应的方向挪动一点,这时用到的就是SmallChange属性,当你把它设为1时,每点一下,滚动条的Value就改变1;当鼠标在滚动条上点击时,用到的就是LargeChange,当设为10时,每点击一下滚动条,Value就改变10。
下面我们看一个实例。
大家都知道,物体之所以会有颜色是因为物体表面的材料吸收了太阳光中的部分色光,而还有部分色光没被吸收而被反射回来,它就成了我们看到的颜色,黑色就是物体吸收了所有的太阳光的所有色光,没有反射颜色,所以在我们看来是黑的,而当物体反射了所有的色光,我们看到的就是白色。在计算机中,颜色的表示就是象我们刚才描述的样子,它把颜色分为红(R)、绿(G)和蓝(B)。众所周知,计算机的机器语言是使用二进制表示的,为了方便查阅我们看到的往往是十六进制代码,一个字节包括两位十六进制数字,从0-255(十六进制表示0-FF),而一个字节是由八位二进制数值表示(2^8,2的8次方),计算机中用分别用一个字节,也就是八位表示一种颜色,和在一起也就是三个字节(24位)表示所有的颜色,这就是我们平时常说的24位真彩,它一共可以组成256×256×256(2^24)种颜色,对于我们的肉眼,是根本分辨不出来相邻两个不同的颜色的,比如用FFFFFF表示白色,就好象我们刚才说的物体反射了所有的色光,相反的可以用000000表示黑色,它吸收了所有的色光,还可以用FF0000表示红色,在HTML语言中就是这样表示颜色的。
小知识:现在你可以根据你的显卡的显存来计算一下显卡在24位真彩下可以以多大的分辨率显示,计算是这样的,用显存的字节数÷3(24位色)=显示器宽的象素数×显示器高的象素数,宽的象素数:高的象素数=4:3,比如4兆显存,就应该是4×1024×1024÷3=1365×1024。
在下面的小程序中,我们通过三个滚动条分别代表R、G、B,滚动滚动条,将在右边的图片框中显示相应的颜色,并且在下面的文本框中显示颜色的十六进制数值。
现在,新建一个项目文件,在Form1中如图6-12布局控件,各控件属性如下表:

|
HsrollBar |
Name Hscroll1
Index 0、1、2
(共同属性)
Max 255
Min 0
LargeChange 10
SmallChange 1 |
|
Label |
Name Label1
Index 0、1、2
Index 0 Caption “红:”
Index 1 Caption “绿:”
Index 2 Caption “蓝:” |
|
Label |
Name Label2
Caption “颜色值” |
|
TextBox |
Name Text1
Text “” |
|
PictureBox |
Name Picuture1 |
为了把十进制数值换成十六进制数值,要使用一个叫做Hex()的函数,它把十进制数值转化为十六进制的字符,但对于只有一位的十六进制字符,这个函数并不在高位补零,为了视觉上的正确,我设计了一个小函数帮助它给一位的十六进制字符补零.
程序代码很简单,见下:
Dim RedStr, GreenStr, BlueStr As String’RGB的字符 Dim RedNum, GreenNum, BlueNum As Integer’RGB的数值
Function GetColorValue() As String
‘获得输入值 RedNum = HScroll1(0).Value GreenNum = HScroll1(1).Value BlueNum = HScroll1(2).Value
RedStr = Hex(RedNum) If Len(RedStr) < 2 Then RedStr = "0" + RedStr’补零
GreenStr = Hex(GreenNum) If Len(GreenStr) < 2 Then GreenStr = "0" + GreenStr
BlueStr = Hex(BlueNum) If Len(BlueStr) < 2 Then BlueStr = "0" + BlueStr
GetColorValue = RedStr + GreenStr + BlueStr’合并
End Function
Private Sub Form_Load()
‘初始化程序 Text1.Text = GetColorValue Picture1.BackColor = RGB(RedNum, GreenNum, BlueNum)'RGB函数返回颜色值
End Sub
Private Sub HScroll1_Change(Index As Integer)
‘当滚动条被改变时 Text1.Text = GetColorValue Picture1.BackColor = RGB(RedNum, GreenNum, BlueNum)
End Sub
运行如图6-13。

列表框(ListBox)和复合列表框(ComboBox)也是我们经常见到的视窗元素,我们从它所列示的条目中选出所需的,两种列表框只是在外观上略有不同,但从本质和操作方法来说它们是很相象的,它们也有一些特殊的属性:
List属性,你可以利于该属性象列表框或复合列表框中添加条目,但也可以在程序设计中通过AddItem方法添加。
ListCount属性,返回列表框或复合列表框中条目的数目。
ListIndex属性,表示列表框或复合列表框的第几项条目。(从0到ListCount-1)
Sorted属性,可以通过该属性对列表框或复合列表框中的条目根据字母顺序排序。
MultiSelect属性,0表示不能多选,1表示简单多选,2表示宽展多选,仅限于列表框。
Columns属性,表示条目是以一列显示还是两列显示,仅限于列表框。
Style属性:表示列表框或复合列表框以何种风格显示,二者参数不同。
举两个简单的例子。
例子一,建立一个新项目文件,在Form1上添加一个List控件,调整适当的尺寸,无需改变任何属性。填写以下代码。
Private Sub Form_Load()
With List1
.AddItem "0-Default" .AddItem "1-Arrow" .AddItem "2-Cross" .AddItem "3-I-Beam" .AddItem "4-Icon" .AddItem "5-Size" .AddItem "6-Size NE SW" .AddItem "7-Size NS" .AddItem "8-Size NW SE" .AddItem "9-Size WE" .AddItem "10-Up Arrow" .AddItem "11-Hourglass" .AddItem "12-NoDrag" .AddItem "13-Arrow And Hourglass" .AddItem "14-Arrow And Question" .AddItem "15-Size All"
End With
End Sub
Private Sub List1_Click()
MousePointer = List1.ListIndex’这里的MousePointer是窗体全局内的属性
End Sub
当你点在不同项上面鼠标指针也会随着改变,如图6-14。

AddItem方法语法如下:
ListObject “字符串”,数值
字符串后的数值可以指定条目加入在第几个条目的位置上,如果没有的话,添加项将逐次排下去。
下面举一个复合列表框的例子,例子通过选择复合列表框中的选项来改变文本框的字体。请新建一个项目文件,在窗体中添加一个ComboBox(Combo1)和一个TextBox(Text1),添加如下代码。
Private Sub Combo1_Click()
Text1.FontName = Combo1.List(Combo1.ListIndex)
End Sub
Private Sub Form_Load()
With Combo1
.AddItem "宋体" .AddItem "隶书" .AddItem "黑体" .AddItem "楷体" .ListIndex = 0'把第一个条目作为初始项
End With
Text1.FontSize = 30’放大字体 Text1.FontName = Combo1.List(0)’初始字体为“宋体”
End Sub
如图6-15。

|