第七章 输出
上一章里,我们讨论的VB的输人机制,这次我们来集中讨论VB中信息的输出。
输入和输出是不可分割的,人们输入的最终目的是希望计算机作出反应,任何一个程序都不可能避开这个问题,所以就算要完成一个最基本的程序,也要有输出的部分,复杂的程序更是如此。
在输入的一章里,我们学习的第一个输入方法是InputBox,相应的在输出中我们第一个要接触的是MsgBox(Message Box),和InputBox相似,MsgBox也是简化了的窗体,可以以函数的形式返回操作。它的基本语法是:
MsgBox \"显示内容\按钮值,\"标题\"
通过这个函数可以产生一个标准的Windows消息框,象我们平时经常接触的“Yes/No”、“OK/Cancel”,“Retry/Abort/Ignore”等等,这些都是在按钮值中设定的,按钮值如下:
数值 0 1 2 3 4 5 含义 OK OK和Cancel Abort、Retry和Ignore Yes、No和Cancel Yes和No Retry和Cancel
并且不同的消息可以搭配不同的图标,比如帮助文件用问号,一般提示用一个圈里一个I等等,它们也是按钮值的一部分:
数值 16 32 48 含义 表示危险 表示问号 表示警告 表示信息
但是如何既显示按钮也显示相应的图标呢,请看一会儿下面的例子。前面说过,MsgBox是函数,那么它就会有返回值,当你按下某个按钮就会返回一个数值,以便对用户不同动作的捕捉,返回值如下:
数值 1 2 3 4 5 6 7 含义 OK Cancel Abort Retry Ignore Yes No 说了这么多,可能你已经不知所措了,不过看过下面的例子后,相信一切都会迎刃而解。
首先建立一个新项目文件,并添加以下对象(见图7-1)――一个Button(Command1),两个ComboBox(Combo1和Combo2),不要对其属性做更多的修改,只需把Command1的Caption改为“Click Me”。这个程序的目的是自由组合上面的按钮值,以显示各种消息框,并且返回按下的按钮,Combo1和Combo2分别用来选择按钮值,首先在Form_Load中初始化程序:
Private Sub Form_Load() Combo1.AddItem \"OK\"
Combo1.AddItem \"OK and Cancel\"
Combo1.AddItem \"Abort,Retry and Ignore\"
Combo1.AddItem \"Yes,No,Cancel\" Combo1.AddItem \"Yes,No\"
Combo1.AddItem \"Retry,Cancel\" Combo1.ListIndex = 0 Combo2.AddItem \"危险\" Combo2.AddItem \"询问\" Combo2.AddItem \"警告\" Combo2.AddItem \"信息\" Combo2.ListIndex = 0 End Sub
ComboBox的用法已经在上一章中讨论过,在此不再赘述,ListIndex属性用来把第一个元素放在选择位置。 但是如何显示需要的按钮和图标呢?很简单,只需把它们相加,比如说要显示OK、Cancel按钮和警告的图标,只需把1和48相加,得到49即可,于是我们在Command1中填写这样一行:
Private Sub Command1_Click()
message = MsgBox(\"显示\" & Combo1.List(Combo1.ListIndex) & \"和\" & Combo2.List(Combo2.ListIndex), Combo1.ListIndex + (Combo2.ListIndex + 1) * 16, \"消息演示\") End Sub
因为图标值是从16开始的所以要把Combo2的ListIndex加1再乘以16。
小知识:按钮值并非简单的相加
按钮值并非简单的相加,我们知道,在计算机里最终的语言是机器语言,而机器语言是以0和1的二进制表示的,在这里用到的实际上不是相加,而是逻辑操作符“OR”,你知道OR和AND是怎样工作的吗?正如你所知,True And False得到False,而True Or False得到True,这是怎么形成的呢?我们有时也用0代表False,用1或-1代表True(其实,只要非零都可以代表True),而0和1在二进制中还是本身,于是True、False的运算就变成的0 和1的运算,我们可以把And叫做补0运算,把Or叫做补1运算,当用And处理两个二进制数的时候,它们逐位比较,如果相同的位上都是0或都是1则没有变化,而如果一位上是0,另一位上是1,最后结果上相应的位上就变成0。比如1010(十
进制中10)And 1101(十进制中13),最后就得1000(十进制中8),相同的Or亦是如此,只不过在不同的地方补1。在位数不同时,前面补0,你可以在VB中试试看。但为什么要讲这些呢,原因是我不想让大家真的以为这个例子中就是相加,只不过碰巧它们的0和1处在不同的位置上,并且这个小知识在今后的位图操作和API操作中很有用处。
下面在来判断用户按下的按钮。
Private Sub Command1_Click()
message = MsgBox(\"显示\" & Combo1.List(Combo1.ListIndex) & \"和\" & Combo2.List(Combo2.ListIndex), Combo1.ListIndex + (Combo2.ListIndex + 1) * 16, \"消息演示\") Select Case message Case 1
MsgBox \"你按下了OK钮\" Case 2
MsgBox \"你按下了Cancel按钮\" Case 3
MsgBox \"你按下了Abort按钮\" Case 4
MsgBox \"你按下了Retry按钮\" Case 5
MsgBox \"你按下了Ignore按钮\" Case 6
MsgBox \"你按下了Yes按钮\" Case 7
MsgBox \"你按下了No按钮\" End Select
End Sub
运行程序,结果如图7-2,7-3。
2. 附录
2.1 VB教程
第四章 按钮(一)
从本章开始我们将正式进入VB的编程世界,但这还仅仅是个开端,要编出功能强大的软件,还要学很多东西,那就要看以后的VB高级教程了,我也得努力学啊!
按钮是我们在Windows操作见到最多的控件,它们有着各种各样的功能:“确认”、“取消”、“下一步”等等,这些都是按钮的表现,另外还有很多图形话的按钮,其实它们并没什么不同,所有的按钮都是通过单击(click)事件实现的,只不过是在外表不同罢了。下面就让我们建立一个最简单的按钮,双击工具箱的CommandButton,将在窗体上建立一个形如图4-1的按钮,它的缺省名(Name属性)为Command1,我们可以把它改名为cmdExit,把Caption属性设为“退出”,然后双击,按钮填写代码: Private Sub cmdExit_Click() Unload Me End Sub
按下F5或者工具条上的播放按钮,运行程序。图4-2当你按下退出按钮的时候,就会自动退出程序,原因是当你单击按钮时激活了它的Click事件,执行“Unload Me”语句,使得窗体被卸载。
上面举了一个比较简单的例子,下面的例子稍微复杂些:
新建窗体,控件布局如图4-3所示,包括一个List控件,一个Text控件和两个按钮(Command1和Command2), (比较简单的程序我们都采用缺省名),对它们属性做如下修改:
List1 Text1 Button1 Caption=“请输入你的名字” Text=“”(空字符串) Caption=“复原” Enabled=False Button2 Caption=“清除” 把使用Button1的Enabled属性设为False(假),是使程序在初始时,无法单击Command1。按F5,运行程序,图4-4,复原按钮成为灰色,不可选。
当然现在程序还什么也不能做,下面我们在程序中添加代码: 首先在General里声明全局变量:
Dim StoreString As String '用来储存字符串
※注意:为什么用全局变量?
VB里每一个小过程都相当于一个程序,程序里的变量称为局部变量,是只能在程序内部使用的,而当程序调用结束后,由于从内存中被清除,所以变量储存的值也就消失了,这里的全局变量是用来在过程中传递字符串。 接着填写以下代码:
Private Sub Command1_Click() Text1.Text = StoreString Command1.Enabled = False End Sub
Private Sub Command2_Click() StoreString = Text1.Text Text1.Text = \"\" '清除 Command1.Enabled = True End Sub
运行程序,如图4-5。按下“清除”,文本框被清除,按下“复原”,文本有被恢复,许多程序中的Undo/Redo就是利用这个原理实现的,现在知道为什么内存越多越好了吧。
我们在把程序修改一下,把Button2删除,Button1的Enabled属性改为True,Caption改为“清除”,填写代码: Private Sub Command1_Click()
If Command1.Caption = \"清除\" Then StoreString = Text1.Text Text1.Text = \"\" '清除
Command1.Caption = \"复原\" Else
Text1.Text = StoreString Command1.Caption = \"清除\" End If End Sub
同样可以上面的功能,但是却少用了一个控件,控件使用少的程序启动会快些。
下面的例子要更加复杂些,大家一定都用过Windows附件中的计算器,它是一个标准的科学计算器,利用VB我们也可以做到,只是没有那么复杂,四则运算而已。
先建立一个新的项目文件,里面包含一个Form1的窗体。然后,添加控件,包括一个Text框(Text1),和17个按钮,这17个按钮使用的名称都是Command1,只是Index属性不同,就好象一个数组,创立一组按钮的方法是,先在窗体上建立一个按钮(Command1),然后在Command1上击鼠标右键,选择复制(Copy),然后在窗体上任意部位击右键,选择粘贴(Paste),系统会提示是否创建控件组,选择“是”,重复上面步骤,直至创立17个按钮为止。各控件属性如下表:
Text1 BackColor=&H00C0FFFF& Text=“0.” Command1 Index 0――16 Index 0――9 Caption= Index 10 Caption= Index 11 Caption= Index 12 Caption= Index 13 Caption= Index 14 Caption= Index 15 Caption= Index 16 Caption=“清除” 如果想改变一些其他的属性,比如字体,可以自己定义一下Font属性,如果相对多个控件的共同属性进行改变,可以在窗体上按下鼠标,拖动,把多个控件一起选定,然后对它们的共同属性进行修改。
别看这个东西小,还费了近我两个小时呢,不觉大叹手生,里面也有些地方很绕弯子,我尽量解释清楚。
在编写程序之前,我们先来回顾一下计算器的使用。
1. 按下数字键在液晶屏上会出现数字,这是最基本的功能。
2. 第一次按下运算键,再按下数字键,将重新输入第二个数字,再次按下运算键,将算出前两个数的结果,然后按下数字键,将又重新输入新的数字。
3. 输入数字后,按下“等于键”将仍输出原来的数字,输入运算符和第二个数字后在按
下“等于”,将得到二者的结果。然后又重复第二、三步。 4. 按下“清除”,数据被全部清除。
了解了这些,我们一步一步实现。 先实现数据的输入,请看代码。
与未创立组的控件相比,它的事件里多了Index参数,组里所有的对象都使用同一个事件。
先在General里声明窗体级全局变量: Dim Num1, Num2 As Single
Dim StrNum1, StrNum2 As String
Dim FirstNum As Boolean '判断是否是数字开头
因为Text1里是存放字符串的,所以要把输入的数据进行运算,必须把字符型变量转变为实型变量,分别用Num1、Num2和StrNum1、StrNum2进行存放。 在Form_Load事件里给变量初赋值: Num1 = 0 Num2 = 0
StrNum1 = \"\" StrNum2 = \"\" FirstNum = True
因为17个按钮使用的是同一事件,所以我们用一个Select Case语句区分各个按钮,双击任意按钮输入代码:
Private Sub Command1_Click(Index As Integer) Select Case Index Case 0 To 9 If FirstNum Then
StrNum1 = Str(Index)’实型转字符型 FirstNum = False’初赋值为假 Else’非初赋值
StrNum1 = StrNum1 + Str(Index) End If
Text1.Text = StrNum1’显示 <还有其他语句,等待插入> End Select End Sub
运行程序的话已经可以输入数据,下面我们来处理小数点。
在General里声明新的变量:
Dim PointFlag As Boolean '判断是否已有小数点
我们知道小数点只能输入一次,一个数据中不能有多个小数点存在,所以需要一个布尔变量做判断。
在Form_Load里进行初赋值: PointFlag = False
在Command的单击事件里接着上面输入新的代码: Case 10
If Not PointFlag Then’如果没有小数点 If FirstNum Then’如果是第一个字符 StrNum1 = \"0.\" FirstNum = False Else
StrNum1 = StrNum1 + \".\" End If
Else’已有小数点
Exit Sub’则退出单击事件 End If
PointFlag = True
Text1.Text = StrNum1