2024年1月12日发(作者:)

第1章 Visual Basic 6.0 基础知识

完整版教材

§1 Visual Basic的基础知识

一、概念和术语

1,对象(Object)

事物都可称作对象,比如桌椅就是对象,在Visual Basic里对象主要分为两类:Form和Control。

Form:窗体或称表单,其实指的就是window。

Control:控件,指的是各种按钮、标签等等。

2,属性(Property)

指的是对象的属性,比如姓名、性别、民族、籍贯都是你这个对象的属性。Caption、Left、Name是一个命令按钮的属性。

3,事件(Event)

事件是发生在对象上的动作。比如敲桌子是一个事件,它是发生在桌子这个对象上的一个动作。比如Click、Dblclick或LostFocus是发生在文本框控件上的事件。然而事件的发生不是随意的,某些事件仅发生在某些对象上而已,比如“逃避早操被抓住”可以发生在学生这个对象上,但它不会发生在老师这个对象上。

4,方法(Method)

这是一个直译,是一个较难理解的概念,它是对象本身内含的函数或过程,它也是一个动作,但不称作事件,在Visual Basic 里,方法和事件是这样的:

事件:

Private Sub对象名_事件名

(事件内容)

End Sub

方法:对象名.方法名

所以方法是一个简单的不必知道细节的无法改变的事件,同样,方法也不是随意的,一些对象有一些特定的方法。如果以上概念你记不住,不要紧,实践中你会明白一切,请继续学习。

二、Visual Basic 的开发周期

1,想清楚你想做到什么;

2,拿起笔在纸上画出你的用户界面;

3,拿起鼠标在屏幕上画出你的用户界面,确定对象的属性;

4,告诉计算机你要做的事;

5,让程序运行,看看能否工作;

6,如果不能工作,不必难过;

7,找出那个错误,重新开始。

你应该养成一些良好的习惯,这样在你编大程序时不至于丢三落四,为一些本来可避免的错误反复做第六步和第七步。

三、Visual Basic的存储和运行

1,编写的程序和对象的属性一块儿存在frm文件里;

2,整个程序里包含着一个或许多frm文件,Visual Basic将所有frm文件名存入一个vbp第 1 页 共 93 页

文件里,若丢失了一个vbp文件,尽管frm文件仍在磁盘上,但程序将不能运行了;

3,如果你的程序已经自以为成功了,你可以把它编译成EXE文件,这样做的好处是:

(1)在没有Visual Basic 的环境下可以运行;

(2)速度提高;

(3)别人不知道你的编程方法,还以为你是个编程专家,对你的编程效率大加赞叹。

更商业化的做法是做一张安装盘,Visual Basic 6.0在这方面也为你准备了工具,我们以后会讲到这个工具

四、Visual Basic的不同之处

1,建立用户界面。对Visual Basic来讲,用户界面是由你直接在屏幕上画出来的,所以Visual Basic的用户界面看上去总是十分完美。

2,程序对用户界面反应。在Visual Basic里有许多事件等待你去填写代码,它自动也知道向机器解释这个事件,仅此一点就已经省去你的许多时间。

3,结构化的语言。在Visual Basic里似乎没有主程序一说,所有的代码都在一个一个模块里,所以所有的程序看起来都是不很长。

五、Visual Basic的不足之处

Microsoft的C++程序员是不会开发出一样东西之后,让自己失业的,大多数简单好用的东西都有它的限制,Visual Basic也是一样。

1, C++和Pascal有更多的对计算机的控制,所以Windows是用C和汇编语言编的,UNIX也是用C语言编的,想用Visual Basic做一个操作系统是不可能的;

2, C++和Pascal是一种速度更快的语言,所以如果速度在程序中很重要,则Visual Basic

难以胜任;

3, Visual Basic不能在Macintosh、OS/2上运行,也不能在小型机或巨型机上运行。

当然,任何一门语言的精通都需要长时间的“玩耍”,然而现在,我们只须从玩Visual Basic开始。

§2 制作第一个Visual Basic程序

一、我们要做什么

1,我们要做的第一步是确立我们想做什么,我们想做的第一个自已的Visual Basic程序是让一张幸福的小脸眨眼睛的程序。

2,绘制用户界面,这是第二步。

在开始菜单里选程序项,选择Visual Basic 6.0组,选择Visual Basic 6.0,进入Visual Basic环境。下面是画控件的方法:

1,单击工具栏里想画的控件(这个工具栏出现在Visual Basic界面的左边);

2,在窗体里单击并拖曳鼠标,画出控件(打开Visual Basic时,会有一个名为Form1的空白窗体出现)。

二、绘制用户界面

1,单击工具栏里的选项按钮控件(OptionButton)里,画一个选项按钮,使它看起来象图示一样;

,单击并拖曳鼠标,在Form1第 2 页 共 93 页

2,再画三个选项按钮;

3,单击工具栏里图标控件(Image)廓;

4,再在旁边画四个图标;

5,单击工具栏里命令钮控件(CommandButton),单击并拖曳鼠标,在窗体里,,单击并拖曳鼠标,在窗体里,画一个图标轮画一个按钮;

6,从File菜单里选择Save File项;

7,在Save对话框填上HellloVB,它的扩展名是frm,单击OK钮;

8,从File菜单选择Save Project项;

9,在对话框里填上HelloVB,它的扩展名是vbp,单击OK钮。

现在,我们已完成了用户界面的一部分设计设计,运行的时侯它看起来就是现在这个样子的。

三、精确设置对象的属性

首先,我们不一定要设置对象的属性,Visual Basic有对其对象属性的缺省值,其次,尽管每个对象有数十个属性,但我们往往只须改变其中的几个值而已。可以在设计阶段改变对象属性,也可以在运行阶段改变对象属性属性。在这个程序里我们通过设计阶段的改变属性的方法和运行阶段的改变属性的方法来实行全部的功能。下面是设置属性的方法:

1,选择需要改变属性的对象(用鼠标在控件上单击,这时在控件周围出现八个小黑块,表示你已选上了这个控件);

2,按F4打开属性窗口;

3,选择想要改变的属性;

4,赋新值。

现在开始设置属性。

1,选择Form对象,按F4键,出现Property窗口;

第 3 页 共 93 页

2,选择Caption属性;

3,通过输入“My First Visual Basic Application”来改变设置;

4,选择Icon属性,单击属性栏旁边标有“…”的键,出现Load Icon对话框;

5,选择;

6,按OK键

7,选择Option1选项按钮,按F4键,出现Property窗口,选择Name属性,键入“optBoth”。其余的属性设置是这样的:

控件 属性 设置值

Option1 Caption

睁眼睛

Option2 Caption

眨左眼

Name optLeft

Option3 Caption

眨右眼

Name optRight

Option4 Caption

闭眼睛

Name optNone

Command1 Caption

退出

Name cmdExit

Image1 Picture

Stretch True

Name imgShow

Image2 Picture

Visible False

Name imgBoth

Image3 Picture

Visible False

Name imgLeft

Image4 Picture

Visible False

Name imgRight

Image5 Picture

Visible False

Name imgNone

注:

1,Image控件的Picture属性的设置和Form1的Icon属性的设置方法是一样的(即在第 4 页 共 93 页

属性栏旁边找到标有“…”的按钮,并按它。);

2,face04,face05,face06图标并不在vbicons子目录下,那是自已做的。在Borland C++、Visual C++、Visual FoxPro、Delphi等编程工具里都有制作图标的工具,可以用来制作自已的图标;

3,Visible属性的真假决定对象在运行时是否可以被看见,False值表示对象不可见;

4,Stretch属性决定Image控件里的图像能否被放大或缩小,当然,放得很大的图标会显得很粗糙。

现在我们终于完成了界面的设计,然而,这个程序还不能工作,因为计算机还达不到人的思维水平,它想象不出这个程序是做什么的,与此同时,你已想像出这个出这个程序执行时的样子了。

四、编写程序代码──最令人费解和最没有成就感的必要工作,除了程序员、专家,大多数人对程序代码都感到厌倦,幸好我们都不想成为世界级的程序员,所以目前的Visual

Basic 程序代码都不是很难。

1,选定一个对象,比如optLeft,然后按F7键或双击它,Visual Basic 显示代码窗口,Visual Basic 将显示:

Private Sub optLeft_Click()

End Sub

Private表明这段代码的应用范围,我们先不用深究这个词的内涵,Sub是一个开头,是subprogram的简写,optLeft是对象名,_是一个下划线,用来分开对象名和事件名,Click是指一个事件,Click就是“单击”的意思,()是一对括号,通常里面是过程所使用的参数,现在它是空的。

这一行的意思是:“这是当用户单击了optLeft选项按钮时,程序应该做的事。”

End Sub是这段代码的结束标志,意思是“这是这段代码的最后一行。”

我们要在这两行间输入指令。

2,现在输入如下指令

Private Sub optLeft_Click()

e = e

End Sub

3,从代码窗口顶部选择Object列表框,选择optRight控件,Visual Basic将显示另一个空的Click过程。

4,输入如下代码:

第 5 页 共 93 页

Private Sub optRight_Click()

e = e

End Sub

5,用同样方法再输入三条指令:

Private Sub optBoth_Click()

e = e

End Sub

Private Sub cmdExit_Click()

End

End Sub

Private Sub optNone_Click()

e = e

End Sub

按下F5键运行这个程序,看它是否能运行。如果运行不正确,那么你要找出错误,再试一次。

我们已经成功地完成了这个例子,你已经首次尝试了Visual Basic的编程过程。是否十分简单?其实编程序就象眨眼的小脸一样有趣。

第二章 用户界面设计

§1 用户界面设计概述

一,在设计前应该了解的

通常程序总是由用户操纵的,所以用户需要一个界面来进行操纵。往往那些漂亮的简单的界面更加吸引用户,让他们认为程序有魔术般的力量,这样他们才会使用这个程序。下面有四条设计界面的原则。

1,了解用户的习惯

2,保持简单

3,允许用户的错误,并给以提示

4,让用户了解他在程序中的位置

二,Visual Basic用户界面设计基础

第 6 页 共 93 页

通过我们的第一个Visual Basic程序的设计,我们已经知道界面的设计有两步:先绘制控件,然后确定控件属性。我们发现绘制控件并不是很难。在工具箱里单击想画的控件,在窗体里按下鼠标并拖曳,然后松开鼠标即可。双击工具箱里的控件,将在窗体中央出现那个控件。如果用这种方法的话,要注意双击第二个控件时把上一个控件移开,否则两个控件会叠在一起,引起一些混淆。确定属性的方法是先选中控件,然后按F4键进入Properties窗口,接着在Properties窗口中找到要设置的属性并进行设置。

下面解释一些常用的属性,这些属性几乎总是要被设置和改变。

(1)Name属性

对象都有名字,尽管我们可以通过描绘一些特性来描绘对象,这样做总是非常麻烦。计算机也是一样,它把名字看成对象于对象之间的根本差异。由于计算机的这种顽固观点,它拒绝在同一窗体里出现重名的情况(除非这是一个控件数组),它也拒绝超过40个字的名字。

在简单的程序里,给控件命名不很必要,我们完全可以使用控件Name属性的缺省值。例如Text1。但在有几十个控件的复杂窗体里,这种方法会使你花更多的时间去区分它们。所以,Visual Basic向你推荐由三个小写字母的前缀和一个第一个字母为大写的描述性单词组成的名字。例如cmdMyButton是一个命令按钮(前缀是cmd)

推荐的前缀是:

对象

确认框(Check Box)

组合框(Combo Box)

命令钮(Command Button)

数据库控件(Data Control)

目录列表框(Directory List Box)

驱动器列表框(Drive List Box)

文件列表框(File List Box)

前缀

chk

cbo

cmd

dat

dir

drv

fil

例子

chkCareerChioce

cboCrimesCommitted

cmdExit

datTopSecretInfo

dirTree

drvHardDisk

filDocuments

第 7 页 共 93 页

窗体(Form)

框架(Frame)

水平滚动条(Horizontal Scroll Bar)

图形(Image)

标签(Label)

线(Line)

列表框(List Box)

菜单(Menu)

选项钮(Option Button)

图形框(Picture Box)

几何图形(Shape)

正文框(Text Box)

垂直滚动条(Vertical Scroll Bar)

frm

fra

hsb

img

lbl

lin

lst

mnu

opt

pic

shp

txt

vsb

frm1040Tax

fraGroupButtons

hsbTemperature

imgPrettyDrawing

lblFakeName

linBorder

lstCandidates

mnuHamAndEggs

optStation101

picPrettyPicture

shpUpOrShipOut

txtWarning

vsbMoneyRaised

(2)Caption属性

这仅仅是一个装饰性的属性,它可以长达255字符,包括空格和标点符号,比如一个叫cmdOk的命令钮,它的Caption属性就可以是“Ok”。

编程序时也要考虑到使用键盘的用户,在设置Caption属性在需要加下划线的字母前加上 “&” 符号,例如 “&File”,输出的就是“File”,这样就可以通过按ALT键和标题上那个带下划线的字母来选取它了。你不必为此编任何代码。

(3)Top,Left属性

只有两种情况需要在属性窗口里设置这两个属性:第一种是用户没有鼠标,第二种是程序员需要十分精确地设定这两个值。这两个属性决定对象的位置。当你选中对象,单击并拖曳它的时候,你便在修改这两个值了。

(4)Height,Width属性

这两个属性决定了对象的大小,当你选中控件时,它周围出现八个小黑方块,你把鼠标指向这些方块,鼠标指针将变成一个双向的箭头,这时按下鼠标并拖曳它,即可改变控件的大小,也就改变了Height,Width属性。同Top,Left属性一样,我们主要通过鼠标的操作来设置Height,Width属性。

§2 窗体和命令钮介绍

一、窗体

窗体是Windows的基本组成部分,这也是为什么这个操作系统叫Windows的原因。它的主要属性除上面介绍的以外,还包括:

1,Appearance属性

这个属性用来决定控件是否采用三维效果。

2,BorderStyle属性

这个属性决定了窗体的边框形式,共有6种属性值。改变窗体的BordrStyle属性后,窗体在屏幕上没有变化,它只在运行时才变为你所要求的样子。

第 8 页 共 93 页

3,ControlBox属性

程序员用来决定采用不采用控制框的属性,仅在程序运行时才有效。

4,Font属性

程序员可以改变该窗体上显示信息的字体,它控制着直接在窗体上打印的文本显示。

5,Icon属性

这个属性是用户经常要使用的一种属性。当用户的应用程序在工具条上最小化或在Windows桌面上变为一个独立应用程序时,该属性决定将采用何种图标,窗体控制框里的图标也由它决定。为自己的窗体设置该属性时,要控制住自己挑三拣四的冲动。

6,Visible属性

该属性决定窗体是否可见。错误地改变其值是很危险的,窗体会从眼前消失,这种莫名其妙的事情会使用户惊惶失措,所以肩负重任的程序员一定要慎重哟!

7,WindowState属性

指定窗体在运行时的三种状态:正常、最小化、最大化。

二、窗体的主要事件

1,Load事件

这个事件发生在窗体被装入内存时,且发生在窗体出现在屏幕之前。窗体出现之前,Visual Basic会看一看Load事件里有没有代码,如果有,那么它先执行这些代码,再让窗体出现在屏幕上。

2,Click事件,Dblclick事件

这两个事件在单击或双击窗体时发生。不过你单击窗体里的控件时,窗体的Click事件并不会发生,Visual Basic会去看控件的Click事件里有没有代码。

3,Activate (活动事件)与Deactivate(非活动事件)

显示多个窗体时,可以从一个窗体切换到另一个窗体。每次激活一个窗体时,发生Activate 事件,而前一个窗体发生Deactivate事件。

三、窗体控制

1,装入或卸出窗体

要装入或卸出窗体,用Load 或Unload语句。Load语句的语法如下:

Load formName

而UnLoad语句的语法是:

UnLoad formName

FormName变量是要装入或卸出的窗体名。 Load语句只是把窗体装入内存,并不显示出 来,要显示窗体可以使用窗体的Show方法。

2,显示或隐藏窗体

要显示窗体,用Show方法。若尚未装入内存则先装入再显示。它的语法如下:

mode

FormName变量是窗体名,可选变元mode为0(缺省值)时窗体为非模态,为1时窗体为模态。模态窗体完全占有应用程序控制权,不允许切换到别的应用程序,除非关闭!而非模态窗体则反之。

同理,隐藏窗体用。

四、命令钮

命令钮有两类:一类是简单的命令钮,一类是图形钮。图形钮常常成组地出现在屏幕的顶端,成为一些程序炫耀自己贴近用户的标志。图形钮充分利用了图形用户界面的特征,而且比命令钮小,但它的缺点是用户必须知道图形钮是什么意思,而且没有鼠标的用户恐怕用不了图形钮。命令钮也有Appearance、Caption、Font、Left、Visible之类的属性。命令钮的最主要事件就是Click事件,它还有MouseDown和MouseUp等事件

第 9 页 共 93 页

§3 建立菜单

一般Windows的菜单条包含File,Edit,Window和Help菜单标题。其它的菜单,程序员应将它们插在Edit和Window菜单之间。在Visual Basic里,为了创建菜单,必须打开菜单编辑窗口。可以按下Ctrl+E键,也可以从Tools菜单中选择Menu Editor项,或者单击Visual

Basic主窗口的从左边数第六个图形钮。

一、给菜单命名

菜单标题和菜单命令也有Caption和Name属性,你设置了这两个属性就等于创建了菜单。于控件一样Caption是屏幕上可见的,而Name则是一个抽象名称。别忘了在Caption里加入 “&” 以帮助没有鼠标的用户。

二、增加和删除菜单

在Menu Editor中部有三个命令钮分别是Next,Insert,Delete。Insert可用来增加新的菜单。在这三个键下面的Caption列表框里选中菜单项(这时它的底色就变成深蓝色),单击Insert键,Visual Basic将上一个增亮菜单下推并增亮一空行,你就可以输入新菜单名和标题了。Delete键可用来删掉菜单。你选中要删掉的菜单,单击Delete键就可以删掉它了。

三、移动菜单标题

有四种情况,向上移动,向下移动,向左缩排,向右缩排,这就是Menu Editor中间上下左右箭头的功能。选中某一菜单标题,安上下箭头,则这个菜单将上下移动到你喜欢的位置上,这也决定了它在界面中的位置。如果你按左右箭头,情况则有所不同。由于菜单是分级的,所以,如果它没有缩排,则它是一个菜单标题;如果它缩排一次,那么它将变成一个菜单命令;如果缩排两次,那么它将成为一个子菜单命令。Visual Basic里你可以总共设计四层子菜单。

四、设置分离条

分离条是指在菜单中将命令分组的线。

奇怪的是,Visual Basic将分离条也看成一个菜单项,它也需要Caption和Name属性,而且它也有其它属性,分离条与菜单项的区别是分离条的Caption属性必须是连字号即减号。也就是,当你设置了一个Caption属性为 “-” 的菜单项时,实际上你就设置了一个分离条,第 10 页 共 93 页

分离条的名字可以是barFile1之类,以表明分离条的位置。

五、菜单的各种简单属性

在Menu Editor里有许多确认框和一些正文框及一个下拉式的列表框,这些东西决定了菜单的各种属性。

1,Checked属性

这个属性值设置为真,将在菜单命令左边产生一个打勾的确认标志,你可以看看File

Manager里的View菜单就可以了解什么是确认标志了。

2,Enabled属性

各种各样的用户会产生千奇百怪的操作,在许多Edit菜单里都会有不同形式的让菜单命令模糊的情况。Enabled属性就是用来做这件事的。Enabled属性为真,则菜单命令是清晰的,Enabled属性为假,则菜单命令是模糊的,这时用户就不能选中这个菜单项了。

3,Visible属性

用户看见一个模糊的菜单而不能选的时候,有时会非常生气。所以,如果用户看不见这个菜单命令时,他也就不会发无名之火了。如果把Visible属性设为假,则菜单根本不会出现在屏幕上。这样做比把Enabled属性设为假显得更加干脆!

4,Index属性

可以生成菜单命令数组,用索引号区分开。例如向File菜单中添加一系列最近打开的文件名。添加菜单可用Load方法。

以上属性可以在运行时设置,形成动态的菜单的情况。

例如:

d = False

e = False

你还可以改变Caption等属性。

n = “Redo”

在对窗体,命令钮和菜单有所了解后,工具箱里的其它控件就更加容易理解了。下面这些控件的熟练运用,将使你做出漂亮的界面。

六、生成弹出式菜单(或浮动菜单)

几乎每个Windows应用程序都提供弹出式菜单,用户可以右键单击窗体或控件取得这个菜单。弹出式菜单也属于普通菜单,只是不固定在窗体上,而是可以在任何地方显示。

弹出式菜单用PopupMenu方法调用。假设我们已经用Menu Editor生成了名为mnuedit的菜单,则可以在MouseUp事件加入如下代码:

If Button = 2 Then PopupMenu mnuedit

下面将用一个实例展示动态菜单和弹出式菜单。

左图表单显示了一个弹出式菜单,在表单的空白处右击鼠标就可得到。左图表单显示第 11 页 共 93 页

了一个动态菜单,单击Add runtime option钮一下就会使菜单Runtime Menu增加一项,而单击Remove runtime option钮一下就会使菜单Runtime Menu减少一项。其源代码如下:

Dim rtmenu

Private Sub cmdadd_Click()

rtmenu = rtmenu + 1

If rtmenu = 1 Then mnuoption(0).Caption = "Runtime Option"

Load mnuoption(rtmenu)

mnuoption(rtmenu).Caption = "option #" & rtmenu

End Sub

Private Sub cmdremove_Click()

If rtmenu = 0 Then

MsgBox "menu is empty"

Exit Sub

End If

Unload mnuoption(rtmenu)

rtmenu = rtmenu - 1

End Sub

Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)

If Button = 2 Then PopupMenu mnuedit

End Sub

§4 框架,确认框和选项钮

一、确认框和选项钮就好比多项选择和单项选择,在考试时选择题总比简答题要好做,因为你可以用瞎蒙的策略。用户界面设计的保持简单的原则使确认框和选项钮成为有用的框件。确认框和选项钮用于向程序输入信息。确认框选中时会在小方框里打一个钩,菜单设计窗口里就有这种确认框的例子。

选项钮选中时会在小圆圈里点一个点。它们的主要属性除了Name,Caption等,还有:

1,Value属性

决定它们是否被选中的属性。

2,Alignment属性

决定它们的对齐方式。

二、有两道选择题或更多时,我们就必须对它们进行分组。这种分组需要借助框架控件。分组的方法是:

第 12 页 共 93 页

1, 在工具箱里单击Frame控件;

2, 在窗体里拖曳鼠标画出框架;

3, 在工具箱里单击确认框或选项钮控件;

4, 在框架里画确认框或选项钮;

5, 把所需的确认框或选项钮都画好。

§5 正文框和标签

正文框通常用于向计算机输入信息,而标签通常用于输出信息。正文框是一个十分重要的控件,因为由确认框和选项钮向程序输入的信息毕竟只有少数的几条信息而已。标签和正文框的区别很小,标签可以看成是一个在运行时不能修改正文的正文框。因此标签主要用于输出信息。标签是生活中不可缺少的部分,比如教室里的“团结,勤奋,严谨,活泼”就是一个每天不得不面对的标签。

1,BorderStyle属性

决定了正文框和标签的边框形式。

2,正文框的Text属性和标签的Caption属性

这两个属性其实是一样的,它决定了用户在屏幕上看到的东西,只不过正文框的Text属性在运行时可以直接在正文框里修改。

3,Alignment属性

这个属性决定正文或标题的排列方式。

4,正文框的Multiline属性

如果正文框里的字太多了,超过了正文框的宽度,那么计算机就在某个我们不知道的地方显示这行字,所以我们要设置Multiline属性为True,这样正文框就有了字换行的能力。

5,正文框的PasswordChar属性

如果用户从事的是一种掌握大量金钱或机密的工作的话(此类用户肯花大钱来买关于计算机的东西),那么他就需要对自己的工作遮遮掩掩,在Visual Basic里你可以作一个口令正文框来实现这种遮掩。方法是:

(1)选中作为口令正文框的正文框。(它的周围出现八个小方块)

(2)按F4键打开属性窗口。

(3)设置Multiline属性为False。

(4)设置PasswordChar为用于掩盖的字符。(只能是一个字符,比如 * 号)

第三步使口令正文框只有一行,因为Multiline属性为True将使Password属性失效。Visual

Basic认为口令不必太长,因为太长的口令更加容易忘记。

6,正文框的Maxlength属性

为了防止一些古怪用户输入太多的废话,程序员有限制正文框正文长度的权力,这就是Maxlength属性。如果Maxlength属性设置为零,那么正文框就只受计算机内存的限制了。

7,Label的AutoSize属性和WordWrap属性

第 13 页 共 93 页

这两个属性在一起搭配使用总是让人混淆,以至于Visual Basic附带的示例程序里有一个程序里有这两个属性的例子,它的路径通常是c:。在Visual

Basic里运行这个例子,选择Options菜单的WordWrap and AutoSize。AutoSize属性使标签自动地扩大缩小以适应标签的Caption属性,但是它只会水平伸展。WordWrap属性使标签具有字换行处理的能力。

为了使标签具有垂直伸展和字换行处理,必须设置它的AutoSize属性和WordWrap属性同时为True。

AutoSize属性为False,WordWrap属性为False时,若标签不够高而Caption太长时,Caption将被切割掉。

AutoSize属性为False,WordWrap属性为True时,情况同上。

AutoSize属性为True,WordWrap属性为False时,表示可以水平伸展,但只显示一行信息。

Locked属性

程序员可以阻止用户改变文本框的内容,用户只可以看文本而不能改变它。这是Visual

Basic 4.0的新功能。

§6 图形框(Picture Box)和图象框(Image Box)

Picture Box和Image Box是用来把图形放入程序里的。Picture Box和Image Box可以显示几种不同格式的图形。Bitmap文件(.BMP或.DIB)、Icon文件(.ICO或.CUR)、Metafile图元文件(.WMF)、增强型图元文件(.EMF)、JEPG(.JPG)及GIF(.GIF)文件。在Visual Basic里Microsoft大概送给了我们几百个上述前三类文件,它们的路径通常是:c:vbbitmaps、c:vbicons、c:vbmetafile。它们的主要属性有:

1,设置Picture Box和Image Box的Picture属性

(1)单击Picture Box或Image Box。

(2)按F4键打开属性窗口。

(3)单击Picture属性。

(4)单击设置框右边的省略号,Visual Basic将显示Load Picture对话框。

(5)选择用户需要的文件,单击Ok键。

则Visual Basic将图形装入Picture Box或Image Box。如果想在程序运行期间装入或删除图形,就需要用程序代码来实现了。我们可以使用Load Picture函数。例:

装入图形

e = LoadPicture ( “c:” )

删除图形

e = LoadPicture ( “ ” )

2,Picture Box和Image Box的BorderStyle属性

如同正文框和标签一样,你可以设计Picture Box和Image Box的边框。

第 14 页 共 93 页

3,Stretch属性和AutoSize属性

Image Box只有Stretch属性,而Picture Box只有AutoSize属性。

AutoSize属性设为True,则Picture Box改变自己的大小来适应其中的图形。

Stretch属性设为True,则Image Box中的图形将改变自己的大小来适应外面的边框。

§7 Line和Shape控件

总有一些除了装饰作用没有别的功能的东西。如Line 和Shape控件。

1,Line和Shape的BorderColor属性

一般来说边界颜色是黑的,但你也可显示你喜爱的颜色。在属性窗口里单击BorderColor属性,再单击省略号,Visual Basic将显示一块调色板,在调色板里选择你喜爱的颜色。

2,Line和Shape的BorderWidth属性

这个属性决定线的粗细。

3,Line和Shape的BorderStyle属性

这个属性决定线的轮廓。

4,Shape的FillStyle属性

在形状中我们可能更加喜欢实心的样子,这也可以做到。

我们已经了解了窗体,菜单,及十种不同的控件,这正是Windows的基本元素,再加上它们的各种属性,就可以画出各式各样的用户界面了!

§6&§7总结:Image、Shape 和 Line 控件有时被称作轻量图形控件。它们需要较少的系统资源,因此比 PictureBox 控件显示得快并且包含 PictureBox 中可用的属性、方法和事件的子集。每一个控件都适用于一个特定的目的。

1、其它控件的容器: PictureBox 2、Printing 或 graphics 方法: PictureBox 3、显示图片 Image 或 PictureBox 4、控件显示简单图形元素:Shape 或 Line 控件

第三章 编程的基础

在我们设计完用户界面后,我们就将开始了编写指令代码的过程。这是一个相对枯燥但却是必须的过程。

§1 Visual Basic编程概述

一、事件驱动应用程序

简单地说就是当事件发生时程序才工作,否则程序将等待事件的发生。在事件驱动程序中,用户的操作或系统事件执行一个事件过程,这样,程序执行的顺序就由哪一个事件的发生决定,由用户的操作决定。就是用户管理,代码响应。

二、事件过程

用户界面对事件响应的三个部分是:

1,窗体

2,控件

3,菜单

编写程序代码的通常过程是:

1,确定哪一个对象(窗体,控件或菜单)做出反应——单击此对象选中它;

2,打开代码窗口——简单的方法是按False7键或者双击对象;

3,找到响应的事件;

第 15 页 共 93 页

代码窗口的Object列表框可以选择对象,旁边的Proc列表框可以选择对象的事件。如果事件已经有了代码的话,那么在Proc列表框里这个事件名用黑体显示。空的事件代码都由两行组成,如:

Private Sub Form_Load()

|

End Sub

4,编写程序代码。

三、变量

程序总是要做三件事:

1,得到数据;

2,处理数据;

3,输出数据。

在程序运行时,这些数据被储存在变量里,变量可理解为计算机内存条上的一个微观的东西。一旦关机,变量就消失了。变量在Visual Basic里有两种类型:

1,程序员建立的变量;

2,对象的属性往往也看成变量。

变量必须满足:

1,字母开头;

2,不超过40个字;

3,只包括字母,数字,下划线;

4,不是保留字。

创建变量的方法:

1,用Dim语句说明它;

2,可以省略声明语句而用变量声明字符生成确定类型的变量。在程序执行时若要生成变量并指定数据类型,可加入下表所示的变量声明字符后缀。

符号

$

%

&

!

#

数据类型

String

Integer

Long

Single

Double

举例

A$, message Text$

Counter%, var%

Population&,colorValue%

Distance!

ExactDistance#

3,把一个值赋给一个名称,Visual Basic就把这个名称看成变量。

Dim语句的语法是:

Dim VariableName As Type

例如: Dim MyName

As Type部分可以省略,它涉及到我们将要讲的关于数据类型的问题。Dim语句的作用是声明变量并分配存储空间。

第 16 页 共 93 页

赋值语句的语法是:VariableName = Value 或 VariableName1 = VariableName2

与数学中的等号意义不同,这里等号只表示把后者的值赋给前者,所以,A = A + 1在Visual Basic里是合法的。例如:n = “Exit” (这是一个改变对象属性的例子)

四、数据类型

变量可以存放数字或字符串等东西,但是MyName变量并不需要存放数字,所以你可以限制存放的数据类型。你可以规定MyName只能字符串。Visual Basic提供了七种数据类型:

1,整型(Integer)

2字节整数,标识符(同上面的变量声明字符)为百分号(%),范围从-32768到32767,运算很快。

2,长整型(Long)

4字节整数,标识符为&,范围从-2147483648到2147483647,运算很快。

3,单精度型(Single)

4字节浮点数,标识符为!,范围可达38位数字,前7位可靠,运算比整型和长整型慢。

4,双精度型(Double)

8字节浮点数,标识符为#,范围可达300多位,但是可靠的只有前16位数字。

5,字符串型(String)

标识符为$,在32位版本的Visual Basic 4.0中,字符串可容纳高达200兆字节的内容。

6,货币型(Currency)

8字节定点数,标识符为@,小数点右边4位,左边15位。

7,日期型(Date)

用于存放日期,范围从#January 1,100#到#December 31,9999#,日期的格式取决于系统的设定,赋值方法是:New = #January 1,2000# 。

8,字节型(Byte)

Visual Basic 4.0新增加的数据类型,用于存放0到255的整数。

9,布尔型(Boolean)

只有True或False两个值。

10,变体型(Variant)

如果你不告诉Visual Basic你的变量是什么类型,Visual Basic就自动把它看成变体型。变体型的意思就是它没有类型,或者是任何类型。如果声明了Variant变量而未赋值,则其值为Empty。

例如:Dim MyName As String

事实上,语句Dim MyName只是将MyName变量声明为变体类型罢了,因为变体类型是Visual Basic的缺省类型。但是,我们使用数据类型的原因是什么呢?

1,使用最小的数据类型可节省内存;

2,程序员可以容易地找出每一变量所存放的数据类型;

3,可以防止数据类型存放错误引起的错误。

例如:

Private Sub Form_Load()

Dim MyName As String

MyName = “DongShan”

End Sub

变换变量类型

有时需要将一种变量类型变成另一种变量类型,下表列出了进行变量类型转换的函数:

第 17 页 共 93 页

函数

Cbool

Cbyte

CCur

CDate

CDbl

CInt

说明

将变元变成布尔值

将变元变成字节值

将变元变成货币型值

将变元变成日期值

将变元变成双精度值

将变元变成整型值

函数

CLng

CSng

CStr

Cvar

CVErr

说明

将变元变成长整型值

将变元变成单精度值

将变元变成字符串值

将变元变成变体值

将变元变成错误值

例如要将如下的初始化变量:

Dim A As Integer

变成双精度值,可用下列函数:

B=CDbl(A)

用户自定义的数据类型------记录

保存多个相同或不同类型数值的结构称为记录(record)。

在VISUAL BASIC 中定义记录,用Type语句,其语法如下:

Type varType

Variable1 As varType

Variable2 As varType

Variablen As varType

End Type

例如定义一个名为CheckRecord的记录:

Type CheckRecord

CheckNumber as Integer

CheckDate as Date

CheckAmount as Single

End Type

CheckRecord结构可以像普通变量类型一样使用。要定义这个类型的变量,使用如下语句:

Dim check1 As CheckRecord

要对结构的各个字段访问, 可使用如下语句:

check1. CheckNumber=123

check1. CheckDate=#08/14/1996#

check1. CheckAmount=240.00

强制的变量声明

Visual Basic并不要求变量声明,但对于编写大型应用程序时,变量声明的确很有好处。

因此Visual Basic提供强制声明的方法,只要在窗体或模块的声明部分加上一条语句:

Option Explicit

这个语句使编译器检查每个变量的声明,如果要用的变量没有声明,则发出一个错误消息!

数组

单个变量只能存放单个实体,而数组可以存放一组相关的数据。像变量一样,数组有名称,存放在数组中的数值通过一个索引来访问。

数组的定义必须用Dim语句声明,如下:

Dim Names(9) As String '也可以不指定数据类型

第 18 页 共 93 页

Names是保存了10个元素的数组,Names(0)是第一个元素,Names(9)是最后一个元素。数组元素的赋值如下:

Names(0)="John"

Names(1)="Tom"

Names(9)="Xionghui"

数组的第一个元素的索引可以不是0,可以在Dim语句中指定下限:

Dim Names(1 To 16)

Dim Names(5 To 16)

动态数组

有时可能不知道需要多大的数组,这时可以生成动态数组,其长度可以在运行程序时改变。定义动态数组,和平常一样用Dim语句(或Private和Public),但不要指定长度(或维数):

Dim DynArray()

后面等能确定维数的时候,再用ReDim语句重新确定实际长度(或维数):

ReDim DynArray(UserCount)

ReDim语句只能出现在过程之中,它是可执行语句。

但每次执行ReDim语句,数组中原先存放的所有当前值会消失。但有时可能想改变数组的长度,而不损失原有的数据,幸好Visual Basic提供了Preserve关键字,它就能作到!例如下面语句将数组加大一个元素而不改变原有数据:

ReDim Preserve DynArray(Ubound(DynArray)+1)

五、变量的使用范围

Visual Basic的变量有三种使用范围。

1,局部变量;

2,模块级变量,也可以叫做窗体级变量,因为窗体和模块是同级的;

3,全局变量。

局部变量只存在于说明它的过程里,为说明一个局部变量,应在一个事件过程中说明。

模块级变量可存在于这个窗体或模块中,可以被所有窗体内的事件过程所引用和改变,说明模块级变量的方法是:

1,按F7键打开代码窗口;

2,在Object列表框中选择(general);

3,在Proc列表框里选择(declarations);

4,用Dim语句说明。

全局变量从程序开始时存在至程序结束,不过全局变量的错误也许会导致致命的错误,你不得不读遍程序来寻找到底在说明地方改变了全局变量。创建全局变量的方法是:

1,从Insert菜单里选Module项,这个命令为一个BAS模块文件显示代码窗口;

2,在Object列表框中选择(general);

3,在Proc列表框中选择(declarations);

4,用Public语句说明全局变量。

六、算术,逻辑,比较运算符

1,算术运算

尽管一台上万元的计算机看来很高科技,但它在算术运算方面并不比一个几十元的计算器强多少。

第 19 页 共 93 页

运算符

+

-

*

/

运算

加(也是字符串拼接)

减(也是取负值)

浮点数除

运算符

Mod

^

&

运算

整数除

取余数

乘方

字符串拼接

2,逻辑运算

逻辑运算是对True和False进行操作的运算。Visual Basic将True的值看成-1,将False的值看成0。

运算符

And

Or

Xor

Not

使用

变量1 And 变量2

变量1 Or 变量2

变量1 Xor 变量2

变量1 Not 变量2

意义

两个量均为True ,才返回True

只要有一个量为True ,返回值就为True

两个量一个为True,一个为False才返回True

简单地把True 变为False ,把False 变为True

3,比较运算

比较运算是比较两个数或字符串的大小。

运算符

<

<=

>

意义

小于

小于等于

大于

运算符

>=

=

<>

意义

大于等于

等于

不等于

有时候,复杂的运算会把我们搞晕,良好的习惯是加括号。如:x = ( 5 * ( 8 + 9 ) ) ^ 2,则计算机先处理 ( 8 + 9 ) ,再处理 ( 5 * ( 8 + 9 ) ) ,最后才是乘方。再如:x = ( 5 * 6 ) / 2,这个括号加得似乎没什么意义,但它使我们清晰地知道是从哪儿开始运算的。

七、字符串操作

有时程序需要对字符串进行操作,比如从一个文件的完整路径名中找出文件的名称。下面介绍几个常用的函数。

1,Len函数

返回字符串的长度。如Length = Len(“string”),则Length = 6。

2,LCase函数,UCase函数

LCase函数把字符串变为小写字母。UCase函数把字符串变为大写字母。如:

x = LCase (“DONGSHAN”)

x = UCase (“visual Basic”)

3,Left函数,Right函数

语法是:

Left (VariableName , N)

Right (VariableName , N)

Left函数从字符串的左边提出N个字符。Right函数从字符串的右边提出N个字符。

4,Mid函数

语法是:

x=Mid (VariableName , n, m)

Mid函数从VariableName字符串的第n个字符开始取出m个字符。

5,Instr函数

第 20 页 共 93 页

语法是:

Instr (VariableName1 , VariableName2)

Instr函数从VariableName1里找出VariableName2的位置。如:x = Instr (“ABCD” , ”CD”),此时x = 3。如果计算机没找到要找的字符串,则这个函数返回0。

6,LTrim函数,RTrim函数,Trim函数

LTrim函数将去掉字符串前的空格。

RTrim函数将去掉字符串后的空格。

Trim函数将去掉字符串前后的空格。如:x = RTrim (“John “),此时x = “John”。

7,Val函数

语法是:

x = Val (VariableName )

这个函数将字符串里的数字字符串转化为数字。如:Y = Val (“123”),则 Y = 123。

当Visual Basic发现下一个字符不是数字时就停止继续转化。

8,Str函数

与Val函数相反,Str函数将数字转化为字符串。

语法是:

x = Str (VariableName )

八、常量及注释

1,使用常量

如果我们编一个程序从每笔收入中拿出40%用于饭卡的消耗,则在程序中我们会总是用到0.4这个数字。这时粮食涨价了,我们不得不把0.4全都改成0.5,这就显得非常麻烦。我们本可以定义并使用一个常量为0.4,在涨价时把它小小调整一下就可以了。常量命名的要求与变量一样。常量的使用范围也与变量一样,分为:局部常量(在过程里用Const说明)、 模块级常量(在窗体,模块的声明区用Const说明)、全局常量(在模块的声明区用Public

Const说明)

2,使用注释

用 “ ‘ “ 注释。如:‘ This Sub is used to get Windows version

撇号右边的东西Visual Basic通常用绿色的字来显示,而且Visual Basic将忽略注释的东西。在Visual Basic 4.0所附的示例程序里使用了大量的注释,这样使其他人(也包括自己)能更好地读懂程序,所以使用注释是一个好习惯。

注释的忽略性也有一些小用处,如:

x = ( 3.5 ^ 2 - 4 ) * ( 5 + 6.73 * 7 2 ) - 10.89

现在你需要测试这一语句是否是必要的,于是你把它删除,再运行看是否能得出正确的答案,如果它是不必要的,那就很顺利,如果它是必要的,你就不得不痛苦地再输入一遍而且还有输错的可能。现在你可以选择把它注释掉,这样程序运行将忽略它的存在,也可达到上面测试的目的。

§2 Visual Basic的语句

一、条件选择语句

人们面临选择的时候精神会变得脆弱,这就是为什么我们总是轻信偷看来的答案。因此,选择对于人类来说是一件复杂的事情,而对于计算机来说,则非常简单。它头脑简单,因而永远不会发出哈姆雷特式的疑问——“是生,还是死?”

1,条件式

条件式必然代表一个值,是真(True)或者是假(False)计算机可以检测出这个值以做出相应的行动。下面就是判断的例子,其中加下划线的部分就是指条件式。

第 21 页 共 93 页

If Love =

与之相同的简略的形式是:

If

而 If Love = 与 If Not 的意义是相同的。

条件式中可加入逻辑运算符,如:

If x < 20 And x > 15 Then 表示当 15 < x < 20 程序将做什么。

If x < 15 Or x > 20 Then 表示当 x < 15 或 x > 20 时程序将做什么。

2,If - Then 语句

语法是:

If Condition Then Instruction

例如: If n > 25 Then = “ABC”

3,If - Then - End If 语句

If Condition Then

Instruction 1

Instruction 2

End If

这种结构可指示计算机执行一串语句。

4,If - Then - Else 语句

If Condition Then

Instructions1

Else

Instructions2

End If

这种结构指示计算机在条件不成立时应该做的事,这样保证了计算机至少执行一些语句。

5,If - Then - Else If 语句

If Condition 1 Then

Instructions 1

ElseIf Condition 2 Then

Instructions 2

ElseIf Condition 3 Then

Instructions 3

Else

Instructions 4

End If

类似这样的完整的语句可做出多次判断,又保证计算机至少执行一些代码。

6,Select - Case 语句

被选择的值为许多定值时,这个语句就更有用一些。

Select Case VariableName

Case Value 1

Instructions 1

Case Value 2

Instructions 2

Case Value 3

Instructions 3

第 22 页 共 93 页

End Select

Select - Case 语句的不足是它需要确切的值。

7,嵌套结构

我们可以把许多各式各样的条件语句嵌套在一起,而且这种嵌套在理论上没有限制。但事实上嵌套使用得越少,代码就越容易被理解。在嵌套时最好使用便于观察的缩排的格式。如:

Select Case Grade

Case "95"

If Class = "31" Then

Dorm = "1106-1108"

ElseIf Class = "33" Then

Dorm = "1104-1105"

End If

End Select

二、循环语句

计算机擅长反复地做一件事,循环语句将发挥它的这种优势。

1,Do - Loop 循环

Do - Loop 循环基本上是一个死循环,所以需要在循环时判断一些条件。

(1)Do While 循环 当Condition 条件为真时执行循环

Do While Condition

Instructions

Loop

While 也可以放在Loop 语句上。

(2)Do - Loop While 循环

Do

Instructions

Loop While Condition

这两种循环的不同之处是:Do While 循环先判断条件,所以,Do While 循环可能一次都不执行。Do Loop While 循环先执行指令,再判断循环条件。所以Do Loop While 循环至少执行一次指令。但它们都是当一定条件为真时的循环。

(3)Do Until 循环 当一定条件为假时执行循环

Do Until Condition

Instructions

Loop

Do Until 先判断条件,所以循环可能一次都不执行,它是当一定条件为假时的循环。

Do Until 等同于:

Do While Not Condition

Instructions

Loop

(4)Do Loop Until 循环

Do

Instructions

Loop Until Condition

Do Loop Until 先执行指令再判断循环条件,所以指令至少被执行一次。Do Loop Until 是第 23 页 共 93 页

当一定条件为假时的循环。

2,计数的循环 For - Next

(1)For - Next 循环必须有一个控制变量,这个控制变量一般为整型。语法是:

For Counter = Start To End

Instructions

Next Counter

这里的 Counter 就是控制变量。如果想运行5次,可用下面的循环:

For i = 1 To 5

Instructions

Next i

这时,每循环一次,i 的值就加1。

(2)向前向后计数

For Counter = Start To End Step Increment

Instructions

Next Counter

Increment 表明每次循环控制变量所加的值。如下面代码也可循环5次:

For i = 5 To 1 Step -1

Instructions

Next i

只有当Counter <= End 时循环才执行,当Counter > End 的时候循环就不执行了。所以

For i = 1 To 10 Step 7

Instructions

Next i

循环将执行两次,一次是当 i = 1 时,一次是当 i =8 时。

最好不要在循环内改变控制变量的值,这样往往会导致逻辑上的错误。

3,与条件语句一样,循环语句也可以嵌套。如:

Do While Condition

For i = 1 To 5

Instructions

Next i

Loop

循环总是先从内部开始的。比较:

For i = 1 To 4 For i = 1 To 4

For j = 1 To 5 For j = 1 To 5

Next j Next i

Next i Next j

是允许的 这种For - Next 的缠绕是不允许的

4,从循环中快速退出

通过使用命令Exit Do 和 Exit For ,我们可以在循环未结束前跳出循环。但我们应该保证所需的动作完成后再跳出来,否则也许会遇到新的错误。而且不要试图用Goto语句从循环外跳入循环。

下面的代码可以检测出3 至20 之间的质数。其中使用了循环的嵌套及条件语句,并且当发现 i 不是质数时立即用 Exit For 转向对下一个数的检测。

Sub Form_Click ()

Dim i, j, x As Integer

第 24 页 共 93 页

For i = 3 To 20

x = False

For j = 2 To i - 1

If (i Mod j) = 0 Then Exit For

If j = i - 1 Then x = True

Next j

If x Then Print i

Next i

End Sub

三、建立过程与函数

如同常量的定义一样,有时不仅仅是几个数字反复出现在程序中,而且是很多段代码在做几乎同样的事,如果有一些通用的代码可供调用的话,那么程序就会简练得多,而且更为清晰,这就是过程与函数。过程和函数保存在FRM文件和BAS文件里。若一个过程保存在BAS文件里,那么这个过程可供程序里所有的代码调用;如果一个过程保存在FRM文件里,那么这个过程只能被本窗体里的代码调用到。创建过程或函数的简单方法是选择Insert菜单的Procedure项。过程名,函数名的命名规则与变量名,常量名的命名规则一样。

1,过程结构

Sub subname (argumentlist)

Instructions

End Sub

argumentlist 指的是参数列表,所谓参数,就是指过程操作所需的指导条件。如下面过程:

Sub PrintHello (n As Integer)

Dim i As Integer

For i = 1 To n

Print "Hello"

Next i

End Sub

n 参数就是指导这个过程打印 “Hello” 的个数。当有许多参数时,可用 “,” 将它们分开。

如果在 Form_Click 事件过程里调用 PrintHello 过程,就可用键入:

Call PrintHello(5) ‘其中 Call 是Visual Basic的保留字

PrintHello 5

后一种省略 Call 和括号的方法使这个过程看起来更象一个Visual Basic的语句,所以我们可以这样认为:建立好的过程可以当作语句来使用。

2,函数结构

函数结构与过程结构基本上是一样的。

Function functionname (argumentlist) As type

Instructions

End Function

函数就是有返回值的过程,它自己是有数据类型的。但 As type 部分是可以省略的,这时函数的返回值将是变体类型的值。在调用没有参数的函数时也必须加括号。如:

Function Total (a As Integer, b As Integer, c As Integer) As Integer

Total = a + b + c

End Function

调用时可以这样:

第 25 页 共 93 页

Answer = Total (10, 20, 30)

又如:

Function CurrentTime ( ) As String

CurrentTime = Time

End Function

调用时应该这样:

s = CurrentTime( )

我们看出建立好的函数与Visual Basic 本身的函数在调用时也没有什么不同。程序员可以建立自己的过程与函数库以加快编程效率。

3,传值方式

当过程内改变了参数的值时,Visual Basic并不会产生错误信息,但这样可能引起一些混乱,如:

Sub PassedNotByValue (x As Integer)

x = x + 1

End Sub

在事件过程中调用:

Sub Form_Click ()

Dim i As Integer

i = 1000

PassedNotByValue i

Print i

End Sub

结果会是什么呢?是1001。在复杂的过程里不小心改变了参数的值,而调用过程的代码里这个参数又不应该改变的情况是很有可能发生的。改进的方法是:

Sub PassedByValue (ByVal x As Integer)

x = x + 1

End Sub

调用改为:

Sub Form_Click ()

Dim i As Integer

i = 1000

PassedByValue i

Print i

End Sub

结果将是1000,这就是传值方式,传值方式在参数行开始处加上 ByVal 保留字。属性总是用传值方式传递的。

第四章 Windows 95的新控件Visual Basic的输入输出

§1 ToolBar(工具条)控件

第 26 页 共 93 页

ToolBar就是那些在菜单下面的图形钮,这已经成为Windows应用程序的样板。

一、建立工具条

1,在工具箱里单击工具条图标,拖到窗体的任何位置,Visual Basic自动将ToolBar移到顶部。

2,按F4键打开属性窗口。

3,双击(Custom),打开ToolBar属性窗口。

4,选择Buttons标签。

5,单击Insert按钮,Visual Basic就会在你的工具条上显示一个空按钮,现在为你的每一个按钮重复这一步。

6,单击确定按钮。

如果你想把按钮分组,首先生成一个分隔的按钮,再在刚才提到的对话框里将这个按钮的Style属性改为3-Separator。

二、为工具条增加图画

1,在Visual Basic工具箱里单击ImageList图标,并将它拖到窗体的任何位置(位置不重要,因为它总是不可见的)。

2,按F4打开属性窗口。

3,双击(Custom),打开ImageListCtrl属性窗口。

4,选择Image标签。

5,单击Insert Picture,在现在图形的对话框里选择你想使用的位图或图标,然后单击打开按钮。为每个你想添加图形的工具条按钮重复此步。

6,单击确定按钮。

7,单击你的工具条,按F4,双击(Custom),显示ToolBar属性对话框。

8,选择General标签,在ImageList框里选择刚才添加的ImageList控件。

9,选择Buttons标签,单击紧挨Index框的向左或向右箭头以选择一个按钮序号。出现在工具条最左边的按钮序号为1。

10,在Image框里输入一个数,输入为1,则显示刚才ImageList控件里的第一个图形,输入为2,则显示刚才ImageList控件里的第二个图形。

11,为每个按钮重复第10和第11步。

12,单击确定按钮,现在Visual Basic就会在工具条上显示精美的图形了。

三、为工具条添加文本信息

在刚才提到的ToolBar属性对话框中选择Buttons标签,在Caption框里输入你想显示在按钮上的文本。

四、添加ToolTips

ToolTips是一种当你点到工具按钮是弹出的小标签。ToolTips很方便,可以告诉那些新手每个按钮是干什么用的。在刚才提到的ToolBar属性对话框中选择Buttons标签,在ToolTipText框里输入你想作为ToolTip的文本。

五、如何编写代码

双击你的工具条,以下面的格式输入代码就可以了。

Private Sub Toolbar1_ButtonClick(ByVal Button As Button)

Select Case

Case 1

'Code to follow if user clicks the first button

Case 2

'Code to follow if user clicks the second button

第 27 页 共 93 页

Case 3

'Code to follow if user clicks the third button

End Select

End Sub

§2 StatusBar(状态条)控件

和ToolBar一样,选中状态条,按F4键进入属性窗口,双击(Custom)可以进入主要的设置窗口SBarCtrl属性窗口。

一、选择面板形状

在SBarCtrl属性窗口里选择General标签,在Style列表框里选择多面板(缺省形式)或单面板简单文本形式。

二、添加或删除状态条面板

在SBarCtrl属性窗口里选择Panels标签,单击Insert按钮添加一个面板,或单击Remove按钮删除一个面板。

三、在单面板里显示文本

在SBarCtrl属性窗口里选择General标签,在SimpleText框里输入你想显示在状态条面板里的文本。用代码显示的方式是:

Text = "New string to appear"

四、在多面板里显示文本或图形

1,在SBarCtrl属性窗口里选择Panels标签,用Index旁的按钮选择面板序号。

2,在Text框里输入你想显示在状态条面板里的文本。

3,如果你想加入图形,单击Browse按钮打开一个图形选择对话框,选择你想加入的图形,然后单击打开按钮。

4,最后按确定按钮。

5,用代码显示的方式是:(x).Text = "New string to appear"

五、如何编写代码

如果是一个单面板状态条,当用户单击状态条时,只需用下面的事件过程来响应:

Private Sub StatusBar1_Click()

End Sub

如果是一个多面板状态条,就需要鉴别用户单击的是哪一个面板,可用下面的事件过程来识别用户所单击的面板:

Private Sub StatusBar1_PanelClick(ByVal Panel As Panel)

Select Case

Case 1

'Code to follow if user clicks the first panel

Case 2

'Code to follow if user clicks the second panel

Case 3

'Code to follow if user clicks the third panel

End Select

End Sub

第 28 页 共 93 页

§3 ProgressBar(进程条)控件

一、进程条的三个属性

1,Min属性代表进程条全空时的值,缺省时为0。

2,Max属性代表进程条全空时的值,缺省时为100。

3,Value属性代表进程条当前的值(不用在属性窗口里找这个属性,它不出现在属性窗口中,但它的确存在),它大于Min属性,小于Max属性。改变Value属性的值将改变进程条的进度显示。

为了了解进程条的功能,在窗体里添加一个进程条和一个命令钮,双击命令钮进入代码窗口,键入如下代码:

Private Sub Command1_Click()

If < Then

= + 5

Else

e = False ‘当进程条满了的时候让进程条消失

End If

End Sub

§4 Slider(滑块)控件

一、选择滑块的外观

1,Orientation属性决定滑块的方位,可以是垂直的或水平的滑块。

2,TickStyle属性决定滑块标记的样子。

3,TickFrequency属性规定了沿着滑块的标记的间隔大小,缺省的状态是1,表明每个可能值都出现标记,如果你把值设置为3,则每三个可能值出现一个标记。

二、滑块的Min,Max,Value属性

这三个属性和进程条的这三个属性差不多,Min,Max表示滑块的最小和最大值,Value表示进程条的当前值。

三、滑块的LargeChange,SmallChange属性

LargeChange规定了当用户用鼠标单击滑块时,滑块可移动的距离。SmallChange规定了用户按左箭头或右箭头时滑块的移动距离。

§5 TabStrip控件(象笔记本书签或一组文件夹的标签)

第 29 页 共 93 页

和ToolBar一样,选中TabStrip,按F4键进入属性窗口,双击(Custom)可以进入主要的设置窗口TabStrip属性窗口。

一、设置样式

在TabStrip属性窗口里选择General标签,在Style列表框里选择Tabs或Buttons样式。

二、规定TabStrip的标题,ToolTips和

1,在TabStrip属性窗口里选择Tabs标签,在Caption框里输入标题。

2,在TabStrip属性窗口里选择Tabs标签,在ToolTipText框里输入ToolTip。

三、增减标签总数

在TabStrip属性窗口里选择Tabs标签,单击Insert Tab按钮增加标签,单击Remove Tab按钮删除标签。

四、在TabStrip上显示图形

1,在窗体里拖入一个ImageList控件,

2,按F4打开属性窗口。

3,双击(Custom),打开ImageListCtrl属性窗口并选择Image标签。

4,单击Insert Picture,在现在图形的对话框里选择你想使用的位图或图标,然后单击打开按钮。为每个你想添加图形的Tab按钮重复此步。

5,单击确定按钮。现在ImageList里存储了你需要的图形。

6,选择你的TabStrip,进入TabStrip属性窗口并选择General标签,在ImageList列表框里选择ImageList1。

7,现在选择Tabs标签,单击紧挨Index框的向左或向右箭头以选择一个Tab序号。在Image框里输入一个数,输入为1,则显示刚才ImageList控件里的第一个图形,输入为2,则显示刚才ImageList控件里的第二个图形。

8,单击确定按钮。

五、用户响应

可用类似下面的代码来识别用户在哪一个项目上单击。

Private Sub TabStrip1_Click()

Select Case

Case 1

'Code to follow if user clicks the first tab

Case 2

'Code to follow if user clicks the second tab

Case 3

'Code to follow if user clicks the third tab

End Select

End Sub

六、在TabStrip上放置其它控件

在用户选择了标签后,TabStrip要求你编写代码来显示或隐藏控件。下面的代码上是一个TabStrip上有一个命令钮和一个选项钮的例子,当用户选择了第一个Tab时,选项钮出现,当用户选择了第二个Tab时,命令钮出现。

第 30 页 共 93 页

Private Sub TabStrip1_Click()

Select Case

Case 1

e = False

e = True

Case 2

e = True

e = False

End Select

End Sub

§6 Visual Basic的输入机制

程序的基本操作就是数据的输入,数据处理和数据的输出。Visual Basic的可用于输入的控件主要有:

正文框Text Box、确认框Check Box、选项钮Option Button、列表框List Box、组合框Combo Box、滚动条Scroll Bar、通用对话框控件。还有一个函数叫InputBox函数,也可用于数据的输入。

一、通过正文框输入数据

1,我们只要取得正文框的Text属性就可以对其进行操作了。如下面代码可将Text1正文框的正文变成大写输出至Text2正文框。

Private Sub Form_Click ()

= UCase()

End Sub

二、通过确认框和无线钮输入数据

我们只要检测到Check Box和Radio Button的Value属性值就可以知道它们是否被选上了。

三、通过列表框和组合框输入数据

1,列表框List Box和组合框Combo Box在Windows的Open,Save As对话框里最为常见。组合框又包括三种类型,这三种类型要在它的Style属性里设置。列表框仅仅把可以选择的项目列出来,而组合框里有的类型可以允许用户输入数据。它们的异同是:

名称

列表框

组合框类型0

组合框类型1

组合框类型2

2,列表项目的增减

第 31 页 共 93 页

是否有下拉选项

是否允许用户输入

使用AddItem,RemoveItem语句。通常将项目增减的语句放入Form_Load事件里。

ListBoxName. AddItem item

ComboBoxName. AddItem item

item是新项目名称,必须是字符串类型,非字符串类型可通过Str函数或Format函数来转换。

列表框,组合框的每一项目都有一个Index值,第一个项目的Index值是0,第二个是1,依此类推。删除项目可通过删除其Index值来实现。

ListBoxName. RemoveItem item

ComboBoxName. RemoveItem item

如:ListBoxName. RemoveItem 0则删除了第一项,这时原来的第二项就变成了第一项。

在Visual Basic 4.0里程序员终于可以在设计阶段设定列表项目了。方法是:

在属性窗口选择List属性,将出现一个下拉列表,在列表中输入第一项,按Ctrl+Enter,输入第二项……,最后用Enter结束。

3,取得列表框,组合框的数据

可以通过取得Text属性或通过取得ListIndex属性来判断哪一项被选择了。ListIndex属性的值也同样是第一个为0,第二个为1……如:

If = “Visual Basic” Then Instructions

If dex = 1 Then Instructions

组合框有时允许用户自己输入数据,这时所输入数据的ListIndex值为-1。

四、通过滚动条Scroll Bar取得数据

在Visual Basic的工具箱里有两种滚动条:一种是垂直的,一种是水平的,它们的差异无非是摆放的方向不一样。

1,滚动条的主要属性及事件

(1)Min,Max属性

Min属性决定滚动条最左端或最顶端所代表的值。Max属性决定滚动条最右端或最下端所代表的值。

(2)LargeChange,SmallChange属性

SmallChange决定在滚动条两端的箭头钮上单击时改变的值。LargeChange决定在滑块上方或下方区域单击时改变的值。

(3)Value属性

Value属性代表当前滑块所处位置的值,这个值由滑块的相对位置决定。

(4)Change事件

当滑块位置发生变化时就引发了Change事件。

2,取得滚动条的数据

滚动条并不是一个数据输入的好控件,因为你无法从滚动条上直接看出输入的数据,但它的优点是可以表示一定范围里的相对位置。为了得到数据,只要取得滚动条的Value属性就可以了。

五、InputBox函数

第 32 页 共 93 页

InputBox函数提供一个简单的对话框供用户输入信息。在把其它版本的BASIC程序移植到Visual Basic时,InputBox函数通常用来代替INPUT语句。这个对话框的样子基本上是下面的样子。

它的完整语法是:x = InputBox (prompt, title, default, xpos, ypos, helpfile, context)

其中,prompt是提示的字符串,这个参数是必须的。title是对话框的标题,是可选的。default是正文框里的缺省值,也是可选的。xpos,ypos决定输入框的位置。helpfile,context用于显示与该框相关的帮助屏幕。返回值 x 将是用户在正文框里输入的数据,x是一个字符串类型的值。如果用户按了Cancel钮,则 x 将为空字符串。

六、使用通用对话框控件

Windows应用程序里的Open对话框,Save As对话框在各个应用程序里看起来都是一样的,通用对话框控件就可以提供这些对话框的标准功能。

1,Open对话框及Save As对话框

打开Open对话框使用ShowOpen方法,打开Save As对话框使用ShowSave方法。

Private Sub mnuOpen_Click ()

On Error GoTo ErrorHandler

Error = True

= "Text Files (*.txt)|*.txt|Batch Files (*.bat)|*.bat|All Files

(*.*)|*.*"

en ' display Open common dialog box.

Call OpenFile(me)

ErrorHandler:

Exit Sub

End Sub

其中第三行决定了在文件格式类型栏里出现的文件类型。第五行需要一个你自己的打开文件的过程,这个过程需要的参数就是通用对话框返回的文件名。通用对话框的CancelError属性设为True的话,用户单击Cancel按钮将产生一个错误信息程序,凭借这个信息程序可以检测到用户的放弃操作。

2,Color对话框

下面的过程可用用户选择的颜色作为窗体的底色。

Private Sub mnuColor_Click ()

On Error GoTo CancelButton

Error = True

lor

lor =

CancelButton:

第 33 页 共 93 页

Exit Sub

End Sub

代码的第三行出现了通用对话框的Flags属性决定了通用对话框的一些可选项,不过即使不赋值给Flags,代码也一样会按缺省的情况去执行的。

3,Fonts对话框

下面的过程可用字体对话框改变正文框的字体。

Private Sub mnuFonts_Click ()

On Error GoTo CancelButton

Error = True

= cdlCFBoth ' Flags property must be set to cdlCFBoth

nt ' Display Font common dialog box.

me = me

ze = ze

ld = ld

alic = alic

derline = derline

rikethru = rikethru

lor =

CancelButton:

Exit Sub

End Sub

§7 Visual Basic的输出机制

通过正文框等控件的输入,经过程序代码的处理,现在我们要把结果输出了。作为输出的对象,Visual Basic提供了标签,正文框,窗体,图片框(Picture Box)等用于输出,而且Visual Basic里也有一堆命令、属性涉及信息的输出,较常用的有:MsgBox函数,Print方法,Cls方法,Tab函数,Format函数,FontName,FontSize,FontBold,FontItalic,FontStrikethru,FontUnderline属性,CurrentX,CurrentY属性等。

一、通过MsgBox函数输出

了解Windows应用程序的人都知道当用户操作错误时,应用程序往往打出一个消息框来提示用户的错误,象这样:

Dim Action As Integer

Action = MsgBox("单击确定键将引爆此计算机!", vbYesNo + vbCritical +

vbDefaultButton2, "警告!")

If Action = 6 Then Explode

第 34 页 共 93 页

这个功能在Visual Basic里是通过MsgBox函数来实现的,这样程序员就不必自己去画一个消息框了。语法是:

Action = MsgBox (msg, type, title)

其中,msg是消息的内容,是一个字符串型的变量,type及title参数是可以省略的,type参数指定显示的按钮是什么及使用什么样的图标(这个参数往往让新程序员思考几分钟),title参数指定消息框的标题。type参数的含义是:

数值 符号常量 意义

0 vbOKOnly

只显示 Ok 按钮

1 vbOKCancel

显示 Ok,Cancel 按钮

2 vbAbortRetryIgnore

显示 Abort,Retry,Ignore 按钮

3 vbYesNoCancel

显示 Yes,No,Cancel 按钮

4 vbYesNo

显示 Yes,No 按钮

5 vbRetryCancel

显示 Retry,Cancel 按钮

16 vbCritical

Stop Sign对极其重要的问题提醒用户

32 vbQuestion

Question Mark增亮没有危险的问题

48 vbExclamation

Exclamation Mark强调警告用户必须知道的事情

64 vbInformation

Information Mark可以使乏味的信息变得有趣

0 vbDefaultButton1

第一个按钮缺省

256 vbDefaultButton2

第二个按钮缺省

512 vbDefaultButton3

第三个按钮缺省

例如:Action = MsgBox (“Are you girl?”, vbYesNo + vbQuestion, “Question”)。使用这个函数时Visual Basic将产生一个标题为Question,具有问号和Yes,No按钮的消息框。作为一个函数,本质上还是要返回值的,MsgBox的返回值确定了用户的选择,程序可根据返回值做出相应的动作。

返回值

1

2

3

4

含义

选择 Ok 按钮

选择 Cancel 按钮

选择 Abort 按钮

选择 Retry 按钮

返回值

5

6

7

含义

选择 Ignore 按钮

选择 Yes 按钮

选择 No 按钮

二、Print方法,Cls方法,Tab函数

1,Print方法

我清晰地记得小学时所学的第一个计算机语句就是Print,并且成功地用这个语句及一堆

“*” 号 “#” 号在屏幕上打出一间小屋。Print 方法的语法是:object. Print expressionlist

object表示Print作用的对象,比如是Form或者是Picture Box,object是可以省略的,省略时的Print往往在窗体上输出。expressionlist是输出的内容,允许许多项数据的输出,在数据间你可以加入“,”或”;”。加入分号将使下一数据项紧挨着上一数据项输出。而加入逗号,则Visual Basic将下一数据项在下一打印区输出,其实就是空了几个空格后再输出。两个打印区之间有14个字符的宽度,其实这也很难衡量,比如14个“W”所占的宽度大概是第 35 页 共 93 页

14个“i”所占宽度的三倍多。幸好中国日本之类的方块字所占的宽度基本上是一样的,所以较好处理一些。

2,Tab函数

Tab函数只用在Print方法中,它用来移动下一个字符到打印位置,这将省去你数空格的功夫。语法是:Tab (column)

Tab函数将Visual Basic自定义的14字符宽的打印区扔到一边,用自己的方式定义了新的灵活的打印区宽度。

3,Cls方法

Cls也是一个古老的BASIC语句原来它的作用总是把屏幕变成黑色,然后在左上角或左下角闪烁一个光标,Visual Basic里它的作用是清除绘图语句和Print语句产生的文字和图形。语法是:object. Cls

object指清除的对象,可以是Form或Picture Box。如果object省略,通常Visual Basic都把当前的窗口作为Cls操作的对象。

三、Format函数

Format函数用于制定字符串或数字的输出格式。语法是:x = Format (expression,fmt)

expression是所输出的内容。fmt是指输出的格式,这是一个字符串型的变量,这一项若省略的话,那么Format函数将和Str函数的功能差不多。如:

语句

Format (2, “0.00”)

Format (.7, “0%”)

Format (1140, “$#,##0”)

简单地,fmt里的字符是这样的:

字符

0

#

%

意义

显示一数字,若此位置没有数字则补0

显示一数字,若此位置没有数字则不显示

数字乘以100并在右边加上”%”号

输出

2.00

70%

$1,140

字符

.

,

- + $ ( )

意义

小数点

千位的分隔符

这些字出现在fmt里将原样打出

Format函数也可用来对时间进行输出。

fmt fmt

输出 输出

m/d/yy 8/16/96 h:mm:ss a/p 10:41:29 p

d-mmmm-yy 16-August-96 h:mm 22:41

d-mmmm 16-August h:mm:ss 22:41:29

mmmm-yy august-96 m/d/yy h:mm 8/16/96 22:41

hh:mm AM/PM 10:41 PM

四、FontName,FontSize,FontBold,FontItalic,FontStrikethru,FontUnderline属性

很明显,这些属性都与字体有关,许多控件都有这些属性。通常它们在设计阶段可以双击font属性来设置,运行期间可以直接设置。它们的意义是:

FontName FontItalic

字体的名称 字体是否用斜体显示

第 36 页 共 93 页

FontSize

FontBold

字体的大小

字体是否用粗体显示

FontStrikethru

FontUnderline

字体是否有删除线

字体是否有下划线

如:ld = True,将把Text1正文框的FontBold属性设为True。

五、窗体,图片框的CurrentX,CurrentY属性

这两个不可见的属性确定了下一次打印或绘图的水平及垂直坐标。如上面讲的Print方法,当expression后使用 “,” 时,Visual Basic将改变CurrentX,CurrentY值为下一打印区域开始的值,于是,输出便指向了下一个打印区域。而Cls方法将把操作对象的CurrentX,CurrentY的值设为(0,0)。

六、通过标签控件输出

标签控件的特点是运行时不能直接修改它,通常一个正文框旁边都有一个标签用来标识正文框。标签的Autosize和WordWrap属性是一对有用且令人困惑的属性。

第五章 Visual Basic的鼠标事件和绘图

§1 Visual Basic的鼠标事件

Click就是一个鼠标事件,它可以发生在许多对象上。同时鼠标事件还有DblClick,MouseDown,MouseUp,MouseMove以及拖曳后放下的事件。在Visual Basic所附的示例程序里,有一个介绍鼠标事件的例子,它的通常的路径及文件名是:c:

一、MouseDown,MouseUp事件

MouseDown,MouseUp事件分别发生在按下鼠标按键和松开鼠标按键时,窗体的空的MouseDown,MouseUp事件是这样的:

Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)

End Sub

Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)

End Sub

1,MouseDown,MouseUp事件与Click事件的不同

Click事件不能检测到是哪一个按键按下了,也不能检测到按下鼠标的同时键盘上是否按着Shift,Ctrl,Alt键,而且Click事件还不能确定按鼠标时鼠标指针的位置。而这些在MouseDown,MouseUp事件里都可以知道,这也是这两个事件过程发生时后面四个参数的意义。在需要上面所说的参数时,可以用MouseDown事件或MouseUp事件代替Click事件。

2,Button参数

这个参数确定按下的鼠标按键是哪一个。

参数值

1

2

4

符号常量

vbLeftButton

vbRightButton

vbMiddleButton

第 37 页 共 93 页

意义

按下左键

按下右键

按下中键

但是这个参数无法判断出两个键或三个键同时按下时的情况。比如当你同时按下左右键时将引发两个MouseDown事件,Button参数分别为1和2,或者是2和1。

3,Shift参数

这个参数用来确定MouseDown,MouseUp发生时键盘是否同时按着Shift,Ctrl,Alt键

参数值

0

1

2

3

意义

没按

Shift(常量vbShiftMask)

Ctrl(常量vbCtrlMask)

Shift和Ctrl同时被按下

参数值

4

5

6

7

意义

Alt(常量vbAltMask)

Shift和Alt同时被按下

Alt和Ctrl同时被按下

三个键同时按下

所以Shift参数是可以判断多个键同时被按下的情形的。

4,X,Y参数

这两个参数表明MouseDown,MouseUp发生时,鼠标指针所指向的位置。

二、MouseMove事件

1,MouseMove事件发生在鼠标移动的时候。窗体的空的MouseMove事件是这样的:

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)

End Sub

MouseMove的四个参数与MouseDown,MouseUp的四个参数的意义是一样的,但MouseMove的Button参数可以判断出多个按键按下时的情形。

参数值

0

1

2

3

意义

三个键都没按

左键

右键

左右键

参数值

4

5

6

7

意义

中键

左中键

右中键

三个键都按着

2,了解了鼠标的这三个事件后就会发现Windows Paintbrush里的绘图也不过如此,下面的代码就可以实现用鼠标当作画笔在窗体上乱画的功能。

把下面代码拷到窗体的声明区就可以了。

Dim Draw As Integer

Sub Form_MouseDown (Button As Integer, Shift As Integer, X As Single, Y As Single)

Draw = True

CurrentX = X

CurrentY = Y

End Sub

Sub Form_MouseMove (Button As Integer, Shift As Integer, X As Single, Y As Single)

If Draw = True Then Line -(X, Y)

End Sub

Sub Form_MouseUp (Button As Integer, Shift As Integer, X As Single, Y As Single)

Draw = False

End Sub

第 38 页 共 93 页

三、关于“拖曳后放下”的属性和方法

1,DragMode属性

这个属性决定了拖放操作是手动还是自动方式。前者必须用Drag方法来让程序知道拖曳已经开始或用Drag方法让程序知道拖曳结束了。而后者则计算机自己就可以知道拖曳的开始及结束。这说明手动方式更具有灵活性,而自动方式则简单一些。

属性值

0

1

意义

(缺省)手动,需使用Drag方法初始化源控件的拖动操作

自动,单击源控件就可以自动初始化拖动操作

2,DragIcon属性

这个属性确定拖放操作中显示指针的图标。在运行期间可用赋值方式或LoadPicture函数给出DragIcon属性。如:

Image1. DragIcon = Image2. DragIcon

Image1. DragIcon = LoadPicture (“C:”)

3,Drag方法

语法是:control. Drag action

control决定被拖动的控件,action指出执行的动作。

action值

0

1

2

意义

取消拖动

开始拖动控件

放下控件

四、关于“拖曳后放下”的事件

1,DragDrop事件

拖动时总是要放下的,如果拖动的控件放在了另一个窗体或控件上,就引发了后者的DragDrop事件。空的DragDrop事件基本上是这样的:

Private Sub Form_DragDrop(Source As Control, X As Single, Y As Single)

End Sub

Source参数指明了前者——被拖动的对象,Control类型的变量就是说明这个变量代表一个控件,也就是控件的名字,但在传递这个参数时不必打上引号。X,Y参数表明鼠标指针所在的位置。

2,DragOver事件

在拖放操作进行之中,被拖动的控件可能会从其它控件上空飘过,或者在目标控件上空盘旋一下,这时,就引发了在被拖动控件下方的控件的DragOver事件,这时它可以修改被第 39 页 共 93 页

拖动控件的DragIcon属性,使它可以表明是否允许控件的着陆。在Explorer里通过鼠标拖动实现文件的拷贝与移动时就可看到DragOver事件的应用。空的DragOver事件差不多是这样的:

Private Sub Form_DragOver(Source As Control, X As Single, Y As Single, State As Integer)

End Sub

Source, X, Y 参数的意义与DragDrop 的意义相同。State 参数表明被拖动的控件相对于它飘过的控件的迁移状态。

State值

0

1

2

描述

Source控件飘进本控件的领空

Source控件飘出本控件的领空

Source控件在本控件上空盘旋

DragOver事件的例子可以参考Visual Basic Help里的例子。

§2 在Visual Basic程序里绘图

计算机的绘图和动画是一件奇妙且引人入胜的主题,许多软件公司都开发了优秀的关于图象的软件,三维的有3D Studio Max、LightWare、True Space等,二维的有CorelDRAW、FreeHand等等。这也是计算机渗透到其它领域的一个很好的例子,在许多影片中都可以看到计算机的出色表现。

速度并不是Visual Basic的优势,不过Visual Basic已经为我们提供了不少的素材。已经有一些厚达600页以上的书籍在介绍Visual Basic下的图象处理技术,包括绘图,色彩,动画,三维空间,虚拟现实,甚至计算机仿真的基础。听起来很诱人的东西往往需要大量不诱人的知识,比如数学,物理,逻辑等等。

一、在Visual Basic程序里加入图片

1,图片通常可以放在Form,Picture Box,Image Box里,用代码加入图片的方法有两种,一种是用LoadPicture函数,如:e = LoadPicture(“c:”)

另一种是用赋值的方式,如:e = e

删除图片的方法是:e = LoadPicture(“”)

2,Visual Basic送给我们的几百个ICO文件是非常有趣的,这些文件通常的子目录是:C:VBICONS

它包括12类。在这些ICO文件里,有许多是成对出现的,用这些图标,可以做出一些简单的动画。

3,这个例子用VB目录下的ICONSTRAFFIC子目录下的,,图标模拟一个红绿灯的变化。建立如下界面:

第 40 页 共 93 页

控件名

img(右上)

img(右中)

img(右下)

imgShow(左)

属性

Index

Picture

Visible

Index

Picture

Visible

Index

Picture

Visible

Picrure

设置值

0

c:vb iconstraffictrffc10a

False

1

c:vb iconstraffictrffc10b

False

2

c:vb iconstraffictrffc10c

False

c:vb iconstraffictrffc10a

键入代码:

Private Sub Form_Click()

Static i As Byte

If i = 2 Then

i = 0

Else

i = i + 1

End If

e = img(i).Picture

End Sub

这里出现的Static语句同Dim语句一样用于声明变量。用Dim语句声明的变量在退出这个过程时,变量的值就不存在了,第二次进入这个过程时变量的值将变成0,而不是上次处理后的值。而用Static语句声明的变量在第二次进入过程时将保持上次退出时变量的值,这就是Static与Dim的不同之处,用Static语句声明的变量被称作静态变量。

二、可用于制作特殊效果的数学及语句

1,Move方法

Move方法的语法是: left, top, width, length

object是被移动的对象,这个参数是可以省略的。left参数是必须的,指定对象左边的水平坐标。top参数是可以省略的,指定对象上面的垂直坐标。width参数是可以省略的,指定对象的新宽度。length参数是可以省略的,指定对象的新长度。width,length参数的指定也就是指移动的同时改变对象的大小。

三、Visual Basic的坐标系统

1,Visual Basic的坐标系和笛卡尔的平面坐标系不同,计算机屏幕的坐标系是这样的。

窗体的左上角是原点,X轴的正向水平向右,Y轴的正向垂直向下,这是计算机领域里的顽固传统之一。所以窗体里的控件的位置用Left,Top属性描述,Left是控件左上角到窗第 41 页 共 93 页

体左边的距离,Top是控件左上角到窗体上边的距离。

2,建立自己的坐标系

这涉及到窗体的许多Scale属性。ScaleLeft属性确定对象左边的水平坐标,ScaleTop属性确定对象顶端的垂直坐标,ScaleWidth属性确定对象内部水平的单元数目,ScaleHeight确定对象内部垂直的单元数目。如:

ScaleLeft = -50

ScaleTop = 50

ScaleWidth = 100

ScaleHeight = -100

将建立一个笛卡尔的坐标系如下:

更简单的方法是用Scale方法: (-50, 50) - (50, -50)

也可建立上面的笛卡尔坐标系,其中前一个括号里是左上角的坐标,后一个括号里是右下角的坐标。

3,刻度系统

这是由控件的ScaleMode属性设置的。ScaleMode的值有:

ScaleMode值

0

1

2

3

意义

用户自定义

点素(Twip)

点(Point)

象素(Pixel,这与屏幕分辨率有关)

ScaleMode值

4

5

6

7

意义

字节(Character)

英寸(Inch)

毫米(Millimeter)

厘米(Centimeter)

1 Inch = 1440 Twips

1 Centimeter = 567 Twips

1 Inch = 72 Points

1 字符宽(水平方向)= 120 Twips

1 字符高(垂直方向)= 240 Twips

有一次,我设置ScaleMode = 7,并在屏幕上打印了三个厘米长的线段,我拿尺子在屏幕上量了量,觉得好象和三个厘米的长度有一定的差距,这是为什么呢?后来知道除了0,3之外,其它值都是以打印长度为准的,也就是说打印出来才是三厘米。

四、基本的绘图

1,AutoRedraw属性

当AutoRedraw属性设为True时,所有的绘图都将被储存在内存上,当程序比较在意内存且绘图不很复杂的时候,可以在Form,Picture Box的Paint事件里编写绘图代码。Paint事件发生在Form或Picture Box重画时(如盖在上面的窗口移开,或窗体变大变小)。

第 42 页 共 93 页

2,色彩

决定用哪种色彩可以用三种办法

(1)使用RGB函数。语法是: RGB(Red, Green, Blue)

这三个参数分别决定红色,绿色,蓝色的亮度强度,三个参数的范围是0-255,0表示最浅最弱,255表示最深最强。如:lor = RGB(255,255,0) ‘黄色

(2)使用QBColor函数

这是Quick Basic的颜色系统可决定16种颜色,16种颜色是:

0

1

2

3

颜色

绿

4

5

6

7

颜色

品红

8

9

10

11

颜色

淡蓝

淡绿

淡青

12

13

14

15

颜色

淡红

淡紫

淡黄

亮白

如:lor = QBColor(5)

(3)直接输入数值

颜色值的格式是16进制的,为&HBBGGRR。BB代表蓝色,GG代表绿色,RR代表红色。所以lor = &HFF0000

与lor = RGB(0, 0, 255)的含义是一样的。

(4)取得特定点的颜色值,使用Point方法。如:x = Point (20,30)

x将是一个长整型数字,它代表了(20,30)点的RGB值。x如果直接输出的话会让人难以理解,它是一个按16进制&HBBGGRR的方式排列的数。如何才能拆出Red,Green,Blue的值呢,可以用下面的公式。

Red = ((x, y) And &HFF)

Green = ((x, y) And &HFF00&) 256

Blue = ((x, y) And &HFF0000) 65536

计算机有时是通过抖色的方法来实现一些它表现不了的一些颜色。抖色就是比如一块淡红的颜色实际上是一些红点和一些白点组成的。这时从这块淡红的颜色里取一个点读它的RGB值也许会令你失望,你明明用RGB(255,128,128)填充了底色,但你用Point方法取出点的颜色时却是RGB(255,255,255)或RGB(255,0,0)。

3,绘图方法

包括Cls方法,Pset方法,Line方法,Circle方法

(1)Cls方法

前面已经介绍过的Cls方法将以背景色清除绘图区域。

(2)Pset方法

语法是: (x, y) , color

Pset方法将在object对象的(x, y)点用color参数决定的颜色画一个点。object参数和color参数是可以省略的。

(3)Line方法

Line方法用于画直线或方框。基本的语法是:object .Line (x1, y1) - (x2, y2) , color

如:Line (250,300) - (400,500)

画一条从(250,300)到(400,500)点的直线。

Line - (400,500)

从当前位置(由CurrentX,CurrentY决定)画到(400,500)

Line (150,250) - Step (150,50)

第 43 页 共 93 页

出发点是(150,250),终点是向X轴正向走150,向Y轴正向走50的点。

等同于:Line (150,250) - (300,300)

又如: Line (20,40) - (150,200) , , B

画一个左上角在(20,40),右下角在(150,200)的矩形,注意在color 参数省略时,逗号并不省略。

Line (20,40) - Step (50,70), RGB(255,0,0), BF

用红色从(20,40)到(70,110)画一个实心的矩形。

Line - (30,50), RGB(0,255,255), ABC

这个语句是错的,因为color 参数后面的参数只有 B,或 BF 两种形式。

(4)Cricle方法

Cricle方法用于画圆或椭圆,它的参数很多,语法是: (x,y), r, color, start, end,

aspect

(x,y) 参数是不能省略的参数,表示圆心的位置。r 是不能省略的参数,表示半径。color是可以省略的参数,表示画的颜色。start、end用于画弧,是用弧度度量的。

start、end为负值将在圆心至这个负值的点画出半径,这样就可以画出扇形了。如:

Circle (2000,2000) , 2000 , , -1.571 , -2.543

可画出扇形。这里的负号并没有更深的含义,仅仅表示多画了一条半径。

Circle (2000,2000) , 2000 , , -2.543 , -1.571

将画出右边那样的饼图。

五、关于绘图的属性

这些属性包括:CurrentX、CurrentY、DrawMode、DrawStyle、DrawWidth、Fillcolor、FillStyle、BackColor、ForeColor等属性。CurrentX、CurrentY已经介绍过了,就不再介绍了。

1,DrawMode属性

这个属性用来决定用什么逻辑关系将一个图案画到另一个图案上,DrawMode有16个值可供选择。可以用这些逻辑关系作出一些有趣的效果。

2,DrawStyle属性

这个属性决定了线的类型,有六种设置。

3,DrawWidth属性

这个属性决定了线的粗细。

4,BackColor、ForeColor属性

这两个属性分别决定了对象的背景色和前景色。

5,FillColor属性

这个属性确定填充在Shape控件或用Circle和Line方法建立的圆形或矩形里的颜色。

第 44 页 共 93 页

6,FillStyle属性

这个属性同Shape控件的FillStyle属性是一样的,指的是填充Shape或用Circle和Line方法建立的圆形或矩形里的模式。

六、在Visual Basic的绘图程序里使用Windows API里的绘图函数将使程序有更灵活的变化性,例如涉及到画笔和刷子的API函数就有十几个,而在Windows NT,Windows 98及未来的32位的Windows操作系统里将有更多的关于绘图的函数。

第六章 Visual Basic的数据库

§1 数据库的一些知识

数据库编程,无论是从Visual Basic中还是从其它更为成熟的数据库管理系统中去做,都不太容易。如果你热衷于此,你就会发现更多的专业书籍,仅仅介绍Visual Basic的数据库编程功能就将足够再开设一门讲座了。所以这里的介绍只是简单的介绍。(但我还得介绍,以便使这本书的覆盖面看起来更广一些)

开始,简单的数据库就象一张张表格一样,有行有列。后来一些管理数据库又有数学头脑的人,想出了一些好点子,于是数据库就发展成为一门计算机的分支的学科,到了现在数据库似乎拥有无限的玄机。一些公司靠数据库发了财,做学生的就有越来越多的人学习数据库的知识了。

但我们要知道的是数据库的建立无非是为了让人们更好的获得、使用、分析众多的信息(随着科学的发展,信息越来越多了)。通常的操作是用户有了好奇心,于是他问:“我想知道从有邮票以来,邮票的印刷数量排名前十名的都是什么?”计算机经过一系列艰难的筛选终于显示了结果。用户并不知道计算机是如何做到的,他只不过得到了方便的可以处理的数据(可能是放在表格里的)。

术语中把用户的问题叫做“查询”,把得到的结果叫做“表”或“视图”。在Visual Basic里解决这类问题的是Microsoft Access “Jet”机。查询关系数据库的常用语言叫做SQL(Structured Query Language)结构化查询语言。在Visual Basic的专业版和企业版中SQL是固有的。

§2 通过数据库控件(Data Control)处理Visual Basic的数据库

通过数据库控件(Data Control)处理的数据库类型里,最适合Visual Basic的就是Access类型的数据库,可以说Visual Basic的数据库和Access的数据库是完全相同的。如果使用的是Jet database engine(也就是Access类型)的数据库,则我们不必设置数据库控件的Connect属性,否则我们得设置Connect属性为所使用的数据库类型名。

数据库类型

Access

dBASE III

dBASE IV

Paradox 3.x

Paradox 4.x

Btrieve

设置Connect属性

";"

"dBASE III;"

"dBASE IV;"

"Paradox 3.x;"

"Paradox 4.x;"

"Btrieve;"

第 45 页 共 93 页

设置路径

"drive:"

"drive:path"

"drive:path"

"drive:path"

"drive:path"

"drive:"

FoxPro 2.0 "FoxPro 2.0;" "drive:path"

FoxPro 2.5 "FoxPro 2.5;" "drive:path"

FoxPro 2.6 "FoxPro 2.6;" "drive:path"

Excel 3.0 "Excel 3.0;" "drive:"

Excel 4.0 "Excel 4.0;" "drive:"

Excel 5.0 "Excel 5.0;" "drive:"

如果你找不到Microsoft Access的话,你就不得不用Visual Basic自带的Data Manager建立自己的Access数据库文件,然而在使用过后会发现Data Manager是十分不便利的,你可以在Visual Basic的Add-Ins菜单下找到Data Manager。

一、显示数据

例如用一个正文框和一个数据库控件读取一个MDB文件里一个表(Table)里的一个域(Field)里的信息,这个功能我们连一条代码也不用编,这正是Visual Basic在数据库方面的优势所在。

(1)画出一个数据库控件,按F4键打开Properties窗口。

(2)选择DatabaseName属性并单击设置框旁边的有省略号的那个钮,Visual Basic显示DatabaseName对话框,在这个对话框里选择你要的数据库文件。

(3)选择RecordSource属性,从下拉的列表里选择一个Table,这个数据库控件在运行时将指向这个Table。现在数据库控件的属性设置完了。

(4)画出一个正文框,按F4键打开Properties窗口。

(5)选择DataSource属性,从下拉列表里选择正文框对应的数据库控件。

(6)选择DataField属性,从下拉列表里选择正文框对应的Field。

所以,简单地说,画两个控件设置四个属性就可以读取一个数据库一个Table的一个Field了。在运行时,数据库控件的四个按钮可以用来移动记录。最左边的钮表示移动到第一条记录上,最右边的钮表示移动到最后一条记录上,另两个在内侧的钮分别表示每次向前或向后移动一条记录。

二、移动记录

除了使用数据库控件四个按钮来移动记录外,代码也可以实现这些功能,假设数据库控件的名字叫Data1。

功能

显示第一个记录

显示最后一个记录

显示下一个记录

显示上一个记录

代码

h

rst

st

xt

evious

三、删除记录

首先用上面的那些方法找到这个倒霉的记录,然后用下面的代码删除它。

第一行表明要删除这个记录,第二行表明让数据库文件知道这个不幸的决定。

四、增加记录

(“FieldName”) = “NewData”

第 46 页 共 93 页

第一行决定要增加一个新记录,第二行表示增加的内容,其中FieldName 是Field 的名称,NewData 是增加的内容,第三行把这个决定通知数据库文件,让它去做这件事。

五、找出指定的记录

假定在一个Table 里的Age 域里寻找记录值为18的记录,则:

功能

找出第一个匹配的记录

找出最后一个匹配的记录

找出下一个匹配的记录

找出上一个匹配的记录

代码

rst “ Age = ‘18’ ”

st “ Age = ‘18’ ”

xt “ Age = ‘18’ ”

evious “ Age = ‘18’ ”

六、从数据库域中取得数据

x = Data1. (“FieldName”).Value

这条指令将取出存在域FieldName 中的数据并赋给x。

七、改变数据库中域的数据

(“FieldName”).Value = NewValue

这段指令将NewValue 中的值代替FieldName 域中的当前值。

§3 使用数据库网格、数据库组合框、数据库列表框控件

现在我们先加入一个数据库控件(它暂时叫做Data1),我们为它设置好DatabaseName、RecordSource属性。

一、生成数据库网格

1,在工具箱中单击数据库网格控件,拖动它成为数据库网格;

2,按F4键;

3,单击DataSource属性,选择刚才建立的数据库控件Data1。

现在就可以显示你所选择的数据记录,不需要你编写任何代码。

二、修改显示在网格里的数据

你可以编辑在网格里的数据,因为它与数据库控件已经建立了联系。但你必须改变下面三种数据库网格的属性。

属性

AllowUpdate

AllowDelete

AllowAddNew

True

False

True

False

True

False

含义

可任意修改数据库网格中的数据

只显示数据,不能修改

可删除所有记录

不可删除记录

可增加新记录

不可增加新记录

三、数据库组合框

数据库组合框用来在数据库中输入新数据。数据库组合框可以显示储存在某一字段的数据内容,这一字段用户可以从中选择,也可以输入一新值。生成数据库组合框的方法:

第 47 页 共 93 页

1,在工具箱中单击数据库组合框控件,拖动它成为数据库组合框;

2,按F4键;

3,单击DataSource属性,选择你的数据库控件Data1;

4,单击RowSource属性,选择你的数据库控件Data1;

5,单击ListField属性,选择你想在数据库组合框中出现的字段;

6,单击DataField属性,选择你想在数据库组合框中作为默认选择而出现的字段。(通常和上一步一样)

四、数据库列表框

数据库列表框可以显示储存在数据库字段中的数据内容,虽然你可以看到数据,但你不能增加、删除和编辑它的内容。生成数据库列表框的方法:

1,在工具箱中单击数据库列表框控件,拖动它成为数据库列表框;

2,按F4键;

3,单击DataSource属性,选择你的数据库控件Data1;

4,单击RowSource属性,选择你的数据库控件Data1;

5,单击ListField属性,选择你想在数据库列表框中出现的字段;

6,单击DataField属性,选择你想在数据库列表框中高亮度显示的字段。(通常和上一步一样)

总之,数据库的建立是十分有用的,然而当你发行你的应用程序的时候,含有数据库控件的应用程序往往所需的发行文件比你想象的要大。

第七章 从文件中存取资料

每个程序几乎都要往磁盘上存储数据,这些数据可能是表格、图形、姓名和地址清单、或者是游戏的存储进度。很难想象一个大型的RPG游戏不允许游戏者存盘。这一章将学习关于存储文件的知识。

§1 文本文件,就象盒式磁带机

一、生成文本文件,使用下列命令:

Open "Filename" For Output As #FileNumber

其中Open告诉Visual Basic生成一个新文件;Filename是文件名(可以包含路径);For Output表明文本文件要接受程序输出的数据;FileNumber是文件号(1-511之间),Visual

Basic很傻,不知道文件名,它只认文件号,程序可能打开多个文件,如果你忘了该生成哪一号文件,你可以用FreeFile函数来得到一个文件号。如:

Dim Free As Integer

Free = FreeFile

Open "c:" For Output As #Free

则生成文件c:,Visual Basic替你找一个未用的文件号来代表它。

二、打开已有的文本文件

Visual Basic不仅仅想知道你要打开文件,它还想知道你打开文件后想做什么。

1, 如果你想从文本文件中读取数据给计算机,则使用下面命令:

Open "Filename" For Input As #FileNumber

第 48 页 共 93 页

如果文件不存在,Visual Basic就会对你的玩笑表示生气,它会发出叫声,然后指出你的错误。

2, 如果你想把数据写到文本文件中,则使用下面命令:

Open "Filename" For Output As #FileNumber

快看这个命令和生成新文件的命令一样!你可以这样理解:如果Visual Basic找不到那个文件,那么它就生成一个新的,如果它找到了,就打开文件并准备向里面写东西。但是如果程序员向已存在的文件内写数据,那么将会把原来的数据覆盖掉。这可要小心!

3, 如果你想把数据追加写到文本文件中,则使用下面命令:

Open "Filename" For Append As #FileNumber

这种操作也是准备写数据到文本文件中,不过Visual Basic将把数据追加到文件的末尾。

三、向文本文件中写数据

Print #FileNumber, "Text String"

将Text String字符串写入#FileNumber代表的文件中,写到什么地方取决于你打开文件的方式。For Output方式写到文件的开头,For Append方式写到文件的末尾。

四、关闭文件

不论什么时候生成了文本文件或打开了已有的文本文件都要在程序终止前关闭它。否则,可能会出现一些问题,甚至把文件内的数据搞坏。

关闭所有打开的文件,可使用命令:Close

关闭特定的文件,可使用命令:Close #FileNumber

五、从文本文件中读取数据

首先要用For Input方式打开文本文件,然后可将文件内容赋给一个字符串变量。由于在32位系统中,字符串的容量可达百兆,所以可以简单地把文件的内容赋给一个字符串变量。在16位的系统中读取大文件时,恐怕还要考虑内存的问题。

Dim FileContents As String

Open "Filename" For Input As #FileNumber

FileContents = Input(LOF(FileNumber), FileNumber)

Close #FileNumber

第三句就可以将文件的所有内容读入FileContents中,LOF函数用以去得文件的长度。

六、改变文本文件的内容,这是很烦琐的过程,需用下面的步骤。

1, 打开文件。

2, 取出文件内容赋给一个变量。

3, 关闭文件。

4, 编辑变量内容。

5, 打开文件。

6, 变量存入文件。

7, 关闭文件。

§2 随机存取文件,就象CD

文本文件就象盒式磁带机,因为如果你想读取后面的数据就得把前面的数据先放过去。随机存取文件就象CD,因为你可以立即跳至你想听的那一首歌。随机存取文件是以结构(Structure)来存取的,在文件里数据放在一个一个结构里,

每个结构里的数据是一样的。

一、使用结构(Structure)保存信息

写程序时,也许要生成几个变量来保存信息。如要跟踪如下的信息:姓名、地址、年龄。可以为各信息生成单独的变量,如:

第 49 页 共 93 页