9299.net
大学生考试网 让学习变简单
当前位置:首页 >> 工学 >>

VB6.0课件_图文

VB6.0课件_图文

高等学校计算机基础教育教材

上海中医药大学现代教育技术中心 计算机教学部

?
? ? ? ? ? ? ? ? ?

?
? ?
?

第一章 Visual Basic程序设计概述 第二章 VB简单的程序设计 第三章 VB基本语法结构 第四章 VB程序基本控制流程 第五章 数组 第六章 过程 第七章 常用控件 第八章 界面设计与窗体 第九章 多窗体与多文档界面 第十章 文件 第十一章 图形程序设计 *第十二章 Visual Basic与数据库.
*为可选章

第一章 Visual Basic程序设计 概述

1.1 Visual Basic语言简介
1.1.1 程序设计语言的发展
一、面向机器的语言

通常针对某一种类型的计算机和其他设备而专门编写的由二进制代码所组成的机 器程序语言,所以这类程序一般可以充分发挥硬件的潜力,然而与人类的自然语言相 差较大,所以面向机器的程序的可读性很差;普及越来越成为软件发展的障碍。因此, 一种新的面向过程的程序设计方法被提出来了。
二、面向过程的语言

用计算机能够理解的逻辑来描述需要解决的问题和解决问题的具体方法、步骤。 面向过程的程序设计的核心是数据结构和算法,其中数据结构用来量化描述需要解决 的问题,算法则研究如何用更快捷、高效的方法来组织解决问题的具体过程。面向过 程的程序设计语言主要有BASIC、FORTRAN、PASCAL、C等。
三、面向对象的语言

面向对象的语言相对于以前的程序设计语言,代表了一种全新的思维模式。它 的 一条基本原则是计算机程序是由单个能够起到子程序作用的单元或对象组合而成。这 种全新的思维模式能够方便、有效地实现以往方法所不能企及的软件扩展、软件管理 和软件使用,使大型软件的高效率、高质量的开发,维护和升级成为可能,从而为软 件开发技术拓展了一片新天地。 面向对象的程序设计语言主要有VB、VC和JAVA等。

1.1.2 Visual Basic的编程特点
一、Windows下编程的特点 1.图形用户界面 2.多任务 3.资源共享 二、Visual Basic的编程特点 1.可视化程序设计 2.强大的数据库功能 3.其它特性 面向对象的编程语言 事件驱动的编程机制 支持动态链接库

1.2 Visual Basic 6.0安装、启动和退出
下面简单介绍如何安装Visual Basic 6.0企业版。 1.将Visual Basic 6.0安装盘放入光躯中,浏览安装盘,双击 “SETUP.EXE” 文件,进入安装向导。 2.直接点击“下一步” 按钮,在“最终用户协议”对话框中仔细阅读 其协议,若确实无疑义,选中“接受协议”,再点击“下一步” 按钮。 3.输入产品的ID号。 4.选中“安装Visual Basic 6.0中文企业版” ,再点击“下一步” 按钮。 在弹出的菜单中点击“继续” 按钮,再点击“确定” 按钮,等待片 刻。 5.一般情况下使用默认安装文件夹即可,当然也可以点击“浏览”按钮 自由更改安装文件夹。 6.点击“典型安装”左边的图标按钮,等待拷贝文件。 7.点击“重新启动Windows” ,重新启动计算机后,在出现的窗体中把 “安装 MSDN”项去掉,再点击“下一步” 按钮,再点击“是”。 8.直接点击“下一步” 按钮 ,把弹出的窗体中的“现在注册”项去掉, 再点击“完成”按钮,即完成了VB的安装。

1.2.2 Visual Basic 6.0的启动 启动Visual Basic 6.0通常有两种方法: 1.双击桌面上的图标 ,启动Visual Basic 6.0。 2.点击任务栏上的【开始】→【程序】→【Microsoft Visual Basic 6.0中文版】→【Microsoft Visual Basic 6.0中文 版】,启动Visual Basic 6.0应用程序。 1.2.3 Visual Basic 6.0的退出 有两种方法可以退出Visual Basic 6.0: 1 .点击菜单栏上的【文件】→【退出】,退出应用程序。 2 .直接点击标题栏右上角的“关闭”按钮。

1.3 Visual Basic 6.0集成开发环境 1.3.1窗口介绍
一.主窗口
菜单栏 任务栏 工具栏

工程资源管理器 窗体窗口 属性窗口

工 具 箱 代码窗口 窗体布局

下面对集成开发环境中的各元素作简要介绍。 1.标题栏 用来显示窗口的标题。 2.主菜单
主菜单栏中含了使用VB6.0所需要的命令。主菜单中共有13个菜单项,

每个菜单项都有一个下拉菜单,内含若干个菜单命令,单击某个菜单项,即
可打开该菜单,单击某个菜单中的某一条,就执行相应的命令。

3.上下文菜单
上下文菜单没有显式地出现在集成开发环境中。在对象上单击鼠标右
键即可打开上下文菜单。在上下文菜单中列出的操作选项清单取决于单击鼠 标右键所在环境。

4.工具栏 以图标按钮的形式提供了常用的菜单命令。单击工具栏上的按钮,则执行该 按钮所代表的操作。按照缺省规定,启动VB之后显示“标准”工具栏。
“标准”工具栏各按钮的作用如图所示。

二.其他窗口

1.窗体窗口
“窗体窗口”也称为“对象窗口”,
主要用来在窗体上设计应用程序的界面, 用户可以在窗体上添加控件来创建所希

望的界面外观。例如,当新建一个工程
时,VB自动建立一个新窗体,并命名为 Form1,如图所示。

2.代码(code)窗口
双击窗体或窗体上的 控件就可以弹出代码窗口。代 码窗口是专门用来进行程序设 计的窗口,可在其中显示和编 辑程序代码(如图1-11所示)。 也可以通过点击菜单栏上的 【视图】—>【代码窗口】, 调出代码窗口。 代码窗口标题栏下面 有两个下拉列表框,左边是 “对象”下拉列表框,可以选 择不同的对象名称;右边是 “过程”下拉列表框,可以选 择不同的事件过程名称,还可 以选择用户自定义过程的名称。

标题栏
过程下拉列表框

对象下拉列表框 程序编辑区域

3.属性窗口
属性是指对象(窗体或控件)的特征,如大小、名称、标题、颜色、位置等。属性窗口列出了 被选定的一个对象的所有属性。如图,属性窗口包含对象下拉列表框、属性列表和属性说明栏。

对象下拉列表框 排序选项卡

属性列表 属性说明栏

4.工程资源管理器窗口
首先说明一下“工程”的概念。VB把一 个应用程序称为一个工程(Project),而一 个工程又是各种类型的文件的集合,这些文件 包括工程文件(.vbp)、窗体文件(.frm)、 标准模块文件(.bas)、类模块文件(.cls)、 资源文件(.res)、ActiveX 文档(.dob)、 ActiveX 控件(.ocx)、用户控件文件(.ctl)、 属性页文件(.pag)。

需要指出的是,并不是每一个工程都要包括上述所有文件,VB 要求一个工 程至少包含两个文件,即工程文件(.vbp)和窗体文件(.frm)。至于一个工 程要包括多少种文件,由程序设计的复杂程度而定。 一个工程可以通过“工程窗口”来显示,工程窗口列出了当前工程所包含 的文件清单。如图是启动VB后建立的一个最简单工程的结构。

5.工具箱窗口
工具箱提供了一组在设计时 可以使用的常用工具,这些工具 以图标的形式排列在工具箱中, 如后图所示。这些工具就像制作 机械零件的模具一样。利用模具 可以做出零件,利用工具箱中工 具可以做出控件。双击工具箱中 的某个工具图标,或单击工具图 标后按住鼠标左键在窗体上拖动, 即可在窗体上做出一个这种控件。 设计人员在设计阶段可以利用这 些工具在窗体上构造出所需要的 应用程序界面。除了系统提供的 这些标准工具外,VB还允许用户 添加新的控件工具。

6 . 窗体布局窗口
如图所示,窗体布局窗口中有一个表 示显示器屏幕的图像,屏幕图像上又

有表示窗体的图像,它们标示了程序
运行时窗体在屏幕中的位置。用户可 拖动窗体图像调整其位置。

1.3.2 工程管理与环境设置
1.VB的三种工作模式
主窗体的标题栏上显示了Visual Basic的三种工作模式:设计、中断与运行模式。 1.设计模式 在创建一个新的工程或打开一个已有工程时,首先进入的是“设计”模式,标题栏上显 示“[设计]”字样。在这个模式下,可以设计应用程序界面和编辑程序代码。 2.运行模式 编好一个程序后,可以点击标准工具栏上的

按钮运行程序。这时标题栏上显示 “[运行]”字样。注意:在运行模式下,菜单是不可用的,只有在“设计”模式下 才可以使用所有菜单项。所以如果要回到“设计”模式,必须点击标准工具栏上 的 按钮,切换到“设计”模式。 3.中断模式 如果程序在运行时出现错误,或者点击标准工具栏上的 按钮,就进入到 “中断”模式,这时标题栏上显示“[中断]”字样,可以在代码窗口中修改程序代 码。完成修改后,可以点击 按钮继续运行程序,或点击 按钮,切换到“设 计”模式。

2、工程的组成
应用程序建立在工程的基础之上,一个工程是各种类型文件的集合,它包括工程文件 (Vbp)、窗体文件(Frm)、标准模块文件(Bas)、类模块文件(Cls)、资源文 件(Res)和ActiveX的文件(Ocx)。 1.工程文件 存储了与该工程有关的所有文件和对象的清单,这些文件和对象自动链接到工程文件 上,每次保存工程时,其相关文件信息也随之更新。当然,某个工程下的对象和文件 也可供其他工程共享使用。在工程的所有对象和文件被汇聚在一起并完成编码后,就 可以编译工程,生成可执行文件。 2.窗体文件 存储了窗体上使用的所有控件对象、对象的属性、对象相应的事件工程和程序代码。 一个应用程序至少包含一个窗体文件。 3.标准模块文件 存储了所有模块级变量和用户自定义的通用过程。通用过程是指可以被应用程序各处 调用的过程。 4.类模块文件 用来建立用户自己的对象。类模块包含用户对象的属性及方法,但不包含事件代码。

3、创建、打开和保存工程
1.创建工程 第一步,点击任务栏上的【开始】→【程序】→【Microsoft Visual Basic 6.0中文版】→ 【Microsoft Visual Basic 6.0中文版】,启动Visual Basic 6.0应用程序。 第二步,在“新建工程”选项卡中选择“标准EXE”(如图1-15所示),点击“确定”, 则新建了一个工程,默认的名称为“工程1”。 2.打开工程 对已有的工程可以使用以下两种方式打开: 找到工程文件并双击。 启动Visual Basic 6.0后,在弹出的菜单中点击“取消”。点击菜单栏上的【文件】→ 【打开工程】,定位文件所在的路径,选择要打开的工程文件图标,点击“打开”, 便可打开一个工程。 3.保存工程 点击菜单栏上的【文件】→【保存工程】,如果是新建的工程会弹出“文件另存为”对话 框。首先要保存的是窗体文件,后缀名为“frm”,选择要保存的文件路径,并给窗体 文件命名,默认文件名为“Form1”,也可以自定义名称,点击“保存”。然后保存工 程,后缀名为“vbp”,选择要保存的文件路径,并给工程文件命名,默认文件名为 “工程1”,也可以自定义名称,点击“保存”。

例1-1在窗体上有一个按钮,显示“欢迎”字样。 按下“欢迎”按钮时,在标签中显示“欢迎学习 Visual Basic!”。 操作步骤:
第一步,单击工具箱中的[CommandButton]按钮,在 Form1窗体中拖曳鼠标,制作一个按钮,然后可以通过拖 曳鼠标来调整按钮的大小和位置,按钮的缺省名称为 “Command1”。用同样的方法,在窗体中添加一个标签 (Label1)。 第二步,选中按钮“Command1”,在属性窗口(如图112所示)中,单击属性列表框中的Caption属性值文本框, 输入“欢迎”文字。选中标签Label1,单击属性列表框中 的BorderStyle属性,将属性值改成“1-Fixed Single”。 第三步,双击窗体,在弹出的代码窗口中输入以下代码: Private Sub Command1_Click() Label1.Caption = "欢迎学习Visual Basic!" End Sub 第四步,点击工具栏上的按钮,运行程序。 一个简单的VB程序就这样完成了,如果您对这个例子不 太理解没有关系,我们将在后面的章节中再做详细的解释。

例1-1运行结果:

四、添加、删除和保存窗体、工程
1.添加窗体 右键单击工程资源管理器窗口中的工程名(如图1-21所示),在弹出的快捷菜单 中点击【添加】→【添加窗体】。在弹出的对话框中选择所要添加的窗体的类型(如 图1-22所示),点击“打开”,添加了一个空白窗体。 2.删除窗体 右键单击工程资源管理器窗口中的窗体程名,在弹出的快捷菜单中点击“移除 form1”。 3.保存窗体 在工程资源管理器窗口中,单击要保存的窗体名称,点击菜单栏上的【文件】→ 【保存form1】。 4.添加工程 点击菜单栏上的【文件】→【添加工程】(如图1-24所示),选择工程的类型,点 击“打开” 按钮,添加了一个新工程。 5.删除工程 在工程资源管理器窗口中,单击要删除的工程名称,点击菜单栏上的【文件】→ 【移除工程】,可将工程删除。 6.保存工程 在工程资源管理器窗口中,单击要保存的工程名称,点击菜单栏上的【文件】→ 【保存工程】。

5、环境设置
1.“编辑器”选项卡 点击菜单栏上的【工具】→【选项】,选择“编辑器”选项卡。 “编辑器”选项卡部分选项说明: 自动语法检测:在编写程序代码时,如果出现语法错误,VB会自动找出错误,并显示成红色。 自动列出成员:使编写代码更方便,在输入对象名称再加“.”后,VB 会自动列出所有和该对象相 关的属性、方法。 显示数据提示:调试时使用,将鼠标停留在要显示数据的变量上,可以显示该变量的值。 过程分隔符:在代码编辑窗口中,VB在各过程之间用“—”分隔开来。 2.通用选项卡 点击菜单栏上的【工具】→【选项】,选择“通用”选项卡。 通用选项卡部分选项说明: 显示网格:在窗体上显示网格状的小点,选择该选项后,可以通过改变“宽度”和“高度”值来改 变窗体上点的疏密程度(注意:窗体上的点越密,调整控件在窗体上的位置可以越精确)。 对齐控件到网格:使控件在窗体上与某个小点对齐,而不会落在两个小点之间,使控件容易对齐。 显示工具提示:当鼠标停留在工具箱的某个图标上时,显示该图标所代表的控件的名称。

第二章 建立简单的VB应用程序

2.1类和对象 2.1.1 对象和类 对象是对现实世界问题的描述。对象本身就是具有 知识和处理能力并且相对独立的单位,现实世界 的任何事物都可以看作对象,如汽车、衣服、房 子等。 类是用来创建对象的模板,包含所创建的对象的状 态描述和方法定义,对象是类的一个实例。 在VB的集成开发环境中,“工具箱”中的每一个 控件都可以看作是一个类,选中一个控件在窗体 上拖放鼠标,可以设计出按钮、标签和图形框等 不同元素,这些是由类创建的对象。

2.1.2对象的属性、事件和方法 一.对象属性 属性是反应对象的特征,也就是说属性中存放着对象的数据。对象常见的 属性有名称(Name)、标题(Caption)、字体(FontName)等。 可以在属性窗口可以设置属性,步骤为: 1.选择要设置属性的对象 2.激活属性窗口 3.选择属性名称 4.设置属性值 设置属性值的方式有三种: (1)直接输入新值 某些属性如Caption、Text需要由用户输入。如设置标签对象的Caption值 (2)选择输入 某些属性的值是VB预先设好的只能从其中进行选择,如DrawStyle、 FillStyle等,这些取值可能只有两种、几种,这样的属性只能在下拉列表中选 择。 (3)利用对话框设置 某些属性如Picture、Font等,在设置框的右端会显示省略号按钮,单击这 个按钮会弹出相应的对话框用来设置对象属性。如图2-4所示设置字体属性。

二. 对象事件
事件是VB预先设置好的,可以被对象识别的动作,不同的对象能够识别的事件不一样。 在对象上发生了事件后,应用程序就要处理这个事件,这样一段应用程序代码叫做事件过 程(Event Procedure)。VB程序设计的工作就是编写事件过程中的代码。事件过程的形 式如下: Private Sub 对象名_事件() … 对象程序代码 … End Sub “对象名”是指对象属性中的Name属性值,“事件”是VB预先设置好的,在建立对 象后,VB能自动确定与该对象相匹配的事件,并可显示出来提供给用户选择。 例如,单击Picture1图形框,打印出“欢迎使用VB!”字样,则对应的事件过程为: Private Sub Picture1_Click() Picture1.Print "欢迎使用VB!" End Sub 【注意】 用户在对一个对象发出动作时,可能会对该对象激发多个事件,如用户执行了单击动 作,会同时触发Click、MouseDown事件。这时只要去编写自己需要的事件如Click,没有 代码的空事件系统不会执行。

三. 对象方法 在面向对象的程序设计语言中,为程序设计人员提供了一种特殊的 函数和过程,我们称之为方法(Method)。VB将这些通用的过程和函 数已经编写好代码并将其封装,让用户作为方法直接调用,这样避免了 用户重复编写大量代码。和属性及事件一样,方法是特定对象的一部分, 其调用格式为: 对象名. 方法 [参数名表]

若省略对象名,则表示为当前对象,一般指窗体本身。如: Picture1.Print "Hello VB6.0" 此语句使用Print方法在Picture1图形框上打印“Hello VB6.0”,如果 语句为: Print "Hello VB6.0" 在窗体上打印“Hello VB6.0”。

2.2编写简单的VB程序 使用VB开发应用程序需要以下几步骤: 1.建立可视化用户界面 2.设置对象属性 3.编写代码 4.保存工程 5.调试应用程序,排除错误 6.创建可执行程序

2.2.1 设计用户界面

1.向窗体上添加控件
向窗体上添加控件有两种方法: ? 双击工具箱中的控件图标,该控件即自动添加到了窗体的中央。 ? 单击工具箱中的控件图标,然后将鼠标指针移到窗体上,鼠标指针变 成十字型,在窗体上需要放控件的位置拖动鼠标画出想要的尺寸,然后释放鼠 标,即可在窗体上画出该控件。

2.对窗体上的控件进行调整
对窗体上的控件进行调整的基本操作如下: (1)选中控件 (2)调整控件大小及位置

2.2.2

设置属性

利用属性窗口,可为界面中的对象(窗体或控件)设置相应的属性。 打开属性窗口可用以下4种方法:

(1)选“视图”菜单中的“属性窗口”。
(2)按[F4]键。 (3)单击工具栏上的“属性”按钮。 (4)使用对象的上下文菜单。 在属性窗口中所进行的是属性初始值的设置,用户也可在程序中对他们 进行设置和修改。

2.2.3

编写代码

为了使应用程序具有一定的功能,还必须为对象编写实现某一功能 的程序代码,编写程序代码要在“代码窗口”进行。 打开代码窗口可用以下4种方法: (1)双击对象。 (2)选“视图”菜单中的“代码窗口”。 (3)使用对象的上下文菜单。 (4)在工程窗口单击查看代码图标。 VB代码书写格式比较自由。代码不区分字母的大小写,一行允许多 达255个字符。通常一行写一条语句,这样程序看起来比较清晰。在同一行 上也可写多个语句,这时语句间用冒号“:”分隔。例如,a=4:b=5:c=6。 单行语句也可分若干行书写,要使用一个空格后跟一个下划线作续行符,如 下所示: dim a as single,b as single,c as single _ d as single,e as single

例2-1建立一个简单的应用程序,用于在图形框介绍“丁香”的功能与特点。 建立如图所示的用户界面: 按照表设置属性值:

属性值设置完毕后的用户界面为:

控件名 Form1 Label1 Picture1 Option1 Option2 Command1

标题(Caption) 丁香 丁香 —— 特点 功能 退出

字号(FontSize) 12 小四 小四 小四 小四 小四

(1)单击“对象”右边的下来菜单,选择Option1 (2)单击“过程”列表右边的下拉菜单,选择Click事件。 输入如下代码: Private Sub Option1_Click() Picture1.Cls Picture1.Print "质坚实而重,入水即沉,断面有油性." End Sub
选择对象Option2和事件Click 输入如下代码: Private Sub Option2_Click() Picture1.Cls Picture1.Print "治呃逆,呕吐,反胃,泻痢,心腹冷等" End Sub

选择对象Command1和Click事件 输入如下代码: Private Sub Command1_Click() End End Sub

2.2.4 保存和运行调试工程、生成EXE文件 1.保存工程
选“文件”菜单中的“保存工程”或单击工具栏中的“保存”按钮即可。

2.运行调试工程
运行工程,尽可能地发现程序中存在的错误和问题,排除错误、解决问题。 运行工程可用以下3种方法: (1)选择“运行”菜单中的“启动”。 (2)单击工具栏中的“启动”按钮。 (3)按[F5]键。 一般来讲,程序很少能一次运行通过,这是因为程序中有这样那样的错误,这是 由它反映的实际问题的复杂性,及程序本身逻辑结构的复杂性决定的。 程序中的错误可分为3类:(1)编译错误。(2)运行错误。(3)逻辑错误。

3.生成EXE文件

2.3窗体及基本的内部控件
2.3.1 窗 体
控制菜单框 标题栏

最小化按钮

最大化按钮

创 建 VB 应 用 程 序 的第一步是创建用户 界面。用户界面的基 础是窗体,各种控件 对象必须建立在窗体

关闭按钮

窗体

上。
启动 VB后, 即 在 屏幕上显示一个窗体。

(一)窗体的主要属性
窗体的属性决定了窗体的外观和操作。窗体的大部分属性可用两种方法来设置: 通过属性窗口设置和通过程序代码设置。有少量的属性不能在程序代码中设置。
(1) Appearance属性 该属性决定窗体的外观效果,属性值为0为平面效果,属性值为1为立体效果。 (2) Caption属性 用于设置窗体标题栏显示的内容,它的值为字符串。系统默认的Caption值为 Form1。 (3) Icon属性 用于设置当窗体最小化时以该图标显示,如果不设置则以VB默认图标显示。设置 方法为,单击Icon属性设置右边的“”,打开“加载图标”对话框,选择图标文件 装入。 (4) ControlBox属性 当其值为True时左上角有控制菜单,当为False时为无控制菜单框。 (5)MaxButton 属性和 MinButton 属性 MaxButton属性为True,窗体右上角有最大化按钮;为False时,无最大化按钮。 MinButton属性为True,窗体右上角有最小化按钮;为False时,无最小化按钮。 设置窗体的初始高度和宽度。其单位为Twip。 1Twip=1/20点=1/1440英寸=1/567cm。

(6)BorderStyle 属性 决定窗体边框式样及窗体是否能调整大小。 (7)BackColor属性和ForeColor 属性 BackColor属性设置窗体的背景颜色,ForColor 属性设置窗体的前景颜色。窗 体的前景颜色是执行Print方法时所显示文本的颜色。

(8)Height属性和Width属性
(9)Left属性和Top属性 用于设置窗体左边框距屏幕左边界的距离和窗体顶边距屏幕顶端的距离。其单 位为Twip。 (10)Name(名称)属性 设置窗体的名称,在程序代码中用这个名称引用该窗体。新建工程时,窗体的 名称缺省为 Form1;添加第二个窗体,其名称缺省为 Form2,依次类推。为了便于识别, 用户通常给 Name 属性设置一个有实际意义的名称。

(11)Enabled属性
属性值为True或False,设置对象是否能够对用户产生的事件做出反应。一般在程 序中设置,用于临时屏蔽对窗体或其它控件的的控制。

(12)Moveable属性
属性值为True或False,设置是否可以移动窗体。 (13)Visible属性 属性值为True或False,设置窗体是否被显示。用户可用该属性在程序代码中控制 窗体的隐现。 (14)Picture属性 设置在窗体中显示的图片。单击Picture属性右边的按钮,弹出“加载图片”对话 框,用户可选择一个图片文件作为窗体的背景图片。若在程序中设置该属性的值,需要 使用LoadPicture函数。 (15)WindowState属性 设置窗体启动后的大小状态。 在VB中,虽然不同的对象有不同的属性集合,但有一些属性,如Name 、 Enabled、Visible、Height、Width、Left、Top等,其它控件也有,且具有相似的作用。 在后续的章节中,主要介绍各种控件常用的特殊属性。

(二) 事件
窗体最常用的事件有3种:Click(单击)、DbClick(双击)、Load (装入)。 1.Click事件 程序运行后,单击窗体触发该事件。 2.DbClick事件 程序运行后,双击窗体触发该事件。

3.Load事件
Load事件是窗体被装入内存工作区时触发的事件。如果这个事件过 程存在,就马上执行它。Load事件过程通常用于启动程序时,对属性、 变量的初始化以及装载数据等。

(三)方法 窗体上常用的方法有Print和Cls方法。 1.Print方法 Print 方法的语法是: [对象名].Print[{Spc(n)|Tab(n)}][表达式列表][;|,] 2. Cls方法 Cls方法的语法格式: [对象名] .Cls 其中对象可以是Form或PictureBox,如果省略,通常 Visual Basic都把当前的窗口作为Cls操作的对象。

例2-2利用Print方法打印出如图2-15所示的图形,并使用 Cls方法将打印出来的图形清除。 在用户界面上放置一个命令按钮,在代码窗口直接设计 程序如下: Private Sub Command1_Click() Form1.Cls End Sub Private Sub Form_Click() Print "★★★★★★★★★ Print “ ★★★★★★★★ Print " ★★★★★★★ Print " ★★★★★★ Print " ★★★★★ Print " ★★★★ Print " ★★★ Print " ★★ Print " ★ End Sub 程序运行结果如图所示。

★" ★★" ★★★" ★★★★" ★★★★★" ★★★★★★" ★★★★★★★" ★★★★★★★★" ★★★★★★★★★"

例2-3 设计一个窗体, 用于测试鼠标的单击与双击的反应。
直接在代码窗口输入程序代码如下: Private Sub Form_Load() Caption = "加载窗体结果" AutoRedraw = True Picture = LoadPicture(App.Path + "\bg1.jpg") FontSize = 40 FontName = "隶书" ForeColor = vbGreen Print "Load事件" End Sub Private Sub Form_Click() Caption = "鼠标单击" Print "鼠标单击结果" End Sub Private Sub Form_DblClick() Caption = "鼠标双击" Picture = LoadPicture("") Print "鼠标双击" End Sub

2.3.2 标



标签(Label)主要用于显示不需要用户修改的文本。所以,标签可 以用来标示窗体及窗体上的对象,如为文本框、列表框等添加描述性的 文字,或者作为窗体的说明文字。
(一) 属性 1.Caption属性 设置标签要显示的内容。它是标签的主要属性。 2.BorderStyle属性 默认值为0,标签无边框;设置为1时,标签有立体边框。 3.Autosize属性 该属性用于设置标签是否自动改变尺寸以适应其内容。 4.Alignment属性 确定标签中内容的对齐方式。 5.BackStyle属性 该属性用于设置背景是否透明。

(二)事件 标签的主要事件有:Click、DblClick和Change事件。但是一般标签用于显示 输出信息,不需编写事件过程。 例2-4 利用标签控件,制作具有阴影效果的文字,如图所示

该例题的设计主要是对两个标签对象的属性设置,参见下表:。

默认控件 Label1 Label2

BackStyle 0-Transparent 0-Transparent

ForeColor &H00000000 &黑 &H00FFFFFF&白

Left 720 800

Top 240 280

2.3.3 命令按钮
在VB应用程序中,命令按钮是使用最多的对象之一,常常用它接受
用户的操作信息,触发相应的事件过程,以实现指定的功能。
(一) 属性 1.Caption属性 设定命令按钮上显示的文本。 2.Default属性 该属性用于设置默认命令按钮。 3.Style属性和Picture属性 命令按钮上除了可以显示文字外,还可以显示图形。若要显示图形,首先应 将Style 属性设置为1,然后在Picture属性中设置要显示的图形文件。 4.Value属性

该属性只能在程序运行期间引用或设置。True表示被按下,False(默认) 表示未被按下。 (二)事件 命令按钮最常用的事件是Click事件。

例2-5 分别制作两个按钮用来改变标签的文本颜色和背景 色,并制作一个具有图标的按钮用来结束程序。 各控件参数见下表:
控件名称 Form1 Label1 Command1 Command2 Command3 Caption “按钮操作示例” “HELLO VB” “改变背景” “改变文字” 空 字体大小 四号 小一 四号 四号 - Style - - 001Picture - - 空 空 ARW09RT

事件代码如下: Private Sub Command1_Click() Label1.ForeColor = vbRed End Sub Private Sub Command2_Click() Label1.BackColor = vbYellow End Sub Private Sub Command3_Click() End End Sub 程序运行结果如图所示:

2.3.4 文本框
文本框(TextBox)在窗体中为用户提供一个既能显示文本又能编辑 文本的区域。在文本框内,用户可以用鼠标、键盘按常用的方法对文字进 行编辑,例如进行输入、删除、选择、复制及粘贴等各种操作。
(一) 属性 1.Text属性 设置文本框中显示的内容。 2.Locked属性 设置文本框中的内容是否可编辑。 3.Maxlength属性 设置文本框中允许输入的最大字符数。 4.MultiLine属性 决定文本框是否允许接收多行文本。 5.PassWordChar属性 当MultiLine为False时,该属性可设置显示在文本框中的替代符。 6.ScrollBars属性 决定文本框中是否有滚动条。

(7)SelLength 定义当前选中的字符个数。该属性会随着选择字符数的多少而改变。 (8)SelText 该属性含有当前所选择的文本字符串。 (9)Locked属性 该属性设置文本框是否可以编辑。默认False时,可以编辑文本框中 的文本;当设置为True时,可以滚动和选择文本框中的文本,但不 能编辑。 (10)FontName,FontSize,FontBold,FontItalic,FontStrikethru, FontUnderline是与字体输出形式相关的几个重要的常用属性。

例2-6建立一个文本框,有关窗体和文本框属性如下表所示,要求当选中 文本框中的文字后,单击窗体在窗体上打印出所选文字,效果如图所示。
控件名 Form
Text1

属性名 FontSize
MultiLine

属性值 12
True

事件代码如下:

Private Sub Form_Click() Print Text1.SelText End Sub 例如程序运行时首先输入文字,然后选中其中的部分文字后, Text1.SelText值为“显示文字”,Text1.SelStart值为选定文字的开 始位置,即“显”字在该段文字的位置,Text1.SelLength值为4。

二.事件和方法 文本框的主要事件是: (1)Change 当用户向文本框中输入新信息时,或程序把Text属性设置为新值从而 改变文本框的Text的属性时将触发Change事件。 (2)GotFocus 一个处于可以接受用户输入数据状态的对象,被称为该对象此时具 有焦点,当焦点进入文本框时触发GotFocus事件,键盘上输入的每个 字符都将在该文本框中显示出来。只有当一个文本框被激活并可见时, 才能收到焦点。 (3)LostFocus 当按下Tab键时使光标离开当前文本框或者用鼠标选择窗体中的其它对 象,即焦点离开文本框时,触发该事件。 (4)KeyPress 当用户按下并且释放键盘上的能够产生ACSII码的键,就会引发文本 框的KeyPress事件,包括数字、大小写的字母、Enter、Backspace、 Esc、Tab等键。 SetFocus是文本框的常用方法,格式为:对象名. SetFocus,该方法 可以把输入光标移到指定的文本框中。在窗体上建立了多个文本框后, 可以用该方法把光标置于所需要的文本框。

例2-7简单的文本框操作示例:各控件对象参数如表中设置,运行效果如图所示。
控件名称 Form1 Caption “文本框操作示例 ” 字体大小 小四 Locked ——

Label1
Label2 Text1 Text2

“请在下面的文本框中输入:”
“你输入的内容是:” —— ——

三号
三号 小四 小四

——
—— Flase True

Command1

“执行”

三号

——

事件代码如下: Private Sub Command1_Click() Text2.Text = Text1.Text End Sub

2.3.5图形框(PictureBox)和图像框(Image)
一.图形框 在图形框中加载图片的方法有两种: 方法一:在设计界面设置其Picture属性。步骤为:1.选中设计界面的图形框控 件对象;2.在其属性窗口中选择Picture属性;3.单击设置框右方的“”按 钮,在弹出的加载图片窗口中选择需要添加的图片。 方法二:在代码窗口可以使用LoadPicture()函数装入图片,则在程序运行时 会自动将图片加载进来。其格式为: 图形框对象名.Picture=LoadPicture(”图形文件名”) 卸载图片的方法也有两种: 方法一:在设计界面将其Picture属性清空 方法二:在代码窗口可以使用LoadPicture()函数卸载,格式为: 图形框对象名.Picture=LoadPicture(” ”)

PictureBox的Autosize属性为True时,图形框能自动调整大小与显示的图片匹配, 但是,如果图片的大小超过图形框所在的窗体,则只能显示部分图片,因 为窗体本身无法自动调整大小。Autosize值为False,则图形框不能自动改 变大小来适应其中的图片。 PictureBox也可以作为其它控件的容器。这些控件会随着PictureBox的移动而移 动。

二.图像框 在窗体上使用图像框和图形框步骤相同。但图像框没有Autosize属 性,而是用Stretch属性来自动调整图像框中图形内容的大小。当其 值为True时,装入的图片自动适应图像框的大小,当其值为False 时,图像框自动适应图片的大小。 图片框和图像框都可以接收Click和DbClick事件。

三. 图形框与图像框的区别 (1)图形框可以作为容器使用,但图像框不行。 (2)图形框可以通过Print方法接收文本,并可以接收由像素组成的图形; 图像框不能接收用Print方法输出的信息,也不能用绘图方法在图像 框上绘制图形。 (3)图像框比图形框占用的内存少,显示速度快。如果在图形框和图像 框都能满足需要的情况下,应该先考虑使用图像框。

例2-8 分别用图形框和图像框加载图片,并比较图像框的Stretch和图形框的 Autosize属性。程序运行如图所示 : 分别在窗口中拖放图形框和图像框控件对象。编写如下事件代码: Private Sub Form_Load() Picture1.Height = 2175 Picture1.Width = 3015 Picture1.Picture = LoadPicture(App.Path + "\Car3666.jpg") Image1.Picture = Picture1.Picture End Sub

图像框的Stretch和图形框的Autosize属性均为 False

图像框的Stretch和图形框的Autosize属性均为 True

例2-9 在图像框中放入图片“世界卫生组织.jpg”,利用Move方法,让其 自动下、向右移动。如图所示: 事件代码如下: Private Sub Form_Load() Image1.Picture = LoadPicture(App.Path + "\世界卫生组织.jpg") End Sub Private Sub Command1_Click() Image1.Move Image1.Left, Image1.Top - 50 End Sub Private Sub Command2_Click() Image1.Move Image1.Left + 50, Image1.Top End Sub

2.4程序调试
2.4.1 错误类型 1.编辑错误 在编辑代码时,VB会对键入的代码直接进行语法检查。当发现代码存在打 字错误,遗漏关键字或标点符等语法错误,VB在Form窗口中弹出一个子 窗口,提示出错信息,出错的那一行变成红色。这时,用户必须单击“确 定”按钮,关闭出错提示窗,然后对出错行进行修改。

2 .编译错误
编译错误指按了“启动”按钮,VB开始运行程序前,先编译执行的程 序段时,产生的错误。此类错误由于用户未定义变量、遗漏关键字等原

因产生。这时,Visual Basic也弹出一个子窗口,提示出错信息,出错的
那一行被高亮度显示。

3 .运行错误
运行时错误指VB在编译通过后,运行代码时发生的错误。这类错误 往往是指令代码执行了一非法操作引起的。例如类型不匹配、无效

参数或过程的调用以及试图打开一个不存在的文件等。

如使用函数QBColor设置背景色, 参数34超出了范围0-15,会在 运行时单击命令按钮出错,告知 这时一个无效的参数。这时单击 “调试”,会进入“中断模式” 下,错误处以高亮度显示,在此 模式下可以进行修改,修改完成 后,重新运行该程序即可

4 逻辑错误
程序运行后,得不到所期望的结果,这说明程序存在逻 辑错误。这类错误往往是程序存在逻辑上的缺陷所引起。

例如,运算符使用不正确、语句的次序不对、循环语句
的起始、终值不正确等。通常,逻辑错误不会产生错误 提示信息,故错误较难排除,需要程序员仔细地阅读分 析程序以及调试。?

2.4.2 VB的调试工具 1.切换断点 在“代码”窗口中确定一行,VB在该行终止应用程序的执行。 2. 跟踪 执行应用程序代码的下一个可执行行,并跟踪到过程中。 3. 单步 执行应用程序代码的下一个可执行行,但不跟踪到过程中。 4.跳出 执行当前过程的其它部分,并在调用过程的下一行中断执行。 5. 本地窗口 显示局部变量的当前值。 6. 立即窗口 当应用程序处于中断模式时,允许执行代码或查询值。 7. 监视窗口 显示选定表达式的值。 8. 快速监视 当应用程序处于中断模式时,列出表达式的当前值。 9. 调用堆栈 当处于中断模式时,呈现一个对话框显示所有已被调用但还尚未完成运行 的过程。

2.4.3 VB程序的调试 一.使用插入断点和逐句语句跟踪功能 二.调试窗口观察变量的值
2.4.4错误陷阱 在VB中,要增加应用程序的处理的能力,需要做以下两步工作:第一,设置错 误陷阱;第二,编写错误处理程序 VB提供了On Error语句设置为错误陷阱,捕捉错误,On Error语句有3种形式: On Error Goto语句标号:在发生运行错误时,转到语句标号所指定的程序块执 行错误处理程序,指定的程序块必须在同一过程中,错误处理程序的最后 必须加上Resume,以告知返回位置。 On Error Resume Next:在发生运行错误时,忽略错误,转到发生错误的下一条 语句继续运行。 On Error Goto 0:停止错误捕捉,由VB直接处理运行错误。 Resume语句应放置在出错处理程序的最后,以便错误处理完毕后,指定程序 下一步做什么。Resume也有3种形式。 Resume 标号:返回到标号指定的行继续执行,若标号为0,则表示终止程序执 行。 Resume Next:跳过出错语句,返回到出错的下一条语句继续执行。 Resume:返回到出错语句处重新执行。

2.5 应用程序的发布 一个工程文件制作完成后要发布其应用程序,方法有两种:第一,生成 应用程序的可执行文件;第二,利用VB6.0的“Package & Deployment”工 具将应用程序制作成安装盘。
2.5.1生成应用程序的可执行文件 例如,将应用程序“ex02_10.vbp”生成可执行文件,步骤为: 执行“文件→生成ex02_10.exe”菜单命令,则出现“生成工程”窗口。 单击“选项”按钮,打开“工程属性”窗口,该对话框中有“生成”和 “编译”两个标签。选中“生成”标签,单击“确定”按钮,回到“生成 工程”对话框,再单击“确定”按钮,即开始生成可执行文件。 现在,在你的机器上双击这个可执行文件的图标,应用程序久可以执行了。

2.5.2将应用程序制作成安装盘发布

第三章 VB程序设计基础

3.1数据类型

在VB中,允许使用的有如下几种数据类型: 1. 数值数据类型 (1)Integer和Long型 Integer型占2个字节(即共16位),表示整数的范围为-215~215-1,即32768~32767。 Long型占4个字节(即共32位),表示整数的范围为-231~231-1,即 2147483648~2147483647。 (2)Single和Double型 Single型占4个字节,精度为7位,表示的正数范围为1.401298 E-45~3.402823 E38, 负数范围为-3.402823 E38~-1.401298 E-45。 Double型占8个字节,精度为16位,表示的正数范围为4.94065645841247 E-324~ 1.79769313486232 E308,负数范围为-1.79769313486232E308~4.94065645841247 E-324。 Single和Double型用于保存带小数的数字。 (3)Currency型 占8个字节,能表示数的范围为-922337203685477.5808~922337203685477.5807。 (4)Byte型 用于表示并存储二进制数据。占1个字节,能表示0~255的整数范围。

2.逻辑数据类型
逻辑(Boolean)类型用于表示只有两种相反取值的数据,适合于逻辑判断的情况, 它只有True与False两个值。 3.字符数据类型 字符(String)类型用于表示由多个字符组成的字符串。字符可以包括所有的西文 字符和汉字,字符两侧用英文输入方式中的双引号括起。 4. 日期数据类型

日期(Date)型数据用于表示日期和时间,它可以接受多种表示形式的日期和时间。 表示的日期范围从公元100年1月1日到9999年12月31日,时间范围为0:00: 00~23:59:59。赋值时用两个“#”符号把表示日期和时间的值括起来。 5.变体数据类型

变体(Variant)数据类型能够存储所有系统定义类型的数据,如果把它们赋予 Variant类型,则不必在这些数据的类型间进行转换,VB会自动根据上下文的需 要完成任何必要的转换。
6. 对象数据类型

对象(Object)类型可用来引用应用程序中或某些其他应用程序中的对象。

3.2常量和变量
3.2.1 常量和变量的命名规则 在VB6.0中,必须按如下规则命名一个常量或变量: (1)不能使用VB中的关键字。 (2)首字符必须是字母或汉字,其余字符可以为字母、汉字、数字或下划线,长 度不超过255个字符。
例如下面列举的这些变量名是正确的:Inta、a、医德、师_9、y8。 而下面列举的这些变量名是不正确的: Sub ?是VB中的关键字 255x ?不允许以数字开头 _xy ?不允许以下划线开头 x-y ?不允许出现减号 a&b ?不允许出现符号& xing ming ?不允许出现空格

3.2.2 常量 1.直接常量
(1)字符串常量 字符串常量就是用双引号括起来的一串字符。例 如:”a”、”5”、””、”Hello2010”。 (2)数值常量 数值常量共有5种表示方式:整数、长整数、定点数、浮点数和字节数。 例如: 整型常数:268、-7、0 长整型常数:268&、-7&、0& 八进制常数:&O567、&O132、&O0 十六进制常数: &H56CE、&HABEF、&H0 定点数: 3.1415、-100.85、0.0 浮点数:1.23E+10,-0.52E8、-1.23D+10,0.5D-24 字节数:86,100,0 (3) 布尔常量 布尔常量只有True(真)和False(假)两个值。 (4) 日期常量 用两个“#”符号把表示日期和时间的值括起来表示日期常量。例如:#11/28/2008#

2、系统内部定义常量 3、用户定义常量

3.2.3 变量
在VB中,用变量来表示程序运行过程中其值可发生变化的量。变量名来表示其 中存储的数据,变量类型表示其中存储的数据的具体类型。因此每个变量必须有 一个唯一的变量名字和相应的数据类型。 1、声明变量 (1)隐式声明 在VB中使用一个变量时,可以不加任何声明而直接使用,叫做隐式声明。 (2)显式声明 显式声明是指每个变量必须事先做声明,才能够正常使用。 声明变量语法格式如下:

声明方式 变量名 [As 数据类型名] 或 声明方式 变量名[类型符]

在VB中,变量可被声明为在不同范围内使用,根据范围和使用规则的不 同可分为以下四种:普通局部变量、静态局部变量、窗体/模块级变量和 全局变量。如下表所示。
作用范围 普通局部变量 静态局部变量 窗体/模块级变量 全局变量 窗体 声明方式 声明位置 再次调用过程, 变量是否初始化 能否被本模块的 其它过程存取 能否被其它模块 存取 Dim 在过程中 是 不能 不能 Static 在过程中 否 不能 不能 Dim、Private Public 标准模 块

窗体/模块的“通 窗体/模块的“通 用”部分 用”部分 否 能 不能 否 能
能,但在变 量名前要加 窗体名



数据类型名:可使用下表中的各数据类型的关键字;
数据类型 整型 长整型 单精度型 双精度型 货币型 字符型 关键字 Integer Long Single Double Currency String 类型符 % & ! # @ $ 数据类型 字节型 逻辑型 日期型 变体型 对象型 关键字 Byte Boolean Date Variant Object 类型符 无 无 无 无 无

①普通局部变量:声明方式关键字为Dim 如以下变量的声明均是正确的: Dim a As Integer ?声明了一个整型变量a Dim Inta% ?声明了一个整型变量Inta Dim b# ?声明了一个双精度型变量b Dim avg ?声明了一个变体型变量avg Dim imax as Long,imin&,isum ?分别声明了长整型变量imax和imin及变 体型变量isum

②静态局部变量:声明方式关键字为Static 例3-1 窗体中有按钮控件Command1,以下是 Command1的Click事件:

Private Sub Command1_Click() Dim a As Integer Static b As Integer a=a+1 b=b+1 Print "a=" ; a, "b=" ; b End Sub
图3-1

③窗体/模块级变量 指在一个窗体/模块的“通用”部分用Dim或Private语句声 明的变量,可以适用于该窗体/模块内的所有过程,但对其它窗 体/模块内的过程不能适用。声明此类变量的格式如下: Dim/Private 变量名 [As 数据类型名] 或 Dim/Private 变量名[类型符] ④全局变量 指在窗体或标准模块的“通用”部分用Public语句声明的变 量,可被应用程序的任何过程和函数访问,全局变量的值在应 用程序的执行过程中始终有效且不会被重新初始化,只有当该 应用程序执行结束该值才会消失。程序中任何模块或窗体中对 它的修改都会影响其它模块或窗体中该变量的值。声明此类变 量的格式如下: Public 变量名 [As 数据类型名] 或 Public 变量名[类型符]

例3-2 在下面程序中有一个按钮控 件,其窗体Click事件中声明了不同 级但有相同名称的变量。 Public pub As Integer Private pri%
Private Sub Form_Click() Dim pub As Integer pub = 2 pri = 3 * pub Form1.pub = 4 * pub Print "dim pub = " pub, "pri=" ; pri, "public pub=" ; Form1.pub End Sub Private Sub Command1_Click() Print “pub=” & pub End Sub
当程序运行时若先单击窗体再 单击按钮,则显示结果如上图 所示

当程序运行时若先单击按钮再 单击窗体,则显示结果如图如 上图所示

2、变量赋值

在声明一个变量后,要先给变量赋上一个合适的值才能够 使用。当然,对于不同数据类型的变量,系统会赋予其默认初 始值。给变量赋值的格式如下: 变量名 = 表达式

3.3 运算符和表达式
3.3.1 运算符
1、数学运算符 设Inta为整型变量,其值为5,下表为数学运算符及其运算法则,其运算 优先级别分别为由高到低。 运算符 ^ * / 含义 指数运算 负号 乘 除 实例 2^3 -Inta Inta*3 Inta/3 结果 8 -5 15 1.66666666666667

\ Mod + -

整除 取余数 加 减

Inta\3 Inta Mod 3 Inta+3 Inta-3

1 2 8 2

2.字符串运算符 运算符 + 含义 字符串运算 举例 “中西医”+”结合” “1000”+”234” 结果 “中西医结合” “1000234”

数学运算

1000+345
12+”56” “9870”+129

1345
68 9999

错误使用
& 字符串运算

2010+”上海博览会”
“VB” & ”程序设计” 253 & 69 12 & ”56”

出错
“VB程序设计” “25369” “1256”

2010 & ”上海博览会” “2010上海博览会”

3.关系运算符
运算符 含义 举例 结果

=
<> > >= < <= Like

等于
不等于 大于 大于等于 小于 小于等于 字符串匹配

“xyz”=”xy”
“xyz”<>”XYZ” 15>3 “中国”>“China” “15”<3 “15”<=”3” “abc” Like “?b*”

False
True True True False True True

对于关系运算符: (1)如果两个操作数是数值型,则按其大小比较;如果一个是数值型,另一个 是数字字符型,则系统会先将数字字符型转换成数值型再进行数值大小比较; 如果一个是数值型,另一个是非数字字符型,则系统出错。 (2)如果两个操作数是字符型,则按字符的ASCII码值从左到右一一比较。

4. 逻辑运算符
运算符 Not And 含义 取反 与 举例 Not True Not False True And True False And False True And False True Or True False Or True False Or False True Xor False False Xor False True Eqv True False Eqv True 结果 False True True False False True True False True False True False

逻辑运算符用于判断操作数 之间的逻辑关系,结果是逻 辑值True或False。左表列 出了VB中的逻辑运算符及 其运算法则,其运算优先级 别分别为由高到低。

Or



Xor Eqv

异或 等价

Imp

蕴含

True Imp False False Imp True True Imp True

False True True

3x ? y (2 x ? z ) y
2

3.3.2 表达式
1.表达式的书写规则
VB表达式的书写规则与数学表达式的常用格式不同,要注意区分。 (1)要正确使用VB中规定的相应运算符,且不能省略书写任何运算符。如要 表示x乘以y、x的3次方,应写成x*y、x^3,而写成x×y或xy、x3均是不正 确的。 (2)无论表达式结构多么复杂,都只能出现圆括号且要配对,而不能使用其 它类型的括号。 (3)应从左往右将整个表达式书写在同一基准线上,而不能出现高低层次之 分。 例如,要将数学表达式 式如下:
3 x ? y (2 x ? z ) y
2

在VB中表示,则必须要写成VB表达

3*Abs(x-y)/((2*x+z)*y^2) 其中,Abs()是VB中取绝对值函数。

2.不同数据类型的转换 在VB的算术运算中,如果操作数属于不同的数值数据类型, 则运算结果一般采用其中精度高的数据类型。但当Long型 数据与Single型数据运算时,结果为Double型数据。 各种数值数据类型的精度比较如下: Byte<Integer<Long<Single<Double<Currency

3.优先级 当一个表达式中有多个同种类型的运算符时,其运算除了遵循 从左至右顺序以及参照圆括号的作用,同时可能还要考虑其 优先级关系,比如前面所述的数学运算符、逻辑运算符。而 当一个表达式中出现不同类型的运算符时,它们之间的运算 顺序也有优先级关系,VB的四类运算符优先级从高至低依 次为: 算术运算符>字符运算符>关系运算符>逻辑运算符

举例如:
12 mod 20/4*2 ?先计算”/”,再计算”*”,后计算”Mod”,结果为2 (12 mod 20)/4*2 ?先计算”Mod”, 再计算”/”,后计算”*”,结果为 6 Not "AB" + "C" > "A" ?先计算”+”,再计算”>”,后计算”Not”,结果为 False

3.4 常用内部函数 为了方便编程时表达的需求,VB为我们提供了大量的标 准函数,通常称为内部函数,以便我们在需要时进行相应的 调用。内部函数按其功能大致可分为数学函数、字符串函数、 类型转换函数、日期时间函数、格式输出函数、文件操作函 数等。 具体较重要的常用函数请大家参考本教材或参考专门的 VB函数使用手册。

第四章 控制结构

4.1顺序控制结构

顺序结构就是各语句按出现的先后次序执行。一般的程序设计语言中, 顺序结构的语句主要是赋值语句、输入/输出语句等。在VB中也有赋值语句, 而输入/输出可以通过文本框、print方法等实现,也可以通过系统提供的函 数和过程来实现。 4.1.1赋值语句 赋值语句的一般形式如下: 变量名=表达式 对象.属性=表达式 程序执行时,先计算右边表达式的值,然后将值赋给左边的变量或属性。 例如: X=100 ? 把数值赋给变量X; Text1.Text=" VB欢迎你" ?把字符串赋给Text1的Text属性 Label1.Caption = Date() ‘把Date函数的结果赋给Label1的Caption属 性 Label1.Top = Label1.Top - 100 ?把表达式的值赋给Label1的Top属性 在赋值语句中,赋值运算符"="代表赋值操作,而不代表等量关系。

4.1.2人机交互函数和过程 Vb程序与用户之间的直接交互可以通过InputBox ( )函数、MsgBox ( )函数和 Msg过程进行。 1.InputBox()函数 InputBox()函数可以产生一个对话框,这个对话框作为输入数据的界面,等待 用户输入数据,当用户单击“确定“按钮或回车时,函数返回输入的值,类型为字 符型。函数格式如下:

变量$=InputBox(Prompt[,Title][,Default][,XPos][,YPose])

例4-1 应用InputBox函数进行患者信息的输入,运行界面如图

程序代码如下: Private Sub Form_Click() Dim cl$, msg1$, msg2$, msg3$, msg$, I$ cl = Chr(13) + Chr(10) ?回车、换行 msg1 = "请输入患者姓名" msg2 = "输入后单击确定按钮" msg3 = "或按回车键" msg = msg1 + cl + msg2 + cl + msg3 I = InputBox (msg, "患者信息输入框", "张三", 400, 400) End Sub

2.MsgBox()函数和MsgBox过程 MsgBox()函数可以产生一个消息框,等待用户选择按钮, 当用户单击某个按钮时,函数返回按钮的值,类型为整型。 函数格式如下: 变量%=MsgBox (Prompt[,Type] [,Title])

其中Type为整型表达式,用来控制在消息框中显示的按钮、图标的种类、数 量。其按钮、图表设置值及意义 如下表所示:
分组 按钮数目 内部常数 VBOkOnly VBOkCancel VBAboutRetryignre VBYesNoCancel VBYesNo VBRetryCancel VBCritical VBQusetion VBExclsmation VBinformation VBDefaultButton1 VBDefaultButton2 VBDefaultButton3 按钮值 0 1 2 3 4 5 16 32 48 64 0 256 512 描述 只显示“确定”按钮 显示“确定”“取消”按钮 显示“终止”“重试”“忽略”按 钮 显示“是”“否”“取消”按钮 显示“是”“否”按钮 显示“重试”“取消”按钮 关键信息图标 红色STOP标志 询问信息图标? 警告信息图标! 信息图标i 第1个按钮为默认 第2个按钮为默认 第3个按钮为默认

图标类型

默认按钮

模式

VBApplicationModel VBSystemModel

0 4096

应用模式 系统模式

MsgBox函数返回所选按钮整数值的意义如下表所示:
内部常数
VBOk VBCancel VBAbout VBRetry VBIgnre VBYes VBNo

返回值
1 2 3 4 5 6 7

被单击的按钮
确定 取消 终止 重试 忽略 是 否

例4-2 编写一医生工作站的登录检验程序,运行界面如图4-3。对登录名 (医生工号)和密码的规定如下: (1)医生工号不超过6位数字,密码为6位字符,密码输入时显示为“*”。 本题假设密码为“cljuan”。 (2)当医生工号输入非数字字符,密码不正确时,显示相关信息。 (3)若单击“重试”按钮,则清除原来输入的内容,焦点定位在原输入文

本框,等待用户输入。若单击取消按钮,程序停止运行。

本程序运行结果如图所示,程序代码见 后页。

例4-2 程序代码如下:
Private Sub Command1_Click()
Dim I As Integer IF Not Text2 = "cljuan" Then I= MsgBox("密码错误", 5 +64+ 0 + VBSystemModel, "登录密码")

IF I = 2 Then End Else Text2 = ""
Text2.SetFocus End IF

?用户单击“取消”按钮返回按钮值
?将焦点设置在文本框2上,方便用户输入

‘用户单击”重试”按钮文本框置空,等待用户重新输入

End Sub
Private Sub Text1_LostFocus() IF Not IsNumeric(Text1) Then Text1 = "" Text1.SetFocus End IF End Sub ? 焦点离开文本框1时触发LostFocus事件 ?利用IsNumeric()函数判断文本框中输入的是否为数字字符

MsgBox "医生工号必须是数字字符"

4.2选择结构

4.2.1 IF条件语句
F

1.IF……Then 语句(单分支结构) 语句形式: (1) IF < 表达式 > Then 语句块 End IF IF <表达式> Then 语句块

表达式
T

语句块

单分支结构流程示意图

(2)

其中:表达式:一般为关系表达式、逻辑表达式,也可以为算术表达式。表达 式的值按非零为True ,零为False 进行处理。 语句块:可以是一条或多条语句。如果采用形式(2)表示则语句之间要用冒 号分隔,并且一定写在同一行上。

例4-3已知两个变量x和y,比较它们的大小,使x中的值大于y。(要实现两 个变量中的数互相交换通常以使用第三变量为过渡,在此为t)语句如下:
IF x < y Then t=x x=y y=t End IF

‘将变量x中的值暂时存放于变量t中 ‘用变量y中的值替代变量x中的值 ‘再将原变量x中的值替代变量y中的值

或者 IF x < y Then t=x : x=y: y=t

2.IF……..Then……Else(双分支结构)

语句形式: IF <表达式> Then <语句块1> Else <语句块2> End IF
或者: IF <表达式> Then <语句块1> Else

T

表达式

F

语句块1

语句块2

<语句块2>

双分支结构流程示意图

如果表达式的值为非零或True执行语句块1,否则执行语句块2。

3.IF……Then……ElseIF(多分支结构)

语句形式:
IF <表达式1>Then <语句块1> ElseIF <表达式2> Then <语句块2>???? ???? [Else <语句块n+1> ] End IF
语句块1
T T

表达式 1

F


表达式 2

F

表达式 n T

F

语句块2



语句块n

语句块n+1

T

T

T

多分支结构流程示意图

例4-4 按照世界卫生组织(WHo)建议使用的血压标准是:凡正常成人收缩压应 小于或等于140MmHg,舒张压小于或等于90MmHg。如果成人收缩压大于或 等于160MmHg,舒张压大于或等于95MmHg为高血压;血压值在上述两者之 间,亦即收缩压在141—159MmHg之间,舒张压在91-94MmHg之间,为临界 高血压。低血压通常指血压低于90/60MmHg。运行界面与程序代码如下:
Private Sub Command1_Click() Dim x, y Picture1.Cls x = Val(Text1.Text) ?将文本转换为数值型后赋值给变量x,y y = Val(Text2.Text) IF x < 90 And y < 60 Then Picture1.Print "血压偏低" ElseIF x <= 140 And y <= 90 Then Picture1.Print "血压正常" ElseIF x < 160 And y < 95 Then Picture1.Print "临界高血压" Else Picture1.Print "高血压" End IF End Sub Private Sub Command2_Click() End End Sub

5.IF 语句的嵌套 语句形式: IF <表达式1> Then 语句块1 IF <表达式2> Then 语句块2 … End IF 语句块3 … End IF

例4-5 输入3个整数,按从小到大的顺序输出。程序运行界面如图 程序代码如下:
Private Sub Command1_Click() Dim x%, y%, z%, t% Form1.Cls x = Val(InputBox("请输入1个整数")) y = Val(InputBox("请输入1个整数")) z = Val(InputBox("请输入1个整数")) Print "您输入三个的数是:"; x; Spc(1); y; Spc(1); z IF x > y Then ‘如果x > y则x,y交换 t = x: x = y: y = t End IF IF y > z Then t = y: y = z: z = t IF x > y Then t = x: x = y: y = t End IF End IF Print "从小到大的顺序是:"; x; Spc(1); y; Spc(1); z End Sub Private Sub Command2_Click() End End Sub

例4-6在文本框中输入1-1000之间的数字,如果输入非数值,或数值超出 范围,给予提示,并重新输入。运行效果及程序代码如下:
Private Sub Form_Load() Text1.Text = "" Text2.Text = "" End Sub Private Sub Text1_KeyPress(KeyAscii As Integer) If KeyAscii = 13 Then '回车键的ASCII码值为13 If IsNumeric(Text1.Text) Then '判断是否是数值 x = Val(Text1.Text) If x < 0 Or x > 1000 Then Text1.Text = "" Text1.SetFocus '焦点回到文本框 Text2.Text = "数值超出范围,再输入!" '文本框中显示提示信息 Else Text2.Text = "输入正确!" End If Else Text1.SetFocus Text2.Text = "请输入数字!" End If End If End Sub

4.2.2 Select Case 语句 Select Case 语句是多分支结构的又一种表示形式,又称情况语句。 语句形式: Select Case 变量或表达式 Case 表达式列表1 T <语句块1> 语句块1 表达式列表1 Case 表达式列表2 F <语句块2> T …… 语句块2 表达式列表2 [Case Else F …. <语句块n+1>] . …. . End Select T
表达式列表n
F

语句块n

语句块n+1

Select语句流程示意图

例4-7编写一个简便四则运算器,应用Select Case 判断运算符。运行界面如图 【程序代码】
Private Sub Command1_Click() Dim code As String code = Trim(Text2.Text) Select Case code Case "+" Text4 .Text= Val(Text1) + Val(Text3) Case "-" Text4.Text = Val(Text1) - Val(Text3) Case "*" Text4.Text = Val(Text1) * Val(Text3 Case "/" IF Val(Text3) = 0 Then MsgBox ("除数不能为0,请重新输入") Text3 = "“ Text4.Text = "" Text3.SetFocus Else Text4 = Val(Text1) / Val(Text3 End IF End Select End Sub Private Sub Command2_Click() End End Sub Private Sub Command3_Click() Text1 = "" Text2 = "" Text3 = "" Text4 = "" Text1.SetFocus End Sub

4.2.3 条件函数
VB中提供的条件函数:IIF()函数和Choose()函数,适用于简单的判断场合。 前者代替IF语句,后者可代替Select Case语句, IIF()函数 函数形式: IFF(表达式,条件为True时的值,条件为False时的值) 例如:求x,y中大的数,放入变量T中,可以应用语句 T=IFF( x>y , x ,y) Choose ()函数 函数形式: Choose(整型表达式,选项列表) 其中整型表达式的值决定函数返回选项列表中的哪个值。如果整型表达式为1, 则函数返回选项列表中的第一项的值,若整型表达式为2,则函数返回选项列表 中的第2项的值,…依次类推。 如果整型表达式的值小于1或大于列出的选项数目时,函数返回Null。 如果整型表达式的值为非整型时,系统自动取其整数进行判断。 例如,根据x是1~4的值,转换成“内科”、“外科”、“妇科”、“儿科”的 语句可以写成: kb=Choose(x,“内科”,“外科”,“妇科”,“儿科”)

4.3循环结构
4.3.1 For循环语句 For循环语句是计数型循环语句,用于控制循环次数预知的循环结构。 语句形式: For 循环变量=初值 To 终值 [ Step 步长 ] 循环变量=初值
<语句块> [Exit For] <语句块>
F

循环变量≤终值
T

Next 循环变量
说明: 循环体 循环变量必须是数值型 步长:一般为正数,初值小于终值 ; 若为负数,初值大于终值; Step 缺省时默认为1。 语句块:重复执行的部分,构成循环体, 可以是一句或多句。 Exit For :退出循环,执行Next 后的下一条语句。 循环次数:n=Int(
终值-初值 步长

语句块
T

有Exit For
F

语句块

循环变量=循环变量+步长

+1 )

步长>0时For循环语句流程示意图

例4-8求100以内所有数的和。 程序块如下: Sum =0 ?sum 为累加和变量,设初值为0 For i= 1 To 100 Sum=Sum+i Next I 又如:求10的阶乘。 T=1 ?T为连乘积的变量,设初值为1 For i=1 To 10 T=T*i Next i

4.3.2Do…Loop循环语句

Do循环用于控制循环次数未知的循环结构。 (2)Do 语句形式: <语句块> (1) Do [ {While | Until}<条件> ] [Exit Do] <语句块> <语句块> [Exit Do] Loop [ {While | Until}<条件> ] <语句块> 语句块 Loop F
表达式列 表
T T

语句块
T

Exit Do 语句块

有Exit Do
F

T

语句块

表达式列 表
F

Do …Loop While流程示意图 Do While…Loop循环流程图

例4-9利用Do While循环编写一个将十进制数转换成二进制数的程序。程 序运行界面如图: 程序代码如下: Private Sub Command1_Click() Dim x$, n%,a%, n = InputBox("请输入1个整数") Print "十进制数为:"; n x = "" Do While n <> 0 a = n Mod 2 n=n\2 x = Chr(48 + a) & x Loop Print "二进制数为:"; x Print End Sub

4.3.3循环的嵌套 在一个循环体内又包含了一个完整的循环结构称为循环的嵌套。循环的 嵌套对For循环语句和Do…Loop语句均适用。对于循环的嵌套,需要注意 以下事项: 内循环变量与外循环变量不能同名。 外循环必须完全包含内循环,不能交叉。 以下程序段是错误的:

(1)内外循环变量同名 错误: For i=1 To 10 For i =1 To 20 …. Next i Next i

(2)内外循环交叉 For i = 1 To 10 For j=1 To 10 … Next i Next j

例4-10求100以内的素数 素数素数也成质数,就是大于2且只能被1和本身整除的整数。 我们从素数的定义来求解:从i=2,3,4,…,m-1依次判断m能否被i整 除,只要有一个能整除m就不是素数,否则m为素数。运行结果如图
【程序代码】 Private Sub Command1_Click() Dim i As Integer , m As Integer, n As Integer Print “100以内的素数有” For m= 3 To 100 ?对100以内的每个数判断其是否为素数 For i=2 To m-1 IF (m mod i)=0 Then GoTo Notm ?m能被i整除,该m不是素数 Next i Print Spc(3 - Len(Str(m))); m; IF n Mod 10 = 0 Then Print Notm: Next m End Sub

求100以内的素数,不使用GOTO语句的解决方式:
Private Sub Command1_Click() Dim i As Integer, m As Integer, Flag As Boolean, n As Integer Print "100以内的素数有" For m = 3 To 100 Flag = True For i = 2 To m - 1 IF (m Mod i) = 0 Then Flag = False Next i IF Flag = True Then n=n+1 Print Spc(3 - Len(Str(m))); m; IF n Mod 10 = 0 Then Print End IF Next m End Sub

例4-11利用随机函数产生20个50~100范围内的随机数,显示最大值和最小 值。运行界面如图
[程序代码] Private Sub Command1_Click() Dim maxa As Integer, mina As Integer, x As Integer, i As Integer Form1.Cls ?每单击一次清除原来内容 maxa = 50 ?假设较小的数为最大 mina = 100 ?假设较大的数为最小 Randomize For i = 1 To 20 x = Int(Rnd * 51 + 50) Print x; IF i Mod 10 = 0 Then Print IF x > maxa Then maxa = x IF x < mina Then mina = x Next i Print Print "最大值为"; maxa Print "最小值为"; mina End Sub

例4-12 使用循环语句在窗体上输出第2章中例2-2中的图形。程序运行界面 如图 程序代码如下:

Private Sub Command1_Click() Dim n As Integer Cls n = Val(Text1.Text) If n > 0 Then For i = 1 To n Print Tab(2 * i); String(n + 1 - i, "★"); " "; String(i, "★") Next i End If End Sub

第五章 VB中的数组

5.1数组的概念
5.1.1基本概念 数组:是同一类型变量的一个有序的集合。 例如:num(1 To 150),表示一个包含150个数组元素的名为num的数组。 数组元素:即数组中的变量。用下标来区别数组中的各个元素。 表示方法:数组名(L1,L2,……) 其中L1、L2表示元素在数组中的排列位置,称为“下标”。 例如: num(10)代表一维数组num中第10个位置上的那个元素。 c(4,2)代表二维数组c中第4行第2列上的那个元素。 数组维数:由数组元素中下标的个数决定。一个下标表示一维数组,二个 下标表示二维数组,多维数组元素的下标之间用逗号分隔。 VB中有一维数组、二维数组、……最多60维数组。 下标:下标表示序号,每个数组元素有一个唯一的序号,下标不能超过数 组声明时的上、下界范围。下标可以是整型的常数、变量、表达式, 但在声明数组时下标必须是常数。 下标的取值范围:下界To上界,当缺省下界时,系统默认下界取0。

5.1.2数组声明
数组必须先声明后使用,否则将会产生编译错误。声明数组的目的是让 系统在内存中分配一个连续的区域,用来存储数组元素。 数组声明的内容有:数组名、类型、维数和数组大小。 一般情况下,数组中各元素类型必须相同,但若数组为Variant时,可包含不 同类型的数据。 1.静态数组:声明时数组的大小是确定的。 2.动态数组:声明时没有给定数组的大小(即省略了括号中的下标), 使用时需要用ReDim语句重新指定数组的大小。 使用动态数组的优点是可以根据用户需要,有效地利用存储空间,它是 在程序执行到ReDim语句时才分配存储单元,而静态数组是在程序编译时分 配存储单元。

5.2静态数组
5.2.1一维数组的声明和引用 1.静态一维数组的声明格式: Dim数组名(下标)[As类型] 2.一维数组元素的引用 引用一维数组元素的格式: 数组名(下标) 引用数组元素时,下标可以为整型常量、变量或表达式 例如:a(1)=1:a(i)=x+y:a(i+1)=t

5.2.2使用一维数组
1.一维数组的赋值 (1)对数组中的元素逐个赋值 例如: Dim arr(5) As Integer arr(0)=5 : arr(1)=4 : arr(2)=-2 : arr(3)=1 : arr(4)=-8 : arr(5)=6 一般来说,如果各个数组元素的值彼此之间毫无规律可寻,则可以采用逐个 赋值的方法,显然这种方法在进行大量数据的处理时决非上乘之选。 (2)使用循环语句对数组元素赋值 例如: For i=0 to 5 arr(i)=Int(Rnd*90)+10 Next i 如果各个数组元素的值彼此之间是有规律可寻的,则可以采用循环语句来实 现其赋值操作。 (3)使用Array函数 Array函数:给Variant类型的变量赋值,同时确定数组大小。 使用格式:Array(参数列表) 例如: Dim arr As Variant arr=Array(1,3,6,9,11)

2.一维数组的输出 对于一维数组的输出,基本上都是使用一个单循环语句来达到目的: For i=0 to 5 Print arr(i) Next I
例5-1随机产生50个0~100之间的整数,输出并求出总和与平均值。程序运行 界面如图所示。 程序代码: Private Sub Form_Click() Dim a%(1 To 50), i%, sum%, ave% sum = 0 For i = 1 To 50 a(i) = Int(Rnd * 101) sum = sum + a(i) Print Tab(5 * ((i - 1) Mod 10)); a(i); If i Mod 10 = 0 Then Print Next i ave = sum / 50 Print Print "总和为:"; sum; "平均值为:"; ave End Sub

例5-2输入字符串分别统计该字符串中每个数字字符(“0” ~“9”)出现的次数。 用num(0)来统计字符“0”的个数,用num(1)来统计字符“1”的个数,…, 用num(9)来统计字符“9”的个数,并显示最后的统计结果。程序运行结 果如图所示。 程序代码: Private Sub Command1_Click() Dim num%(0 To 9), i%, j%, a As String * 1 Picture1.Cls lg = Len(Text1.Text) For i = 1 To lg c = Mid(Text1, i, 1) If c >= "0" And c <= "9" Then j = Asc(c) - 48 num(j) = num(j) + 1 End If Next i For i = 0 To 9 If num(i) > 0 Then Picture1.Print """"; Chr$(i + 48); """"; "="; num(i); Next i End Sub

例5-3 使用Array函数建立并输出一个数组,然后将该数组的元素按从小到 大的原则进行排序,并输出排序结果。程序运行结果如图所示。
程序代码为: Option Base 1 Private Sub Form_Click() Dim b As Variant, n As Integer b = Array(17, 10, 45, 27, 60, _ 18, 79, 41, 59, 21) Print " 数组输出:" For i = 1 To 10 Print b(i); If i Mod 10 = 0 Then Print Next iPrint For i = 1 To 9 '开始排序 For j = 1 To 10 - i If b(j) > b(j + 1) Then t = b(j): b(j) = b(j + 1): b(j + 1) = t End If Next j Next i Print " 数组排序后输出:" For i = 1 To 10 Print b(i); Next i Print End Sub

5.2.3二维数组的声明和引用
1.静态二维数组的声明 声明格式:Dim数组名(下标1,下标2)[As类型] 说明: (1)每一维的下标说明格式:下界To上界。 (2)二维数组的元素个数=(上界1-下界1+1) ×(上界2-下界2+1)。 2.二维数组的赋值 (1)通过InputBox函数输入,此方法适合输入少量数据。 例如: Dim arr(5,6)As integer For i= 0 To 5 For j=0 To 6 s(i,j)=InputBox("输入第" & i & "行第" & j &"列的值") Next j Next i (2)通过文本框控件输入 对大批量的数据输入,采用文本框和函数split()\join()进行处理,效率更高。 3.二维数组元素的引用 引用二维数组元素的格式:数组名(下标1,下标2) 例如:Dim d(-1 To 5,6)As Long

例5-4用1~25的自然数生成1个5×5按自然排列的二维矩阵,并输出到 Picture1上;然后将该矩阵循环上移一行,第一行元素换到最后一行,结果 在Picture2上输出。程序运行界面如图所示。
程序代码:
For j = 1 To 5 Private Sub Command1_Click() a(5, j) = t(j) Dim a%(1 To 5, 1 To 5), t(1 To 5) As Integer Picture1.Print "生成的原始矩阵为:" & vbCrLf Next j For i = 1 To 5 For i = 1 To 5 For j = 1 To 5 For j = 1 To 5 Picture2.Print Tab(5 * (j - 1)); a(i, j); a(i, j) = 5 * (i - 1) + j Next j Picture1.Print Tab(5 * (j - 1)); a(i, j); Picture2.Print Next j Next i Picture1.Print End Sub Next i Picture2.Print "变换后的矩阵为:" & vbCrLf For j = 1 To 5 '保存第一行数据于数组t() t(j) = a(1, j) Next j

For i = 1 To 4 For j = 1 To 5 a(i, j) = a(i + 1, j) Next j Next i

5.2.4多维数组的声明和引用
我们把三维以上的数组统称为多维数组,在应用程序中,多维数组的使用 与二维数组非常相似。 1.静态多维数组的声明 声明格式: Dim数组名(下标1,下标2,……,下标n)[As类型] 2. 静态多维数组的引用 引用多维数组元素的格式: 数组名(下标1,下标2,……,下标n) 说明: (1)下标个数决定数组的维数,最多60维(即n≤60)。 (2)每一维的元素个数=上界-下界+1;数组的元素个数=每一维的元素个数的 乘积。

5.3.1动态数组的声明
声明动态数组通常分为两步:第一,使用Dim、语句声明一个没有下 标的数组,即括号内为空的数组,但是括号不能省略;第二,在过程中 使用ReDim语句指定该数组的大小,其作用是为数组分配实际存储空间。 Redim语句的格式: ReDim数组名(下标1[,下标2…])[As类型] 其中下标可以是常量,也可以是有了确定值的变量,类型可以省略, 若不省略,必须与Dim中的声明语句保持一致。 例如: Dim d()As Single Sub Form_Load() …… ReDim d(4,6) …… EndSub

例:5-5在文本框中输入矩阵的行列数n,根据文本框内输入矩阵的行列数n, 用1~n×n的自然数生成1个n×n矩阵(数组),并显示在图形框中, 并分 别能显示上、下三角矩阵。程序运行界面如图所示。
Option Base 1 Dim a%() Dim n% Private Sub Command1_Click() Dim i%, j% Picture1.Cls n = Val(Text1.Text) ReDim a(n, n) For i = 1 To n For j = 1 To n a(i, j) = (i - 1) * n + j Picture1.Print Tab(4 * j); a(i, j); Next j Picture1.Print Next i ReDim Preserve a(n, n) Command2.Enabled = True Command3.Enabled = True End Sub

Private Sub Form_Load() Command2.Enabled = False Command3.Enabled = False End Sub 以上为应用程序初始化及产生矩 阵的程序代码,变换为上三角及 下三角矩阵的程序代码见后页。

变换为上三角及下三角矩阵的程序代码:
Private Sub Command2_Click() Picture1.Cls For i = 1 To n For j = i To n a(i, j) = (i - 1) * n + j Picture1.Print Tab(4 * j); a(i, j); Next j Picture1.Print Next i End Sub Private Sub Command3_Click() Picture1.Cls For i = 1 To n For j = 1 To i a(i, j) = (i - 1) * n + j Picture1.Print Tab(4 * j); a(i, j); Next j Picture1.Print Next i End Sub

5.3.2与动态数组操作相关的函数
1.Array函数:给Variant类型的动态数组赋值,同时确定数组大小 使用格式:Array(参数列表) 说明: (1)用Array函数给动态数组赋值后,该数组被确定为一维数组,其下标下界由Option Base n语句决定,下标上界由参数个数决定。 (2)用Array函数也可给Variant类型的变量赋值,此时该变量也表示一个Variant类型的 动态数组。 例如:Dim a() As Variant ,b As Variant a=Array(1,”abc”,3) b=Array(5,6) a=Array(9,8,7,6):重新改变数组a的元素个数 ReDim Preserve a(2),b(1 To 5): 改变数组a、b的大小,并保留原来的数据。
2.Lbound()函数和Ubound()函数 Lbound()函数和Ubound()函数帮助用户确定数组每一维下标的变化范围,Lbound()函数返 回数组的下界,Ubound()函数返回数组上界。 使用格式:Lbound(数组名,n)和Ubound(数组名,n) 说明:n表示第几维,默认为1(第一维),即省略参数n时,默认数组为一维数组。 例如:输出动态一维数组a中的各元素 For i=Lbound (a) To Ubound(a) Print a(i) Next i

例5-4通过Array函数获得6整数存放于数组a中,在文本框输入一个数,将其 插入到数组中,使得数组中的各元素保持小到大的次序,并显示,然后删除数 组中负数元素并显示最后结果。程序运行结果如图所示。
应用程序初始化程序代码: Dim a() Private Sub Form_Load() a = Array(-3, -6, 2, 4, 8, 12) Print "原数组中的元素为:" For i = 0 To 5 Print a(i); Next i Print End Sub

插入及删除元素的程序代码:
Private Sub Command1_Click() Dim i%, j%, x% x = Val(Text1.Text) For i = 0 To UBound(a) If x <= a(i) Then Exit For Next i ReDim Preserve a(UBound(a) + 1) For j = UBound(a) To i Step -1 a(j) = a(j - 1) Next j a(i) = x Print "插入元素后的数组为:" For i = 0 To UBound(a) Print a(i); Next i Print End Sub Private Sub Command2_Click() i=0 Do While (i <= UBound(a)) If a(i) < 0 Then If i < UBound(a) Then For j = i To UBound(a) - 1 a(j) = a(j + 1) Next j End If ReDim Preserve a(UBound(a) - 1) n=n-1 Else i=i+1 End If Loop Print "删除负数后数组为:" For i = 0 To UBound(a) Print a(i); Next i End Sub

5.4控件数组
5.4.1控件数组的概念 控件数组是一组相同类型的控件,共用同一个控件名,共享同样的事件过程,完成相似的 操作,每个控件都有一个唯一的下标,即Index属性,第一个元素的下标为0。控件数组 适用于若干个控件执行的操作相似的场合。
5.4.2控件数组的建立 建立控件数组有两种基本方法: 1.在设计阶段静态创建 基本步骤: (1)在窗体上创建控件数组中的第一个控件,并设置好控件名等相关属性。 (2)选择该控件,执行 “复制”命令。 (3)根据需要执行若干次 “粘贴”命令。 (4)进行事件过程的编程。 2.在运行阶段动态添加 (1)在窗体上创建控件数组中的第一个控件,设置好控件名等相关属性后,设置其Index属性 值为0,表示这是一个控件数组。 (2)在代码中使用Load语句和Unload语句进行控件元素的添加和删除 使用格式:Load控件数组名(下标) Unload控件数组名(下标)。 (3)设置新添加控件的相关属性,可通过Left属性和Top属性确定其位置,并将Visible属性设 置为True。 5.4.3控件数组的引用 控件数组元素的引用格式:控件数组名(Index)

例5-6:建立含有3个命令按钮的控件数组,当单击某个命令按钮时,分别 执行不同的操作。程序运行结果如图所示: 解:(1)在窗体上建立一个命令按钮,其Name属性设置为Comtest,复 制两个命令按钮 (2)把3个命令按钮的Caption属性依次设置为“命令按钮1”,“命令 按钮2”和“退出” (3)双击任一命令按钮,打开代码编辑窗口,键入如下事件过程: Private Sub comtest_Click(Index As Integer) FontSize=12 If Index=0 Then Print “单击第一个命令按钮” ElseIf Index=1 Then Print “单击第二个命令按钮” Else End End If End Sub

5.6自定义数据类型
1.自定义数据类型的定义 自定义数据类型是指由若干标准数据类型组成的一种复合类型,也称为记录类型。 定义格式: Type自定义类型名 元素名[(下标)]As类型名 …… 元素名[(下标)]As类型名 EndType
元素名:表示自定义类型中的一个成员 下标(可选):表示是数组 类型名:为标准类型 例如:定义一个病人信息的自定义类型: Type patient no As Integer'定义病人医疗卡号 name As String*15 '定义姓名 ex As String*2 '定义病人性别 age As Integer '定义年龄 section As String*10 ‘定义挂号门诊科室 End Type

2.自定义类型变量的声明和使用 声明形式:Dim 变量名 As 自定义类型名 例如:Dim patient1 As patient,patient2 As patient 自定义类型中元素的表示方法是:变量名.元素名 例如:patient1.age 当引用该自定义型中的多个元素时,为了简单起见,可以用With……End With语句进行简化。 例如:With patient2 .no=20063102 .name="张三" .sex="男" .age =45 .section="消化内科" End With 同一自定义类型的变量之间可以直接赋值,例如:patient1=patient2 3.自定义类型数组的使用 自定义类型数组就是数组中的每个元素都是自定义类型。 例如:自定义一个由病人医疗卡号、姓名、年龄、组成的病人记录类型,用来存放50个病人的 记录。 Type patientType no As Integer'定义病人医疗卡号 name As String*15'定义姓名 age As Integer'定义年龄 End Type Dim pat(1 to 50) As patientType

第6章 过 程

6.1过程概述
6.1.1过程的概念 将程序分割成较小的逻辑部件(即小的程序代码块)就可以简化程序设计任务。我们称这 些部件为过程,它们可以变成增强和扩展 Visual Basic 的构件。

6.1.2过程的优点 1.消除了重复语句行。你可以只定义一次过程,而在程序任意多次执行这一过程。 2.使程序更易阅读。由一系列小程序段组成的程序比大段、大段的程序更容易理解和区分。 3.简化了程序开发。把程序分成一些合乎逻辑的单位更易于设计、编写和调试。 4.其它程序可重复使用该通用过程。你可以轻易地将标准模块过程纳入其它编程项目中。 5.扩展Visual Basic语言。过程往往能够完成单个Visual Basic关键字无法完成的任务。 6.1.3过程的分类 子过程(Sub 过程):不需要返回值。事件过程或其它过程可按名称调用子过程。子过程能够 接收参数,并可用于完成过程中的任务并返回一些数值。但是,与函数过程不同,子 过程不返回与其特定子过程名相关联的值(尽管它们能够通过变量名返回数值)。子 过程一般用于接收或处理输入数据、显示输出或者设置属性。 函数过程(Function 过程):需要返回值。事件过程或其它过程可按名称调用函数过程。函数 过程能够接收参数,并且总是以该函数名返回一个值。这类过程一般用于完成计算任 务。 属性过程(property 过程):返回并指定值,以及设置对象引用。属性过程用来创建和操作程 序中用户定义的属性。这是一种有用的、或者说在某种程度上相当高级的特性,它使 你能够定制现有的Visual Basic控件并通过创建新的对象、属性和方法来扩展Visual Basic语言。

6.2函数过程
6.2.1函数过程的定义 利用“工具”菜单下的“添加过 程”来定义。 步骤如下: 在“工具”菜单中选择“添加 过程”命令,打开“添加过程”对 话框,如图在“名称”框中输入函 数过程名,在“类型”选项组中选 “函数”,定义函数过程,在“范 围” 选项组中选“公有的”,定义 一个公有的全局过程(选“私有的” 可以定义一个模块/窗体级的局部过 程)。

例6-1编写一个函数,实现一个10进制整数转换成为2到16任意进制整数的功能。 界面如图。

函数过程定义如下:
Function TranDec$(ByVal m%, ByVal r%) Dim StrDtoR$ Dim iB%, mr% StrDtoR = "" Do While m <> 0 mr = m Mod r m=m\r If mr >= 10 Then StrDtoR = Chr(mr - 10 + 65) & StrDtoR '余数>=10 转换为A~F,最先求出的余 数位数最低 Else StrDtoR = mr & StrDtoR '余数<10 直接连接,最先求出的余数位数最低 End If Loop TranDec = StrDtoR End Function

6.3子过程
6.3.1子过程的定义: 方法与函数过程定义基本相同,只是在“类型”选项组中选“子过程”,其余步 骤相同。 例6-2编写一个子过程del(s1,s2),将字符串s1中出现s2子字符串删去,结果还是 存放在s1中。 例如:s1=”123456789abc”,s2=”abc” 结果:s1=”123456789”

子过程定义如下:
Private Sub del(s1 As String, ByVal s2 As String) Dim i% i = InStr(s1, s2) ls2 = Len(s2) Do While i > 0 ls1 = Len(s1) s1 = Left(s1, i - 1) + Mid(s1, i + ls2) i = InStr(s1, s2) Loop End Sub

6.3.2通用过程 通用过程告诉应用程序如何完成一项指定的任务。一旦确定了通用过程,就必须专由 应用程序来调用。反之,直到为响应用户引发的事件或系统引发的事件而调用事件过程时, 事件过程通常总是处于空闲状态。 程序运行时,标准事件过程中的代码调用通用过程,通用过程运行自身的代码,然后 将控制返回到 调用它的标准事件过程。
6.3.3事件过程 当Visual Basic中的对象对一个事件的发生作出认定时,便自动用相应于事件的名字调 用该事件的过程。因为名字在对象和代码之间建立了联系,所以说事件过程是附加在窗体 和控件上的。 1.一个控件的事件过程将控件的(在 Name 属性中规定的)实际名字、下划线 (_) 和事件名 组合起来。例如,如果希望在单击了一个名为cmdPlay 的命令按钮之后,这个按钮会调用 事件过程,则要使用cmdPlay_Click 过程。 2.一个窗体事件过程将词汇 “Form”、下划线和事件名组合起来。如果希望在单击窗体之后, 窗体会调用事件过程,则要使用 Form_Click 过程。(和控件一样,窗体也有唯一的名字, 但不能在事件过程的名字中使用这些名字。)如果正在使用 MDI 窗体,则事件过程将词汇 “ MDIForm” 、下划线和事件名组合起来,如 MDIForm_Load。

所有的事件过程使用相同的语法。 虽然可以自己编写事件过程,但使用 Visual Basic 提供的代码过程会更方便,这个过程自 动将正确的过程名包括进来。从“对象框”中选择一个对象,从“过程框”中选择一个过 程,就可在“代码编辑器” 窗口选择一个模板。 在开始为控件编写事件过程之前先设置控件的 Name 属性,这不失为一个好主意。如果对 控件附加一个过程之后又更改控件的名字,那么也必须更改过程的名字,以符合控件的新 名字。否则,Visual Basic 无法使控件和过程相符。过程名与控件名不符时,过程就成为通 用过程。

6.4过程的调用 6.4.1调用子过程
调用 Sub 过程有两种方法: 以下两个语句都调用了名为 MyProc 的 Sub 过程。 Call MyProc (FirstArgument, SecondArgument) MyProc FirstArgument, SecondArgument 当使用 Call 语法时,参数必须在括号内。若省略 Call 关键字,则也必须 省略参数两边的括号。 例6-3在例6-2的基础上,增加对子过程的调用,使程序完整。 Private Sub Command1_Click() Dim ss1 As String ss1 = Text1.Text Call del(ss1, Text2.Text) ?调用子过程 Text3.Text = ss1 End Sub

例6-4编写一个程序。一行文字“大家新年好”在窗体中左右移动。移动方式有2种: 单击手动按钮,移动50twip单位;单击自动按钮,按时钟按钮触发频率连续移动, 并且显示的文字黑白闪烁;当超出窗体范围时,进行反弹。
程序代码: Dim step1 As Integer Private Sub Form_Load() step1 = 1 Timer1.Interval = 0 End Sub Private Sub Command2_Click() '手动 Timer1.Interval = 0 Call MyMove ‘子过程的调用 End Sub Private Sub Command1_Click() '自动 Timer1.Interval = 200 End Sub Private Sub Timer1_Timer() Static Flag As Boolean If Flag Then Label1.ForeColor = &HFFFFFF Else Label1.ForeColor = &H0& Flag = Not Flag Call MyMove ‘子过程的调用 End Sub Public Sub MyMove() ‘子过程的定义 Label1.Move Label1.Left + 50 * step1 If Label1.Left > Form1.Width Then step1 = -1 ElseIf Label1.Left < 0 Then step1 = 1 End If End Sub

6.4.2调用函数过程
通常,调用自行编写的函数过程的方法和调用 Visual Basic 内部函 数过程(例如 Abs)的方法一样;即在表达式中写上它的名字。 下面的语句都调用函数 ToDec。 Print 10 * ToDec X = ToDec If ToDec = 10 Then Debug.Print "Out of Range" X = AnotherFunction ( 10 * ToDec) 就像调用 Sub 过程那样,也能调用函数。下面的语句都调用同一个 函数: Call Year (Now) Year Now 当用这种方法调用函数时,Visual Basic 放弃返回值。

例6-5在例6-1的基础上,增加对子过程的调用,使程序完整。 程序代码如下: Private Sub Command1_click() Dim m0%, r0%, i% m0 = Val(Text1.Text) r0 = Val(Text2.Text) If r0 < 2 Or r0 > 16 Then I = MsgBox("输入的R进制数超出范围", vbRetryCancel) If i = vbRetry Then Text2.Text = "" Text2.SetFocus Else End End If End If Label3.Caption = "转换成" & r0 & "进制数" Text3.Text = TranDec(m0, r0) ?调用函数过程 End Sub

例6-6编写一个函数过程,求一组数组中的最小值。 主调程序随机产生10个100-200之间的整数,调用函数过程,显示最小值,运行结 果如图所示。 程序代码:
Private Sub Form_Click() Print Dim a(1 To 10), amin, i% For i = 1 To 10 a(i) = Int(Rnd * 101 + 100) Print a(i); Next i Print Print "min="; s(a(), amin) ?函数过程的调用 End Sub Function s(b(), min) ?定义函数过程 Dim i% min = b(LBound(b)) For i = LBound(b) + 1 To UBound(b) If b(i) < min Then min = b(i) Next i s = min End Function

6.4.3调用其它模块中的过程 在工程中的任何地方都能调用其它模块中的公用过程。可能需要指定这样的模块,它包含 正在调用的过程。调用其它模块中的过程的各种技巧,取决于该过程是在窗体模块中、类模块 中还是标准模块中。 一.窗体中的过程 所有窗体模块的外部调用必须指向包含此过程的窗体模块。如果在窗体模块 Form1 中包 含 SomeSub 过程,则可使用下面的语句调用 Form1 中的过程: Call Form1.SomeSub(arguments) 二.类模块中的过程 与窗体中调用过程类似,在类模块中调用过程要调用与过程一致并且指向类实例的变量。 但是不同于窗体的是,在引用一个类的实例时,不能用类名作限定符。必须首先声明类的 实例为对象变量,并用变量名引用它。 三.标准模块中的过程 如果过程名是唯一的,则不必在调用时加模块名。无论是在模块内,还是在模块外调用, 结果总会引用这个唯一过程。如果过程仅出现在一个地方,这个过程就是唯一的。 如果两个以上的模块都包含同名的过程,那就有必要用模块名来限定了。在同一模块内调用一 个公共过程就会运行该模块内的过程。例如,对于Module1 和 Module2 中名为 CommonName 的过程,从 Module2 中调用CommonName 则运行 Module2 中的 CommonName过程,而不是 Module1中的 CommonName 过程。 从其它模块调用公共过程名时必须指定那个模块。例如,若在 Module1 中调用 Module2 中的 CommonName 过程,要用下面的语句: Module2.CommonName (arguments)

6.5传递参数
向过程传递参数,过程中的代码通常需要某些关于程序状态的信息才能完成它 的工作。信息包括在调用过程时传递到过程内的变量。当将变量传递到过程时, 称变量为参数。 传递给过程的参数有两种传递方式:传地址和传值。当变量通过地址传递时 (缺省),对变量的任何修改都被传递回调用过程。传址具有显著的优势,只是 一定注意不要在过程中无意地修改变量。
6.5.1参数的数据类型 过程的参数被缺省为具有 Variant 数据类型。不过,也可以声明参数为其它数 据类型。例如,下面的函数接受一个字符串和一个整数: ‘根据星期几和时间,返回午餐菜单。 Function WhatsForLunch(WeekDay As String, Hour _As Integer) As String If WeekDay = "周一" then WhatsForLunch = "中饭吃鱼" Else WhatsForLunch = "中饭吃肉" End If If Hour > 4 Then WhatsForLunch = "定单时间太晚,无法完成" End Function

6.5.2按值传递参数 按值传递参数时,传递的只是变量的副本。如果过程改变了这个值,则所作变 动只影响副本而不会影响变量本身。用 ByVal 关键字指出参数是按值来传递的。 例6-7:以下是一个药品价格计算的子过程,子过程名为OldToNew,参数old为原 来药品价格,参数New为新的药品价格。 Sub OldToNew(old,neww) old = old * 1.05 '药品价格上涨5% neww = Int(old) '取整以后得到新的药品价格 End Sub ··· ·· Private Sub Form_Load() price = 100 new1 = 0 OldToNew price , new1 Print “原来价格为:”; price; "药品价格上涨5%后,价格为:"; new1 End Sub

因为old是传址变量,对old的修改自动地造成了对price的相同修改 。

将参数传递语句修改为: Sub OldToNew(ByVal old,neww) 当使用ByVal声明old 参数时,程序就会产生如图所示的正确结果:

6.5.3按地址传递参数 按地址传递参数使过程用变量的内存地址去访问实际变量的内容。结果,将变量传递给 过程时,通过过程可永远改变变量值。按地址传递参数在Visual Basic 中是缺省的。 如果给按地址传递参数指定数据类型,就必须将这种类型的值传给参数。可以给参数传 递一个表达式,而不是数据类型。Visual Basic计算表达式,如果可能的话,还会按要求的 类型将值传递给参数。 把变量转换成表达式的最简单的方法就是把它放在括号内。 例6-8为了把声明为整数的变量传递给过程,该过程以字符串为参数,则可以用下面的语句: 本程序运行结果如图所示: Sub CallingProcedure () Dim intX As Integer intX = 12 * 3 ‘需要传递的参数是个表达式,在这里把表达式转换成变量 Foo (intX) ‘再传递给Foo过程 End Sub Sub Foo (Bar As String) MsgBox Bar 'Bar 的值为字符串‘ 36 ?。 End Sub Private Sub Form_Click() CallingProcedure End Sub

例6-9下面两段示例代码假定有一个窗体,其内有一命令按钮和一列表框。

这段代码没有提供可选参数:
Dim strName As String Dim strAddress As String Sub ListText(x As String, yAs String) List1.AddItem x List1.AddItem y End Sub Private Sub Command1_Click () strName = “yourname” Call ListText (strName) End Sub 结果如图6-12所示,出现错误信息:

‘设置了2个参数

'只提供了1个参数。 ‘调用时也只使用1个参数

而下面的代码并未提供全部可选参数:

Dim strName As String Dim varAddress As Variant Sub ListText (x As String, Optional y As Variant) ‘设置了1个可选参数 List1.AddItem x If Not IsMissing (y) Then List1.AddItem y End If End Sub Private Sub Command1_Click () strName = “yourname” '未提供第1个参数 Call ListText (strName) ‘调用时只使用了第1个参数 End Sub
通过设置可选参数后,程序运行正常,如图所示:

6.5.5提供可选参数的缺省值 也可以给可选参数指定缺省值。在下例中,如果未将可选参数传递到函数过程, 则返回一个缺省值。 ‘设置可选参数的缺省值为12345 Sub ListText(x As String, Optional y As Integer = 12345) List1.AddItem x List1.AddItem y End Sub Private Sub Command1_Click () strName = "yourname" '未提供第二个参数。 Call ListText (strName) '调用时只使用了第1个参数 End Sub 程序运行中, 子过程自动调用了 第2个参数的缺省值, 所以结果如图所示:

6.5.6用命名的参数创建简单语句 对许多内建函数、语句和方法,Visual Basic 提供了命名参数方法 来快捷传递参数值。对命名参数,通过给命名参数赋值,就可按任意次 序提供任意多参数。为此,键入命名参数,其后为冒号、等号和值 (MyArgument :="SomeValue") ,可以按任意次序安排这些赋值,它们之 间用逗号分开。注意,下例中的参数顺序和所要参数的顺序相反:

Function ListText (strName As String, Optional strAddress As String) List1.AddItem strName List2.AddItem strAddress End Sub Private Sub Command1_Click () ListText strAddress:="12345", strName:="Your Name" End Sub 如果过程有若干不必总要指定的可选参数,则上述内容更为有用。

6.6过程的嵌套
VB的过程定义都是平行的关系,或者说是相对独立的存在,这在前几节的学 习中我们应该可以感受的到:定义一个过程的时候,一个过程内部不能再定义另 外一个过程。这里我们所说的过程嵌套,应该是过程的嵌套调用。 6.6.1过程的嵌套调用 在过程的调用中,可以使用嵌套调用。由于VB采用面向对象的程序设计技术, 采用事件驱动的编程机制,所以程序的执行大多从事件过程开始。比如:在事件 过程的执行过程中需要调用过程一,则系统此时会立刻去执行过程一,若在过程 一的执行过程中中需要调用过程二,则系统此时会立刻去执行过程二(若在过程 二的执行过程中中需要调用过程三的话依次类推),直到过程二执行完毕,系统 将回到过程一执行调用过程二语句下面的语句,过程一执行完毕,系统将回到事 件过程执行调用过程一语句下面的语句。一般来说,过程一和过程二,可以是子 过程,也可以是函数过程。过程嵌套调用的执行原理如图所示(其中带圆圈的数 值为执行步骤):
事件过程 · · · Call 过程一 · · ·
⑧ ①



Sub 过程一 · · · Call 过程二(y) · · ·

③ ④ ⑥ ⑦

Sub 过程二(n) · · · · · · · · · End Sub



End Sub



End Sub

例6-10:在标准事件过程(Command1_Click())中调用数组数据交换事件 过程(cha):将包含十个元素(元素值分别为1~10的数组)的数组的前5 个元素与后五个元素的值进行交换;在cha的执行过程中再次调用打印事件 过程(print1)将交换好的数组给予输出。
编写标准事件过程代码如下: 编写cha过程代码如下:

Private Sub Command1_Click() Dim a(10) As Integer, i% ?定义数组 For i = 1 To 10 ?给数组赋值 a(i) = i Next i cha a() ?调用交换数组元素值的事件 Print "The sub Command1_Click() is End." End Sub
编写print1过程代码如下: Private Sub print1(c() As Integer) For i = 1 To 10 Print c(i); " "; Next i End Sub

Public Sub cha(b() As Integer) Dim i%, t% For i = 1 To 5 ?交换数组值 t = b(i): b(i) = b(i + 5): b(i + 5) = t Next i print1 b() ?调用输出过程 Print "The sub cha is End." End Sub
本程序运行结果如图所示:

6.6.1过程的递归调用 如果过程在执行的过程中调用自己,这种调用就称为过程的递归调用。其中直 接调用自己成为直接递归调用,间接调用自己的称为调用方式间接递归调用。 直接递归调用形如: Private Sub fun1() ... fun1() ... End sub 间接递归调用形如: Private Sub fun1() ... fun2() ... End Sub Private Sub fun2() ... fun1() ... End Sub 在这里我们主要向大家介绍直接递归调用。

阶层问题:Fact(n) =n! ,可以定义为:
n ?1 ?1 fac ( n ) ? ? n ?1 ? n * fac ( n ? 1 )

以n=4为例:可编写下面的程序段:

Function fac(n As Integer) As Integer If n = 1 Then fac = 1 Else fac = n * fac(n - 1) End If End Function
Sub Command1_Click() Print “fac(4)=”;fac(4) End Sub 程序的运行结果为: fac(4)=24

在此要实现当前层调用下一层时的参数传递,并取得下一层所返回 的结果,并向上一层调用返回当前层的结果。至于各层调用中现场的保 存与恢复,均由程序自动实现,不需要人工干预。 要实现递归运算应符合两个条件: (1)可以把一个问题转化为一个新问题,而新问题的解决方法仍与原 问题解法相同,只是处理的对象有所不同,但它们应是有规律可循的。 如上面的阶乘问题,当n>1时,n!问题可转化成(n-1)!的问题,而(n-1)!的 问题又可转化为(n-2)!的问题,它们之间的转化规律为j!=j(j-1)!(1<j<n)。 这个过程称为递推。 (2)必须要有一个明确的结束条件,(如当n=1时n!=1) 在此称为递归终 止条件,不然的话,递归将无休止地进行下去。当n=1时得到递归终止 条件:1!=1,则按照递推公式我们就可以求得2!,如此回推,直到求得 n!的值,这个过程称为回归。 因此递归实际上就是递推与回归的结合。
递推
递归终止条件 fac (4)=4*fac(3) fac (4)=4*6 fac (3)=3*fac(2) fac (3)=3*2 fac (2)=2*fac(1) fac (2)=2*1 fac (1)=1

回归

第七章 常用控件

7.1复选框和单选按钮
单选按钮(Option Button)由? 和说明性文本组成。单选按钮必须成组出现,用户在 一组按钮中必须并且最多只能选择一项。当某一项被选定后,?中出现出现一个黑点。 复选框(CheckBox)由?和说明性文本组成。列表框列出可供用户选择的选项,用户 根据需要选其中的一项或多项。被选中项的变成?。 7.1.1.重要属性 (1)Caption 属性 单选按钮 设置单选按钮或复选框边上的文本标题。 (2)Alignment 属性 0:控件在左边,标题在右边,默认设置。 1:控件在右边,标题在左边。 (3)Value 属性 单选按钮的值有2个: True:单选按钮被选中。 False:单选按钮未被选中,默认设置。 复选框的属性值有3个: 复选框 0:Unchecked 复选框未被选中,默认设置。 1:Check 复选框被选中。 2:Grayed 复选框变灰色,禁止用户选择。 (4)Style属性 指定控件的显示方式,用于改善视觉效果。 0:Standard 标准方式。 1:Graphical 图形方式,可以通过Picture属性添加图形,外观类似命令按钮。 7.1.2事件 单选按钮和复选框都能接受Click事件。当用户单击单选按钮或复选框时,它们会自动改变 状态。

例7-1通过单选按钮和复选框设置文本框的字体。界面如图所示。
【程序代码】 Private Sub Check1_Click() Text1.Font.Bold = Not Text1.Font.Bold End Sub Private Sub Check2_Click() Text1.Font.Italic = Not Text1.Font.Italic End Sub Private Sub Check3_Click() Text1.Font.StrikeThrough = Not Text1.Font.Strikethrough End Sub Private Sub Check4_Click() Text1.Font.Underline = Not Text1.Font.Underline End Sub Private Sub Option1_Click() Text1.Font.Name = "宋体" End Sub Private Sub Option2_Click() Text1.Font.Name = "黑体" End Sub

7.2 框架
如果想把窗体上的控件分组,使用框架是一个常用的选择, 框架是VB向程序员提供的少数可以作为容器的控件之一。
框架

7.2.1重要属性 Caption属性 框架上的标题。如果该属性为空字符,则框架为封闭的矩 形框,但是框架中的控件仍然和单纯用矩形框框起来的控件不 同。 Enabled属性 框架内的所有控件将随框架一起移动、显示、消失和屏蔽。 当框架的Enabled属性设为False时,程序运行时该框架在窗体 中的标题为灰色,表示框架内所有控件均被屏蔽,用户无法对 其进行操作。 Visible属性 若框架的Visible属性为False,则在程序执行期间,框架及 其所有的控件被隐藏起来。

7.2.2事件 框架可以响应Click和DbClick事件,但是,在应用程序中一般不 需要编写有关框架的事件过程。

例7-2 框架用法示例:在图中所示的窗体中建立了两组单选按钮,单击确 定后文本框中显示所选内容。
【程序代码】 Private Sub Command1_Click() Dim sex$, fee$ Picture1.Cls sex = IIF(Option1.Value, "男", "女") fee = IIF(Option3.Value, "自费", "医保") Picture1.Print "患者性别:" + sex Picture1.Print "付费方式:" + fee End Sub Private Sub Command2_Click() End End Sub

?利用图形框显示单选按钮的文本

Private Sub Form_Load() Option1.Value = True Option3.Value = True End Sub

7.3 列表框和组合框
列表框(ListBox)通过显示多个选项供用户 选择,达到与用户对话的目的。如果有较多的选项 而不能一次全部显示时,VB会自动加上滚动条。 列表框的最主要的特点是用户只能从其中选择而不 能直接修改选项内容。
组合框(ComboBox)是组合了文本框和列表 框的特性而形成的一种控件。组合框在列表框中列 出可供用户选择的选项,当用户选定某项后,该项 内容自动装入文本框中。组合框有三种组合风格, 即下拉式组合框、简单组合框和下拉式列表框,由 其Style属性值决定,他们的Style属性值分别为0, 1,2。 当列表框中没有所需选项时,除了下拉式列表 框(Style 属性为2)之外都允许在文本框中输入内 容,但输入的内容不能自动添加到列表框中,需要 编写程序实现。
列表框

组合框

7.3.1列表框和组合框共有的重要属性 ①List 属性 该属性是一个字符型数组,存放列表框或组合框的选项内容。数组的 下标是从0开始的,即第一个项目的下标是0。例如上例中List1.List(0) 的值是“生理学”,List1.List(2)的值是“药理学”。List属性可以 在设计状态设置也可以在程序中设置或引用。 ②ListIndex 属性 该属性是整型,表示程序运行时被选定的选项的序号。例如,如果选 定“中药学”,则该属性值为3。如果没有选任何选项则该属性值为- 1。该属性只能在程序中设置或引用。 ③ListCount 属性 该属性值类型为整型,表示列表框或组合框中项目的数量。 ListCount-1表示最后一项的序号。该属性只能在程序中设置或引用。 ④Sorted 属性 该属性值类型为逻辑型,决定在程序运行期间列表框或组合框的选项 是否按字母顺序排列显示。如果Sorted值为True则项目按字母顺序排 列显示,如果为False,则选项按加入的先后顺序排列显示。该属性只 能在程序中设置或引用。 ⑤Text 属性 该属型值类型为字符型,表示被选定的选项的文本内容。如上例中, “生理学”被选定,因此List1.Text的值为“生理学”。Text属性为默 认属性,只能在程序中设置或引用。

7.3.2列表框特有的重要属性
①MultiSelect 属性 0—None :默认值,禁止多项选择,表示在一个列表框中只能选择一项。 1—Simple:简单多项选择。鼠标单击或按空格键表示选定或取消选定一个选项。 2—Extended:扩展多现选择。按住Ctrl键,同时用鼠标单击或按空格键表示选定或取消选 定一个选择项;按住Shift将同时单击鼠标,或者按住Shift键并且移动光标键,就可以从 前一个选定的项扩展选择到当前选择项,即选定多个连续项。 ②Selected属性 该属性是一个逻辑型数组,其元素对应列表框中相应的项,表示对应的项在程序运行期间 是否被选中。例如,List1.Selected(0)=True 表示第一项被选中,否则表示未被选中。 该属性只能在程序中设置或引用。

7.3.3组合框特有的主要属性
Style 属性 Style 属性决定组合框的类型和行为,它的值为0,1或2。 Style属性值为0时,组合框为下拉式组合框,屏幕显示文本编辑框和一个下拉箭头按钮。执 行时,文本编辑框可以接受用户键盘输入,也可以用鼠标单击下拉箭头按扭,打开列表 框供用户选择,选择的内容显示在文本框中。 Style属性值为1时,组合框为简单组合框,屏幕显示文本编辑框和列表框,列表框列出所有 选项供用户选择。执行时,文本编辑框可以接受用户键盘输入,也可以显示用户选择的 列表框中的选项的内容。 Style属性值为2时,组合框为下拉式列表框,屏幕显示文本框和一个下拉箭头按钮。执行时, 文本框不接受用户键盘输入,当用户用鼠标单击下拉箭头按扭,打开列表框供用户选择, 选择的内容显示在文本框中。

7.3.4方法
列表框和组合框中的选项可以简单地在设计状态通过List 属性设置,也可以在程序中用 AddItem放法来添加,用RemoveItem 或 Clear 方法删除。 (1)AddItem 方法 AddItem 方法把一个选项加入列表框或组合框。形式如下: 对象. AddItem Item [,Index] 其中: 对象:可以是列表框或组合框。 Item:字符串表达式,即是要加入的选项。 Index:指定新添加的选项在列表框或组合框中的位置。 (2)RemoveItem方法 RemoveItem方法把列表框或组合框中的某一项删除。形式如下: 对象. RemoveItem Index 其中: 对象:可以是列表框或组合框。 Index:被删除项目在列表框或组合框中的位置,对于第一项,Index为0。 (3)Clear方法 Clear方法可以清除列表框或组合框的所有内容。其形式如下: 对象.Clear

7.3.5事件
列表框能够响应Click 和DblClick事件。所有类型的组合框都能响应Click事件,但是只有 简单组合框(Style属性为1)才能接收DblClick事件。一般情况下不需要编写Click事件过程, 因为通常是在用户按下命令按钮或发生DblClick事件时才需要读取Text属性。

例7-3 编写一个医生处方应用程序。允许用户添加新的药物或剂量并添加到 组合框中。运行界面如图
【主要的程序代码】 Private Sub Form_Load() Combo1.AddItem "麻黄" Combo1.AddItem "桂枝" Combo1.AddItem "杏仁" Combo1.AddItem "甘草" Combo1.AddItem "金银花" Combo1.AddItem "大黄" Combo1.AddItem "茯苓" Combo1.AddItem "金钱草" Combo1.AddItem "陈皮" Combo1.AddItem "大枣" Combo1.Text = Combo1.List(0) Combo2.Text = Combo2.List(0) Command1.Picture = LoadPicture("explorer12.ICO") Command2.Picture = LoadPicture("explorer11.ICO") End Sub Private Sub Combo1_LostFocus() Dim Flag As Boolean, I As Integer Flag = False For i = 0 To Combo1.ListCount – 1 IF Combo1.List(i) = Combo1.Text Then Flag = True Exit For End IF Next I IF Flag = False Then Combo1.AddItem Combo1.Text End Sub

Private Sub Command1_Click() List1.AddItem Combo1.Text & Combo2.Text End Sub
Private Sub Command2_Click() List1.RemoveItem List1.ListIndex End Sub

7.4时钟控件
时钟控件(Timer)可以实现有规律地以一定 的时间间隔激发计时器事件(Timer)而执行相应 的程序代码。 7.4.1重要属性 时钟控件有一个非常重要的属性Interval,该 属性决定每隔多少时间激发计时器事件,单位是 毫秒(ms),取值介于0~64767之间。当interval 属性值为0时,表示屏蔽计时器。 7.4.2事件 时钟控件只有一个事件,即Timer事件。

时钟

例7-4 设计一个如图所示的定时交替显示手术前后的图片对比程序。(时钟 控件的Interval=1000), 用标签说明图片。
【程序代码】 Dim i As Boolean Private Sub Form_Load() Timer1.Enabled = True Timer1.Interval = 1000 Picture1.AutoSize = True End Sub

?使图像框自动随加载图像的大小而自动改变大小

Private Sub Timer1_Timer() IFI= True Then ?利用控制变量I来决定加载哪个图片 Picture1.Picture = LoadPicture("手术前.jpg") Label1 = "手术前" Else Picture1.Picture = LoadPicture("手术后.jpg") Label1 = "手术后" End IF I= Not I ?利用控制变量的状态改变使图片交替 End Sub

7.5滚动条
滚动条(ScrollBar)控件通常用来附在窗体 上协助观察数据或确定位置,也可以作为数 据输入的工具。 滚动条有水平和垂直两种,如图所示。 7.5.1重要属性 Max 属性: 该属性表示当滑块处于最大位置时所代表的值(-32767~32767)。 Min属性: 该属性表示当滑块处于最小位置时所代表的值(-32767~32767)。 SmallChange 属性: 该属性表示用户单击滚动条两端箭头时,滑块移动的增量值。 LargeChange 属性: 该属性表示用户单击滚动条的空白处滑块移动的增量值。 Value 属性: 该属性表示滑块所处位置所代表的值。 7.5.2事件 滚动条有两个重要的事件是Scroll 和Chang。用户拖动滑块时触发Scoll事 件,而当Value值改变时会触发Chang事件。

例7-5利用垂直滚动条和水平滚动条控制图像显示大小。通过标签观察显示结果。 (设置滚动条的Min属性为1,Max属性为7,SmallChange属性为1, LargeChange属性为2)见图。 【程序代码】 Dim Width1, Height1 Private Sub Form_Load() Width1 = Image1.Width Height1 = Image1.Height Label1.Caption = "显示尺寸" End Sub Private Sub HScroll1_Change() Image1.Width = HScroll1.Value * Width1 Label1.Caption = HScroll1.Value & " * " & VScroll1.Value End Sub Private Sub VScroll1_Change() Image1.Height = VScroll1.Value * Height1 Label1.Caption = HScroll1.Value & " * " & VScroll1.Value End Sub

7.6鼠标器事件
所谓鼠标器事件是由用户操作鼠标而引发的能被VB中的各种对象识别的事件,除了Click 事件和DblClick事件外,重要的鼠标事件还有下列三个: MouseDown事件:按下任意一个鼠标按钮时触发。 MouseUp事件:释放任意一个鼠标按钮时触发。 MouseMove 事件:在移动鼠标时被触发。 设计时需要特别注意这些事件被什么对象识别,当鼠标指针位于某个控件上时,触发控件 的鼠标事件,当鼠标指针位于窗体上没有控件的空白区域时,触发窗体的鼠标事件。 窗体的鼠标事件: Sub Form_MouseDown ( Button As Integer,Shift As Integer,X As Integer,Y As Integer ) Sub Form_MouseUp ( Button As Integer,Shift As Integer,X As Integer,Y As Integer ) Sub Form_MouseMove ( Button As Integer,Shift As Integer,X As Integer,Y As Integer ) 其中: Button 参数指示用户按下或释放了哪个鼠标按钮,在Button的二进制位中,b0=1表示用 户按下或释放鼠标的左键;b1=1表示操作了鼠标的右键;b2=1表示表示用户操作了鼠标的 中键。例如当Button=2时表示用户按下或释放了鼠标的右键。 用户也可以使用下面的VB符号常数来检测鼠标的状态。例如,Button=2可以改写为: Button=VBRightButton。 1=VBLeftButton :用户单击鼠标左键触发了鼠标事件; 2=VBRightButton:用户单击鼠标右键触发了鼠标事件; 4=VBMiddleButton:用户单击鼠标中键触发了鼠标事件。 Shift 参数指示用户按下Shift键、Ctrl键和Alt键的情况。Shift参数的值为b0+b1+b2的值。 在Shift的二进制中,b0=1表示Shift键被按下;b1=1表示Ctrl键被按下;b2=1表示Alt键被按 下。

例7-6显示鼠标器指针的位置。运行界面如图所示

程序代码为:

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, _ X As Single, Y As Single) Text1 = X Text2 = Y End Sub

例7-7编写一个读片程序,单击鼠标左键时,标记出病变部位,右单击鼠标时弹出 输入对话框,给出诊断后显示在右侧图形框中。运行界面如图所示: 【程序代码】 Private Sub Command1_Click() Picture1.AutoSize = True Picture1.Picture = LoadPicture("手术后.jpg") End Sub Private Sub Command2_Click() End End Sub Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As_ Single, Y As Single) IF Button = 1 Then Picture1.Circle (X, Y), 200, QBColor(4) ?单击左键画出受伤部位 End IF IF Button = 2 Then I = InputBox("输入标记", "请标记") ?右单击弹出输入框允许医生给出诊断 Picture2.Print I ? 图像框中输出诊断结果 End IF End Sub

7.7键盘
7.7.1KeyPress 事件 可以产生ASCII码的键被按下并释放可以触发KeyPress 事件。事件过程如下: Sub Form_KeyPress ( KeyAscii As Integer ) Sub Object_ KeyPress([Index As Integer,] KeyAscii As Integer) 其中: 参数 KeyAscii 为与按下的键对应的Ascii 码值。 例如用户按下的字符为“A”,Ascii值为65,如果为“a”,则Ascii值为97。
7.7.2KeyUp 和 KeyDown 事件 当控制焦点在某个对象上时,用户按下键盘上任一键便会引发该对象的 KeyDown事件,释放按键触发KeyUp事件。事件过程如下: Sub Form_KeyDown (KeyCode As Integer ,Shift As Integer ) Sub Object_KeyDown(KeyCode As Integer, Shift As Integer) Sub Form_KeyUp(KeyCode As Integer, Shift As Integer) Sub Object_KeyUp(KeyCode As Integer, Shift As Integer) 其中: KeyCode:返回的是用户所按物理键代码;大小写字母用同一个按键,其 KeyCode值为大写字母的ASCii码;单键双字符键中,返回的是其下档字符的 ASCii码。另外,大键盘上的数字键与小键盘上的数字键不同。

例7-8编写一个程序,当按下键盘上的某个键时,输出该键的KeyCode码。

【程序代码】 Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) Static i ?控制每行输出的数个数相同 IF (i Mod 5) = 0 Then Print Form1.Print Chr(KeyCode); KeyCode; Spc(3); ?输出字符、该键的KeyCode码 i=i+1 End Sub

7.8拖放
拖放就是用鼠标拖动一个对象从一个地方拖动到另一个地方再放下的活动。同常把原来位 置的对象叫做源对象,二拖动后放下的位置的对象叫做目标对象 。 7.8.1属性 (1)DragMode 决定拖动操作的初始化是人工方式还是自动方式。 0:默认值,启动手工拖动模式,用户在对象上按下左键不放并拖动时源对象不会随鼠标移动。 如果要拖动必须在MouseDown事件中用Drag方法启动拖操作。 1:启动自动拖动模式,对象不再接收Click和DblClick事件,当用户在对象上按下左键不放, 然后拖动,源对象就会随鼠标移动。 (2)DragIcon 决定在拖动过程中对象的显示图标。属性值为一个图标文件名(Ico或Cur文 件)。如果为空,则对象在拖动过程中显示为灰色控件边框,否则显示为图标文件。 7.8.2方法: Drag方法控制拖动作的开始,结束或取消。形式如下: [对象名.]Drag 参数 其中: 控件可以是任何可以被拖动的控件; 参数为0,1,2三个整数,分别表示取消、开始和结束拖放操作。如果省略,默认为1,即表 示开始拖动。
7.8.3事件: 主要有DragOver事件和 DragDrop事件,两个事件都发生在目标对象上,当拖动源对象到某个 对象上时触发DragOver事件;当把源对象投放到目标对象上时,即释放鼠标,或程序中用 Drag方法停止拖动时,引发目标控件的DragDrop事件。此时必须在DragDrop事件中编写 Move方法实现移动,否则不会移动到新的位置。

7.9 OLE拖放
OLE拖放可以将数据从一个控件或应用程序中移动到另一个控件或程序中。要 实现控件的OLE拖放,必须先设置控件的OLEDragMode和OLEDropMode属性。 OLEDragMode属性决定控件是自动还是手动实现“拖”操作。 0——Mannual : 默认,手动实现“拖”操作。 1——Automatic:自动实现“拖”操作。 OLEDropMode属性决定控件是自动还是手动实现“放”操作。 0——None :默认,目标控件不接受OLE“放”操作。 1——Mannual : 默认,手动实现“放”操作。 2——Automatic:自动实现“放”操作。 不同的控件支持OLE的程度不同,见下表: 控件 文本框/图片框 组合框/列表框 标签/命令按钮 OLEDragMode
0 1

OLEDropMode
0 1 2

? ? 无

? ?

? ? ?

? ? ?

? ? ?

支持自动“拖”、“放” 支持自动“拖” 需要编程实现”放” 不支持“拖” 需要编程实现“放”

例7-9窗体中有一个文本框,将文本框的OLEDragMode属性设为1(Automatic), OLEDropMode属性设为2(Automatic),就能够实现OLE自动拖放。程序运行界 面如图7-14。窗体中有两个列表框,要实现list1到list2的OLE拖放,首先将 List1.OLEDragMode设为1(Automatic),List2.OLEDropMode设为1(Manual), 编写实现“放”操作。OLE数据拖放示例图:

【程序代码】 Private Sub List2_OLEDragDrop(Data As DataObject, Effect As Long, Button As_ Integer, Shift As Integer, X As Single, Y As Single) List2.AddItem Data.GetData(VBCFText) End Sub

例7-10 从Windows 资源管理器选择一个文件,然后把文件 的文件名拖动到如图7-15的标签上。标签的OLEDropMode 属性值为1。

程序如下:
Private Sub Label1_OLEDragDrop(Data As DataObject, Effect As _ Long, Button As Integer, Shift As Integer, X As Single, Y As Single) Label1.Caption = Data.Files(1) End Sub

第8章 用户界面设计

8.1菜单设计
菜单界面是现在绝大多数 应用程序的用户界面,许多简 单的应用程序只由一个窗体和 几个控件组成,但是通过增加 菜单可以增强 Visual Basic 应 用程序的功能。这一节将介绍 如何在应用程序中创建菜单和 使用菜单。 菜单的组成元素有:菜单栏, 菜单名,菜单项,子菜单名, 快捷键,热键和子菜单标记, 如图所示。

菜单栏
热键

菜单项 子菜单项 分隔条

快捷键

动态菜单项

8.1.1用菜单编辑器创建菜单
用菜单编辑器可以创建新的菜单和菜单栏、在已有的菜单上增加新命 令、用自己的命令来替换已有的菜单命令以及修改和删除已有的菜单和菜 单栏。 从“工具”菜单上,选取“菜单编辑器”。 这就会打开菜单编辑器,如图 所示。

例8-1编写一个简单的文本编辑程序,效果如图所示:
首先建立如下表所示的菜单结构:
标题
文件

名称
FileMenu

快捷键

·· ·新建
·· ·打开 ·· ·保存 ·· ·另存为 ·退出 · 编辑

FileNew
FileOpen FileSave FileSaveas FileExit EditMenu

Ctrl+N
Ctrl+O Ctrl+S

·· ·复制
·· ·剪贴 ·· ·粘贴

EditCopy
EditCut EditPaste

Ctrl+C
Ctrl+X Ctrl+V

对于建立好的菜单来说,其中大多数的菜单项都是VB的对象,这些对象 的对象名就是菜单中的名称,这些对象可识别的唯一事件是Click()事件,下 面是围绕部分菜单项所设计的程序代码:
Dim st As String Private Sub EditCopy_Click() st = Text1.SelText EditCopy.Enabled = False EditCut.Enabled = False EditPaste.Enabled = True End Sub Private Sub EditCut_Click() st = Text1.SelText Text1.SelText = “” EditCopy.Enabled = False EditCut.Enabled = False EditPaste.Enabled = True End Sub Private Sub EditPaste_Click() Text1.SelText = st End Sub Private Sub FileOpen_Click() On Error GoTo nofile CommonDialog1.InitDir = “C:\Windows” CommonDialog1.Filter = “文本文件 | *.Txt” CommonDialog1.CancelError = True CommonDialog1.ShowOpen Text1.Text = “” pen CommonDialog1.FileName For Input As #1 Do While Not EOF(1) Line Input #1, inputdata Text1.Text = Text1.Text & inputdata & vbCrLf Loop Close #1 Exit Sub nofile: If Err.Number = 32755 Then Exit Sub End Sub Private Sub FileExit_Click() End End Sub

8.1.2动态菜单的设计
1. 在“菜单编辑器”中 通过设定“标题”和 “名称”( mnuRecentFile(0) )来创建将成 为数组中第一个元素的菜单项。 2. 将数组中第一个元素的“索引”设置为 0。 3. 在第一个的同一缩进级上创建第二个菜单项。 4. 将第二个元素的“名称”设置成与第一个元素 相同,且把它的“索引”设置为 1。 5. 对于数组中的后续元素重复上述步骤 。
当创建 mnuRecentFile(0) 时,实际上创建了一个在运行时不可见的分隔 符条。当运行时用户第一次存储一个文件时,这个分隔符条就会变得可见, 且第一个文件名被加到该菜单上。运行时每存储一个文件,则会再装入一个 菜单控件到该数组中,从而使该菜单增长。 运行时所创建的控件可以使用 Hide 方法或者设置该控件的 Visible 属性为 False 来隐藏。如果要从内存中删除一个控件数组中的控件,请使用 Unload 语句。

8.1.3弹出式菜单
弹出式菜单是独立于菜单栏而显示在窗体上的浮动菜单。 为了显示弹出式菜单,可使用 PopupMenu 方法。这个方法 使用下列语法:
[Object.]PopupMenu menuname [, Flags [,x [, y [, boldcommand ]]]] 例6-2在例6-1的基础上添加一个弹出式菜单,弹出式菜单中内容为编辑菜单中的 菜单项。如图所示: Private Sub Text1_MouseUp(Button As Integer, Shift As Integer, X As Single, _ Y As Single) If Button = 2 Then '检查是否单击了鼠标右键。 PopupMenu EditMenu ?把编辑菜单显示为一个弹出式菜单。 End If End Sub

8.2通用对话框对象
通用对话框对象允许在程序中显示五种标准对话框。通用对话框对象提 供的五个通用对话框可以通过设置其Action属性或调用方法而获得。程序中 获得对话框的属性值及方法如下表所示:

对话框名称 打开文件对话框 保存文件对话框 颜色对话框 字体对话框 打印对话框

Action属性值 1 2 3 4 5

方法 ShowOpen ShowSave ShowColor ShowFont ShowPrinter

8.2.1把通用对话框控件添加到工具箱上
1) 在Project(工程)菜单中单击Component(部件)菜单项。 2) 单击Control(控件)选项卡,并选中Microsoft Common Dialog Control 6.0复选框。如下图所示:

通用对话框

3) 单击确定按钮。CommonDialog控件出现在工具箱中,如右图所示:

8.2.2添加通用对话框对象 1) 单击工具箱中的CommonDialog控件。 2) 在窗体的左下角绘制通用对话框对象。如图所示:

通用对话框属性: Action:打开通用对话框。 DialogTiltle:对通用话框标题。 CancelError True:选择“取消”按钮,出现错误警告; Err.Number置为32755(cdCancel)。 False(缺省):选择“取消”按钮,没有错误警告。

1. “打开”文件对话框
DialogTiltle FileName DefaultExt FilterIndex

InitDir
Filter

属性 FileName:包含路径 FileTitle:不包含路径 Filter:例如, Documents(*.DOC)|*.DOC|Text Files(*.TXT)|*.txt|All Files|*.* FilterIndex:决定在文件类型列表框中显示第几组类型的文件。 InitDir:初始化路径

例如简单的文本编辑程序中“打开”按钮的程序代码可编辑如下:

Sub cmdOpen_Click() CommonDialog1.Action = 1 txtNoteEdit.Text = "" Open CommonDialog1.filename For Input As #1 Do While Not EOF(1) Line Input #1, inputdata txtNoteEdit.Text = txtNoteEdit.Text + inputdata + _ Chr(13) + Chr(10) Loop Close #1 End Sub

2. “另存为”对话框 没有提供真正的存储文件操作,仍需要编程完成储存操作。 属性 DefaultExt:缺省扩展名 3. “颜色”对话框 属性 Color:返回或设置选定的颜色。

4. “打印”对话框 属性 FromPage:起始页号 ToPage:终止页号 Copies:打印份数
如果打印驱动程序不支持多份打印,该属性有可能始终返回 1。

5. “字体”对话框
FontName FontBold、FontItalic FontSize

Min、Max

FontStrikethru FontUnderline Color

Flags属性:指示所显示的字体类型,必须在字体对话框使用前设置。 cdlCFScreenFonts &H1 屏幕字体 cdlCFPrinterFonts &H2 打印机字体 cdlCFBoth &H3 打印机字体和屏幕字体。 cdlCFEffects &H100 显示删除线和下划线检查框以及颜色组合框

8.3 工具栏和状态栏
8.3.1工具栏 象加载通用对话框一样,将“Microsoft Windows Common Controls 6.0” 控件 添加到工具箱,通过ToolBar、ImageList组合使用建立工具栏,步骤: 1.在ImageList控件中添加所需的图象 2.在ToolBar控件中创建Button对象。 3.在ButtonClick事件中用Select Case语句对各按钮进行相应的编程。 一、在ImageList控件中添加图象 ImageList控件不单独使用,专门为其它控件提供图像库. 索引(Index)、 关键字(Key) 在ToolBar中引用 图象文件的扩展名 为: .ico、.bmp、.gif、.jpg 等

二、在ToolBar控件中添加按钮
1.为工具栏连接图象

ToolBar与 ImageList的连接

工具栏样式

2.为工具栏增加按钮
索引(Index)、关键字(Key)每 个按钮的编号、标识, ButtonClick事件中引用;

样式(Style),共5种

图象(Image) ImageList对象中的图象, 值可以是Key或Index

除菜单按钮(5)外的4种样式:

S ty le = 0

S ty le = 3

S ty le = 4

S ty le = 1

S ty le = 2

三、 响应ToolBar控件事件

ToolBar控件常用的事件有两个:ButtonClick和ButtonMenuClick。前者对按 钮样式为0-2,后者对样式为5的菜单按钮。
(1)用索引Index确定按钮 (2)用关键字Key确定按钮

Private Sub Toolbar1_ButtonClick(Byval Button As ComctlLib.Button) Select Case Button.Index Select Case Button.Key Case 1 Case "TNew" FileNewProc FileNewProc Case 2 FileOpenProc Case "TOpen" …… FileOpenProc End Select ..... End Sub 注意:第1个按钮的Index值为1。用Index还是用Key比较,Key 可读性 好,可维护性好。

8.3.2 状态栏 状态栏显示系统信息和对用户的提示,如:系统日期、软件版本、光标 的当前位置、键盘的状态等。一般在窗口的底部。 通过状态栏属性页建立状态栏

显示的文本

样式

可插入图象

与其它众多的ActiveX控件不同,状态栏通常不需要编写许多支持 代码。你要完成的工作一般是通过对Text属性赋值,从而在状态栏上 显示一些信息。

第九章 多窗体和多文档界面

9.1多窗体界面
9.1.1窗体的生命周期 通常VB窗体在应用程序中有以下4种状态: 创建状态、 加载状态、 可见状态以及卸载状态 9.1.2窗体的创建 窗体创建状态开始的标志是Initialize事件,窗体创建时最先执行的代 码应放在Form_Initialize事件过程中。
9.1.3窗体的加载 Load事件标志着加载状态的开始。一旦窗体进入加载状态, Form_Load事件过程中的代码便开始执行。 9.1.4窗体的显示 使用窗体的Show方法,可以使窗体进入可见状态,一旦窗体可见, 用户就能和它交互,要使一个窗体可见就要调用Show方法: 格式:窗体名.Show 例如:Form1.Show 它与设置窗体的Visible属性为True具有相同的效果。

9.1.5窗体的卸载
窗体在卸载时可以时隐藏的,也可以是可见的。若没隐藏,则它将保 持可见直到卸载完毕,内存和资源完全收回。 窗体卸载前要发生Unload事件,在这之前还要发生QueryUnload事件。 QueryUnload提供了取消关闭窗体的机会,同时也允许在需要时从代码 中关闭窗体。

9.1.6结束应用程序
当应用程序只有一个窗体时,可以使用下面的语句来结束应用程序: Unload Me 如果应用程序有一个以上窗体,可以使用End语句来强行结束应用程序 而不顾现存窗体或对象的状态。

例9-1输入病人信息,并为病人开药方,输出病人及其药方信息。 本例共有三个窗体,Form1、Form2和Form3,分别为病人信息输入窗体、 药方窗体和信息输出窗体。工程资源管理器窗口及各窗体界面如图所示。

在用户界面设计时加载窗体的方法是:在如图所示的 工程资源管理器窗口单击鼠标右键,在弹出的快捷菜单 上选择“添加”按钮

窗体标准模块代码: Dim str1 As String, str2 As String Dim num% Dim drug() As String 挂号窗体代码: Private Sub Command1_Click() ?挂号按钮代码 Form1.Hide Form2.Show str1 = Form1.Text1 str2 = Form1.Combo1.Text Form2.Label1.Caption = str1 & " :您好!祝您早日康复!" End Sub End Sub

开处方窗体代码: Private Sub Combo1_DblClick() List1.AddItem Combo1.Text End Sub Private Sub Command1_Click() ?结果输出按钮代码 Form2.Hide Form3.Show Form3.Label1.Caption = str1 & " " & str2 & vbCrLf & "处方清单:" & vbCrLf num = Form2.List1.ListCount - 1 ReDim drug(num + 1) For i = 0 To num drug(i) = Form2.List1.List(i) Next i For i = 0 To num Form3.Label1.Caption = Form3.Label1.Caption & drug(i) & vbCrLf Next i End Sub 结果输出窗体代码: Private Sub Command1_Click() Form1.Show Form3.Hide End Sub Private Sub Command2_Click() End End Sub ?返回按钮代码

?结束按钮代码

9.2多文档界面
9.2.1多文档界面的结构 MDI应用程序至少应有两个窗体,父窗体和一个子窗体。每个窗体都有 相应的属性。父窗体只有一个,而其中包含的子窗体则可以有多个。 要生成MDI应用程序,具体的操作步骤如下: (1)创建MDI窗体。在“工程”菜单中选择“添加MDI窗体”菜单命令, 系统打开“添加MDI窗体”对话框。 (2)选中“MDI窗体”图标,单击“打开”按钮,将MDI窗体的Caption 属性设为“MDI窗体”。 (3)创建应用程序的子窗体。要创建一个MDI子窗体,先创建一个新窗 体(或者打开一个已存在的窗体),将其Caption属性设为“子窗 体”,并将窗体的MDIChild属性设置为True,就使它变为一个子窗 体。 (4)从“工程”菜单中选择“属性”项,打开“工程属性”对话框,设 置子窗体为启动窗体。如果此时设置MDI窗体为启动对象,则子窗体 将不会显示,必须在程序中装入子窗体。

例9.2多文档界面应用程序举例。 MDIForm父窗体和三个子窗体Form1、Form2和Form3。多文档界面分 别如图所示。

子窗体层叠排列

子窗体水平平铺排列

窗体垂直平铺排列

程序代码: Private Sub ceng_Click() MDIForm1.Arrange vbCascade End Sub
Private Sub exit_Click() End End Sub Private Sub horizontal_Click() MDIForm1.Arrange vbTileHorizontal End Sub Private Sub MDIForm_Load() Form3.Show Form2.Show Form1.Show End Sub Private Sub pai_Click() MDIForm1.Arrange 3 End Sub Private Sub vertical_Click() MDIForm1.Arrange vbTileVertical End Sub

第十章 文 件

10.1文件概述
所谓“文件”是记录在外部介质上的数据集合。在程序设计中,文件是十分 有用而且是不可缺少的,不使用文件将很难解决所遇到的实际问题。
一.文件结构 1.字符 字符是构成文件的基本单位。它可以是数字、字母、特殊字符。这里所说的 字符一般为西文字符,一个西文字符用一个字节存放。如果是汉字用两个字节存 放,一个汉字相当于两个西文字符。 2.字段 字段由若干个字符组成,用来表示一项数据。如所选课程“程序设计”就是 一个字段,由四个汉字组成。 3.记录 记录由一组相关的字段组成。例如一个学生有学号、姓名、性别、专业、年 级等信息。VB中以单位为记录处理信息。 4.文件 文件由记录构成。一个文件含有一个以上的记录。 二.文件种类 VB提供了三种文件的访问模式:顺序、随机、二进制。根据访问模式的不同可 以将文件分为不同的类型:顺序文件、随机文件、二进制文件。

10.2 顺序文件 顺序文件的写入步骤:打开、写入、关闭; 读出步骤:打开、读出、关闭。 一.打开文件 打开文件的命令是Open,格式为: Open “文件名” For 模式 As [#] 文件号 [Len=记录长度] 说明: 1)文件名可以是字符串常量也可以是字符串变量 2)模式可以是下面之一: Output:打开一个文件,将对该文件进行写操作 Input:打开一个文件,将对该文件进行读操作 Append:打开一个文件,将在该文件末尾追加记录 3) 文件号是一个介于1-511之间的整数,打开一个文件时需要指定一个 文件号,这个文件号就代表该文件,直到文件关闭后这个号才可以被其 他文件所使用。 例: Open "f:\sy\file1.dat" For Output As #1 意思是:打开f:\sy下file1.dat文件供写入数据,文件号为#1 二.写操作 将数据写入磁盘文件所用的命令是:Write# 或Print#。语法格式: Print #文件号,[输出列表] Write #文件号,[输出列表]

三. 关闭文件 结束各种读写操作后,必须将文件关闭,否则会造成数据丢失。关闭文件的命令 是Close。格式为: Close [#]文件号[,[#]文件号]…… 如Close #1是关闭1号文件。 四.读操作 1.Input #文件号,变量列表 作用:将从文件中读出的数据分别赋给指定的变量。 说明:为了能够正确的读出,将数据写入时需要使用Write #语句,不能使用Print #语句,只有Write #语句才可以准确地将各个数据项分开。 2.Line Input #文件号,字符串变量 用于从文件中读出一个完整的行,并将读出的数据赋给指定的字符串变量,读出 的数据中不包含回车符和换行符,可与Print #配套用。 因此,在实际操作时Line Input #非常有用,它可以读取顺序文件中一行的全部字 符,直到遇到回车符为止。 3.Input$(读取的字符数,#文件号) 该函数可以读取指定数目的字符。如mystr$=Input$(100,#1),表示从文件号为1的 文件中读取100个字符,并赋值给变量mystr$。 Input$函数执行“二进制输入”。它把一个文件作为非格式的字符流来读取数据。 它不把回车或换行符看作一次输入操作的结束标志。 与读文件有关的两个函数: LOF():返回某文件的字节数 EOF():检查指针是否到达文件尾。

例10-1: 编写程序,用Print#语句向文件file1.dat中写入数据,录入界面 如图所示: 程序代码: Private Sub Command1_Click() Open " c:\file1.dat" For Output As #1 studname = Text1.Text studsex = Text2.Text studage = Text3.Text Print #1, studname, studsex, studage Close #1 End Sub

例10-2 在将实验文件夹中的file2.dat文件用三种不同的方法读入到文本框 中。 运行界面如图所示:
方法一: 将内容一次性读入文本框,程序如下: Private Sub Command1_Click() Text1.Text = "" Open " f:\sy\file2.dat" For Input As #1 Text1.Text = Input(LOF(1), 1) Close #1 End Sub

方法二:将内容一行一行读入文本框,程序如下: Private Sub Command1_Click() Text1.Text = "" Open " f:\sy\file2.dat" For Input As #1 Do While Not EOF(1) Line Input #1, inputdata Text1.Text = Text1.Text + inputdata + vbCrLf Loop Close #1 End Sub

方法三:把内容一个一个字符读入。程 序如下: Private Sub Command1_Click() Text1.Text = "" Open " f:\sy\file2.dat" For Input As #1 Do While Not EOF(1) Inputdata = Input(1, #1) Text1.Text = Text1.Text + Inputdata Loop Close #1 End Sub

10.3 随机文件
随机文件文件的记录是定长的,只有给出记录号n,并通过[(n-1)× 记录长度]计算出该记录与文件首记录的相对地址。所以,在使用Open 语句打开文件时必须指出记录长度。每个记录由若干字段组成,每个字 段的长度为相应的变量的长度。 一.随机文件的打开与关闭 打开:Open “文件名” For Random As [#] 文件号 [Len=记录长度] 关闭:Close #文件号

二.随机文件的读与写 读操作:Get [#]文件号,[记录号],变量名 写操作:Put [#]文件号,[记录号],变量名

例10-3 建立一个医院各科室职工工资记录随机存取的文件,然后读取文件 中的记录,并可以修改记录。各记录字段如表所示。界面如图所示。在左 边输入工作人员信息后,单击“添加记录”按钮会将该记录添加到文件中; 在记录号后方的文本框中输入记录号可以在左边显示出该记录信息;如需 修改记录先输入记录号,将该记录显示出来,再在左边修改,完成后单击 “修改记录”按钮。 字段 长度/字节 类型 字符串 字符串 整型 单精度

10 姓名(med_name) 科室(sec_office) 年龄(age) 工资(salary) 15 2 4

代码如下:
Type rcdtype ?创建标准模块程序 med_name As String * 10 sec_office As String * 15 age As Integer salary As Single End Type Dim med_rcd As rcdtype Dim rcd_no As Integer Private Sub Command1_Click() With med_rcd .med_name = Text1.Text .sec_office = Text2.Text .age = Val(Text3.Text) .salary = Val(Text4.Text) End With Open " c:\file3.dat" For Random As #1 Len_ = Len(med_rcd) rcd_no = LOF(1) / Len(med_rcd) + 1 Put #1, rcd_no, med_rcd Close #1 Text1.Text = "" Text2.Text = "" Text3.Text = "" Text4.Text = "" End Sub Private Sub Command3_Click() Open " c:\file3.dat" For Random As #1 Len = Len(med_rcd) med_rcd.med_name = Text1.Text med_rcd.sec_office = Text2.Text med_rcd.age = Text3.Text med_rcd.salary = Text4.Text rcd_no = Text5.Text Put #1, rcd_no, med_rcd Close #1 MsgBox "修改成功", , "提示框" End Sub Private Sub Command4_Click() End End Sub Private Sub Form_Load() Text1.Text = "" Text2.Text = "" Text3.Text = "" Text4.Text = "" End Sub

10.4 二进制文件
利用二进制存取可以获取任一文件的原始字节,也就是不仅能获取ASCII文 件,而且能获取非ASCII文件的原始字节。因此用户可以修改以非ASCII格式存 盘的文件如可执行文件。 二进制文件的打开语句为: Open “文件名” For Binary As [#] 文件号 [Len=记录长度]

关闭语句为:
Close #文件号 该模式与随机模式类似,其读写语句也是Get 和Put,区别是二进制模式的访 问单位是字节,随机模式的访问单位是记录。在此模式中,可以把文件指针移 到文件的任何地方,刚开始打开时,文件指针指向第一个字节,以后随文件处 理命令的执行而移动。只要文件打开,就可以同时进行读写。

例10-4 建立一个二进制文件并向其中输入信息。 (1)建立如图所示的设计界面: (2)单击“建立文件”按钮,编写代码(该按钮默认控件名为Command1): Private Sub Command1_Click() Dim emname As String * 10 myfile = InputBox("请输入文件名:") Open myfile For Binary As #1 Do emname = InputBox("请输入职工姓名:") Put #1, , emname re = InputBox("继续输入吗?(Y/N)") Loop While UCase(re) = "Y" Close #1 End Sub (3)单击“读取文件”按钮,编写代码(该按钮默认控件名为Command2): Private Sub Command2_Click() Dim emname As String * 10 myfile = InputBox("输入文件名:") Open myfile For Binary As #1 For i = 1 To LOF(1) Step 10 Get #1, , emname Print emname Next i Close #1 End Sub

上述程序运行时,单击“建立文件”按钮,在弹出的输入框中输入所 要建立的文件名路径及名称,如图所示:

表示在本地磁盘C下建立一个名为file.dat的数据文件。然后输入相 关信息,单击“读取文件”按钮将其打印到窗口,如图所示。

10.5文件系统控件
驱动器列表框

一.文件系统控件种类 1.驱动器列表框 (DriveListBox):用来显 示当前机器上的所有盘符。
目录列表框

2.目录列表框(DirListBox): 用来显示当前盘上的所有文 件夹。
3.文件列表框(FileListBox): 用来显示当前文件夹下的所 有文件名。

文件列表框

二.文件系统控件的重要属性
属性
Drive Path FileName

适用的控件
驱动器列表框 目录和文件列表框 文件列表框

作用
包含当前路径 包含选定的文件名

示例
Dir1.Path="C:\WINDOWS" MsgBox File1.FileName

包含当前选定的驱动器名 Drive1. Drive="C"

Pattern

文件列表框

决定显示的文件类型

File1.Pattern="*.BMP"

三.文件系统控件的重要事件
事件 Change 适用的控件 目录和驱动器列表框 事件发生的时机 驱动器列表框的Change事件是在选择一个新的 驱动器或通过代码改变Drive属性的设置时发生 目录列表框的Change事件是在双击一个新的目 录或通过代码改变Path属性的设置时发生

PathChange
PattenChange Click DblClick

文件列表框
文件列表框 目录和文件列表框 文件列表框

当文件列表框的Path属性改变时发生
当文件列表框的Pattern属性改变时发生 用鼠标单击时发生 用鼠标双击时发生

例10-5设计如图所示的文件管系统。单击文件名时显示出文件 路径及名称。 在设计界面拖放驱动器、目录和文件列表框。
1)窗体加载事件: Private Sub Form_Load() Combo1.AddItem "所有文件(*.*)" Combo1.AddItem "可执行程序(*.exe)" Combo1.AddItem "文本文件(*.txt)" End Sub

2)编写使驱动器列表框、目录框和文件列表框同步操作的事件过程: Private Sub Drive1_Change() Dir1.Path = Drive1.Drive End Sub Private Sub Dir1_Change() File1.Path = Dir1.Path Label1.Caption = Dir1.Path End Sub

3)编写文件列表框的Click、DblClick事件: Private Sub File1_Click() If Right(Dir1.Path, 1) <> "\" Then Label1.Caption = Dir1.Path + "\" + File1.FileName Else Label1.Caption = Dir1.Path + File1.FileName End If End Sub Private Sub File1_DblClick() If Right(File1.Path, 1) = "\" Then F_name = File1.Path + File1.FileName Else F_name = File1.Path + "\" + File1.FileName End If x = Shell(F_name, 1) End Sub 4)编写组合框的Click事件来筛选所显示的文件类型: Private Sub Combo1_Click() Select Case Combo1.Text Case "所有文件(*.*)" File1.Pattern = "*.*" Case "可执行程序(*.exe)" File1.Pattern = "*.exe" Case "文本文件(*.txt)" File1.Pattern = "*.txt" End Select End Sub

10.6文件的基本操作 文件的基本操作为文件的删除、拷贝、移动改名等。可以通过相应的语 句执行这些基本操作。
1. FileCopy语句 格式:FileCopy 源文件名 目标文件名 功能:复制一个文件 2. Kill语句 格式:Kill 文件名 功能:删除文件 3. Name语句 格式:Name 旧文件名 新文件名 功能:重新命名一个文件或目录 4. ChDrive语句 格式:ChDrive 驱动器 功能: 改变当前驱动器 5.MkDir语句 格式:MkDir 文件夹名 功能:创建一个新的目录 6.ChDir语句 格式:ChDir 文件夹名 功能:改变当前目录 7. RmDir语句 格式:RmDir 文件夹名 功能:删除一个存在的目录 8. CurDir()函数 格式: CurDir[(驱动器)] 功能:可以确定任何一个驱动器的当前 目录。

第十一章 图形程序设计

11.1图形基础
11.1.1 矢量图形 矢量图形以数学的矢量方式来记录图形内容。它的内容以线条与色块为 主。。 矢量图形文件最常用的类型有两种: 分别是标准型(.wmf)和增强型(.emf)。 11.1.2 位图图形 位图式图象是由许多点组成的,这些点称为像素,当许许多多不同颜色的 点组合在一起便构成了一幅完整的图象。位图图形文件最常用的类型有
位图文件(bitmap):位图通常以.bmp或 .dib为文件扩展名。 图标文件(icon):以.ico为文件扩展名。 JPEG文件:JPEG是一种支持 8 位和 24 位颜色的压缩位图格式。它是 Internet 上一种流行的文件格式。以.jpg为文件扩展名。 GIF文件:GIF是一种压缩位图格式。它可支持多达 256 种的颜色,是 Internet 上一种流行的文件格式。以.gif为文件扩展名。

在VB应用程序的设计过程中,图形处理的内容基本包括:在应用程序中插 入图片、使用VB图形控件创建图形和使用VB图形方法绘制图形。

11.2 坐标系统
11.2.1 VB的缺省坐标系统 在VB中,用户界面上凡是可以作为容器的控件对象,都带有一个由系 统为其设定的(缺省)坐标系统,例如窗体上的(缺省)坐标系统,定义 网格上的位置:(x, y),x 值是沿 x 轴点的位置,最左端是缺省位置 0。Y 值是沿 y 轴点的位置,最上端是缺省位置 0。也就是说:坐标系的原点是 在窗体的作上角(其实,任何容器的缺省坐标系统,都是这样的类型)。 该坐标系统的图示在图 11-1中。
坐标原点 X轴

O(0,0)

Y轴

11.2.2 建立自己的坐标系统 一.改变坐标轴刻度 1.通过改变控件对象的ScaleMode属性值 。 对象的ScaleMode属性的取值及描述如下表所示:
0 1 2 3 4 5 6 7 用户定义。 缇。这是缺省刻度。1,440 缇等于一英寸 磅。72 磅等于一英寸 像素。像素是监视器或打印机分辨率的最小单位。每英寸里像素的数目由 设备的分辨率决定 字符。打印时,一个字符有 1/6 英寸高、1/12 英寸宽 英寸 毫米 厘米

2.使用ScaleTop、ScaleLeft 、ScaleWidth以及ScaleHeight属性

例如,通过属性定义,使用下面的语句序列窗体中定义如图所示的坐标系。

Form1.ScaleLeft = -16 Form1.ScaleTop = 16 Form1.ScaleWidth = 32 Form1.ScaleHeight = -32
左上角坐标 (-16,16)

0

注意:若直接设置了 ScaleWidth、 ScaleHeight、ScaleTop 或ScaleLeft的属 性值,则 ScaleMode 属性自动设为 0。

右下角坐标 (16,-16)

二.重新定义新的坐标系统 一个更有效的改变坐标系统的途径,是使用 Scale 方法。 Scale 方法的语法格式如下:
[对象名.] Scale [(x1,y1)-(x2,y2)] 其中对象为要定义坐标系的控件对象(窗体或图形框); (x1,y1)表示对象左上角坐标,(x2,y2)表示对象右下角坐 标,VB根据给定的坐标参数计算出ScaleLeft、ScaleTop 、 ScaleWidth 、ScaleHeight 的值。Scale方法不带参数时,则 取消用户自定义的坐标系,而采用默认的坐标系。 例如: Form1.Scale(-16,16)-(16,-16) 可建立和前页一样的坐标系。

11.3 图形控件
11.3.1 创建图形的控件 一.直线(Line)控件 Line控件(如图所示)用来在窗体、框架或图片框 中创建简单的线段。 直线控件的主要属性有: 1.BorderStyle属性 Line控件的BorderStyle属性用于设置线段的样式。 BorderStyle 属性提供7种直线样式如下表所示:
BorderStyle 属性值 描述 线段样式

直线控件

2.BorderColor属性 Line控件的属性用来指定直线的颜色。在设计时从Line控件的“属性”窗口 中选择 BorderColor 属性,然后从提供的调色板或系统颜色中选择颜色, 这样就可设置直线颜色。为了在运行时设置颜色,应使用 Visual Basic 颜 色常数(例如,vbGreen)或系统颜色常数(例如, vbWindowBackground),或使用QBColor函数以及RGB 函数指定边界颜 色。 3.BorderWidth属性 Line控件的BorderWidth 属性用来指定直线的宽度,其属性值为1~8192之 间(包括1和8192)的整数。默认的属性值为1。需要注意的是:用户界面 上的Line控件的BorderStyle 属性,除了实线型(即BorderStyle=1)之外, 其他类型当其BorderWidth 属性不为1时都不起作用。 4.X1、Y1和X2、Y2属性 Line控件的 X1 和 Y1 属性用于设置直线控件起始端点的水平位置和垂直位 置,X2 和 Y2 属性用于设置直线控件终止端点的水平位置和垂直位置。在 程序运行时不能用 Move 方法移动Line控件。

例11-1:制作“血压测试数据显示”用户界面(如图所示)中, 带有立体感的分隔线,其实是两根直线控件的合成。其制作 过程是:在用户界面上用直线控件工具画两根水平直线: Line1和Line2,设置Line1的BorderColor属性为黑色(在此 为默认属性),Line2的BorderColor属性为白色。然后将 Line2的Y1和Y2坐标分别设置为较Line1的Y1和Y2大于10的 数值即可。
即:在当前的用户界面中: Line1::X1坐标:120; X2坐标:440 Y1坐标:1440; Y2坐标:1440

Line2::X1坐标:120; X2坐标:440 Y1坐标:1450; Y2坐标:1450

二.Shape 控件

Shape 控件(如图所示)用于在窗体、框架或图形框 中创建下述预定义形状:矩形、正方形、椭圆形、圆形、 圆角矩形或圆角正方形。
1.Shape属性: Shape控件的 Shape属性提供了六种预定义的形状。表 11-3列出所有预定义形状、形状值和相应的 Visual Basic 常数:
Shape属性值 描述 常数 样式

Shape控件

2.FillStyle 属性 Shape控件FillStyle 属性的提供了若干预定义的填充样式图案,其中包 括:实线、透明、水平线、垂直线、左上右下对角线、左下右上对角线、 十字线和对角十字线。下表给出了Shape控件的FillStyle 属性的取值、意 义描述以及具体的填充样例:
FillStyle 属性值 描述 填充样式

3.FillColor 属性 Shape控件的FillColor 属性用于设置封闭图形内部的填充颜色。设计时, 可从 Shape 控件的“属性”窗口中选定填充或边框颜色属性,然后从 提供的调色板或系统颜色中选择要设置的颜色。 例11-2:使用Shape控件作简单的图形,如图所示。本程序一共使用 了7个Shape控件,所有控件的属性除了Shape属性都为3以外,其余 属性设置如下表所示:
对象及对象名 Shape1 属性名 FillStyle 属性值 0

Shape1
Shape1

BorderColor
FillColor

&H000000FF&
&H000000FF&

Shape2~ Shape7
Shape2~ Shape7

FillStyle
BorderColor

1
&H000000FF&

11.3.2 显示图形的控件
窗体(Form)与图形框(PictureBox) 是VB中功能很强的控件, 它们的作用主要有: ? 显示图片 ? 作为其它控件的容器 ? 支持图形控件与图形方法的输出 ? 显示 Print 方法输出的文本 1.CurrentX、CurrentY当前坐标属性 窗体或图形框的CurrentX、CurrentY属性给出在绘图时的当前坐标, CurrentX,CurrentY确定了下一次打印或绘图的水平及垂直坐标。

例11-3使用当前坐标技术在窗体上显示以“★”组成的圆, 程序运行界面如图所示。本程序的用户界面上只有一个命令 按钮, 其程序代码如下: Private Sub Command1_Click() Const PI = 3.1415926 Dim r As Single r = Form1.ScaleWidth / 3 For t = 0 To 2 * PI Step PI / 12 CurrentX = Form1.ScaleWidth / 2 + r * Cos(t) CurrentY = Form1.ScaleHeight / 3 + r * Sin(t) Print "★" Next t End Sub

2.AutoRedraw 属性 AutoRedraw 设置为 False,窗体上显示的任何由图形方法创建的图形 如果被另一个窗口暂时挡住,将会丢失。另外,如果扩大窗体,窗体边 界外的图形将会丢失。设置 AutoRedraw 为False 的效果如左下图 所示。

当窗体的 AutoRedraw 属性设置为 True 时,Visual Basic 会将图形方法 适用于内存中的一块“画布”上。应用程序复制此画布的内容,以便重 新显示被其它窗口暂时隐藏起来的图形。

3.DrawStyle 属性 窗体或图形框的DrawStyle 属性用于设置在其上面画线的样式,该属性 提供7种直线样式如下表所示:
DrawStyle 属性值 描述 线段样式

4.DrawWidth 属性 窗体或图形框的DrawWidth 属性用于设置在其上面画线的宽度或画点的 大小,DrawWidth 属性所设置的线宽宽度以象素为单位,最小值为1。 5.FillColor属性与FillStyle属性 窗体或图形框的FillStyle属性用于设置绘制在该容器上的封闭图形的填 充样式、FillColor属性用于设置绘制在该容器上的封闭图形的填充颜色。

11.4 图形方法

11.4.1 Line方法 Line方法用于在窗体或图形框上绘制直线或矩形,其语法格式为: [对象名.] Line [ [Step] (x1,y1)]-(x2,y2)[,颜色][,B[F]] 其中:对象即为窗体或图形框。 (x1,y1) ,(x2,y2)为线段的起终点坐标或矩形的左上角右下坐标。 颜色为可选参数,指定画线的颜色,缺省取对象的前景颜色,即ForeColor属性值。 B表示画矩形,F表示用画矩形的颜色来填充矩形。 关键字Step表示采用当前作图位置的相对位移量,即从当前坐标移动相应的 步长后所得的点为画线起点。

例11-4使用直线在窗体上绘制不同线宽的三角形: 在窗体上放置一个命令按钮,然后在代码窗口编辑如下的程序代码: Private Sub Command1_Click() Dim i As Integer Form1.ScaleHeight = 3000 Form1.ScaleWidth = 5000 Form1.BackColor = vbWhite i=1 Form1.DrawWidth = i Line (250, 300)-(4000, 100) i=i+2 Form1.DrawWidth = i Line -(500, 2500) i=i+2 Form1.DrawWidth = i Line -Step(-250, -2200) End Sub 本程序运行结果如图所示。

例11-5使用Line方法绘制矩形。 在本例题中,首先在用户界面设计窗口设置窗体的高度(Height属性) 为3400,宽度(Width属性)为2750,背景颜色(BackColor属性)为白 色。 编写如下的窗体单击事件程序代码: Private Sub Form_Click() Line (20, 40)-(1500, 2000), , B Line (200, 400)-Step(2000, 2000),vbRed, BF End Sub

本程序运行结果如图所示。

11.4.2 Circle方法 Circle方法用于在窗体或图形框上画圆、椭圆、圆弧和扇形。其语法 格式为:
[对象名.] Circle [ [Step] (x,y),半径[,颜色][,起始角][,终止角][,长短轴比率]]] 其中:(x,y)为圆心坐标,Step表示采用当前作图位置的相对值; 参数起始角、终止角用于设置绘制圆弧;当在起始角、终止角取值前加 一负号时,表示画圆心到圆弧的径向线,即绘制扇形;参数长短轴比率 控制绘制椭圆时横轴与纵轴的比例关系,其默认值为1,即为画圆。

例11-6 使用Circle方法的程序。 直接编写窗体单击事件程序代码如下:
Private Sub Form_Click() Const PI = 3.1415926 Form1.Scale (0, 0)-(60, 40) Form1.Circle (10, 10), 8 Form1.Circle (35, 15), 10, , PI / 2, PI Form1.FillStyle = 0 Form1.FillColor = vbRed Form1.Circle (50, 15), 10, , -PI / 6, -PI * 5 / 6 Form1.FillStyle = 1 Form1.Circle (15, 30), 12, , , , 0.3 Form1.Circle (45, 30), 8, , , , 3 End Sub 该程序运行结果如图所示:

?绘制圆 ?绘制圆弧 ?设置填充样式为实填充 ?设置填充颜色为红色 ?绘制具有填充效果的扇形 ?设置填充样式为虚填充 ?绘制X-长轴椭圆 ?绘制X-短轴椭圆

例11.7 使用Circle方法绘制太极图。 在用户界面上放置一个图形框和一个命令按钮。编写命令按钮单击事件如下: Private Sub Command1_Click() Const PI = 3.1415926 Dim x As Double, y As Double Picture1.Scale (-4, 4)-(4, -4) Picture1.DrawWidth = 2 Picture1.Circle (0, 0), 4 Picture1.Circle (0, 2), 2, , PI / 2, PI * 3 / 2 Picture1.Circle (0, -2), 2, , PI * 3 / 2, PI / 2 Picture1.Circle (0, 2), 1 Picture1.Circle (0, -2), 1 End Sub 本程序运行界面如图所示,

11.4.3 Pset方法 Pset方法用于在窗体或图形框上画点,其语法格式如下: [对象名.]Pset [Step] (X,Y) [,颜色]
例11-8 使用Pset方法在窗体上的任意位置画任意颜色的、大小为1~10之间任意 值的点。 直接编写窗体单击事件如下: Private Sub Form_Click() Dim i As Integer, x As Double, y As Double Randomize For i = 1 To 100 Form1.ForeColor = RGB(Int(Rnd * 255), Int(Rnd * 255), Int(Rnd * 255)) x = Rnd * Form1.ScaleWidth y = Rnd * Form1.ScaleHeight Form1.DrawWidth = Int(1 + Rnd * 30) PSet (x, y) Next i End Sub

例11-9使用Line方法和Pset方法绘制坐标系及-2π~2π之间的正弦曲线。 在用户界面上放置一个图形框(PictureBox)和两个命令按钮。 编写命令按钮(Command2)单击事件如下: Private Sub Command2_Click() Unload Me End Sub 本程序运行界面如图所示。 命令按钮(Command1)单击事件见后页。

编写命令按钮(Command1)单击事件如下: Private Sub Command1_Click() Const PI = 3.14159 Dim a as Double Picture1.Cls Picture1.BackColor = vbWhite ?设置图形框的背景颜色为白色 Picture1.ScaleMode = 3 Picture1.Scale (-7, 3)-(7, -3) ?自定义坐标系 Picture1.DrawWidth = 1 Picture1.Line (-7, 0)-(7, 0), vbBlue ?绘制X-轴 Picture1.Line (6.5, 0.5)-(7, 0), vbBlue ?绘制X-轴的箭头 Picture1.Line -(6.5, -0.5), vbBlue Picture1.ForeColor = vbBlue Picture1.Print "X" Picture1.Line (0, 7)-(0, -7), vbBlue ?绘制Y-轴 Picture1.Line (0.5, 2.5)-(0, 3), vbBlue ?绘制Y-轴的箭头 Picture1.Line -(-0.5, 2.5), vbBlue Picture1.ForeColor = vbBlue Picture1.Print "Y" Picture1.CurrentX = 0.5 ?设置原点字母的输出位置 Picture1.CurrentY = -0.5 Picture1.Print "0" For a = -2 * PI To 2 * PI Step PI / 6000 ?开始绘制正弦曲线 Picture1.PSet (a, Sin(a) * 3), vbRed Next a End Sub

11.4.4 Point方法 Point方法用于返回指定点的RGB颜色,其语法格式如下: [对象名.]Point (X,Y)
例11-10 用Point方法获取图形框中所有点的信息,并把它们反映在窗体上。 在窗体的左下角上放置一个图形框(PictureBox),并设置该图形框的Picture属性 为图标文件“misc32.ico”,该文件可以在: “ C:\Program Files\Microsoft Visual Studio\Common\Graphics\Icons\Misc” 文件夹里面找到。 编写窗体单击事件程序代码如下:
Private Sub Form_Click() Dim i, j As Integer, mcolor As Long Form1.Scale (0, 0)-(1000, 1000) Picture1.Scale (0, 0)-(1000, 1000) Picture1.Cls For i = 1 To 1000 For j = 1 To 1000 mcolor = Picture1.Point(i, j) PSet (i, j), mcolor Next j Next I End Sub

本程序运行界面如左上图所示。本例中窗体与图形框的 坐标系设置相同,但窗体的实际高度与宽度比图形框大, 因此仿真输出时放大了原来的图案。如果将窗体的坐标 系倒置:Form1.Scale (1000, 1000)-(0, 0) 则可输出图形旋转180o以后的效果(如右上图所示)。


推荐相关:

vb6.0课件_图文.ppt

vb6.0课件 - Visual Basic程序设计 http://edu.ph


VB6.0课件_图文.ppt

VB6.0课件 - 通过这个课件,你可以系统的学习vb6.0... VB6.0课件_工学_高等教育_教育专区。通过这个课件,你可以系统的学习vb6.0 高等学校计算机基础教育教材 上海中医...


VB完整课件PPT_图文.ppt

VB完整课件PPT_理学_高等教育_教育专区。Visual Basic程序设计教程主讲:张红蕾 第...VB图形设计 文件 Visual Basic 6.0简介一、Visual Basic的发展 Visual Basic 是...


VB6.0课件第一一章_图文.ppt

VB6.0课件第一一章 - 第一章 Visual Basic程序开发环境 教学目


vb课件_图文.ppt

vb课件 - VB语言程序设计 教材与参考书籍 Visual BASIC 程序设


VB课件_图文.ppt

VB课件 - Visual Basic 程序设计简明教程 第一章 Visual Basic程序设计概述(1) 第二章 VB简单的程序设计(3) 第三章 VB语言基础(2) 第四章 基本的控制结构....


VB课件完整版_图文.ppt

VB课件完整版_电脑基础知识_IT/计算机_专业资料。VB应用开发 计算机语言可以分成...例: Form1.Print “欢迎您使用VB6.0” Text1.SetFocus 第二章 简单的VB程序...


1VB课件_图文.ppt

1VB课件 - 文档均来自网络,如有侵权请联系我删除文档... 1VB课件_数学_高中教育_教育专区。文档均来自网络,...双击在桌面上建立的VB6.0的快捷图标,即可打开VB6.0...


VB6.0课件第五章_图文.ppt

VB6.0课件第五章 - 第五章 VB的标准控件 教学目的要求: ? 应用: 文


VB6.0自学教程PPT精品课程课件全册课件汇总_图文.ppt

VB6.0自学教程PPT精品课程课件全册课件汇总 - XX学院 XX 专业 VB6.0自学教程 【全套课件】 授课人:XX XX 第1章 Visual Basic概述 Visual Bas...


VB6.0课件第三章_图文.ppt

VB6.0课件第三章 - 第三章 Visual Basic程序设计基础 教学目的


VB6.0课件第四章_图文.ppt

VB6.0课件第四章 - 第四章 数据的输入与输出 教学目的要求: ? 应用:


VB6.0教程--从入门到精通 课件-PPT精选文档_图文.ppt

VB6.0教程--从入门到精通 课件-PPT精选文档 - 第1章 步入VB开发之


VB6.0课件第十章_图文.ppt

VB6.0课件第十章 - 第十章 菜单程序设计 教学目的要求: ? 掌握与应用:


VB程序设计课件(全套)_图文.ppt

VB程序设计课件(全套) - Visual Basic 程序设计简明教程 第一章 Visual Basic程序设计概述(2) 第二章 VB简单的程序设计(6) 第三章 VB语言基础(4) 第四章...


Vb6.0教程_完整版_图文.ppt

Vb6.0教程_完整版 - Vb6.0教程 完整版 Visual Basic入门


《VB语言基础》PPT课件_图文.ppt

VB语言基础》PPT课件 - 第3章 Visual Basic语言基础 本章内容及要求: ? 掌握VB的数据类型; ? 掌握VB的 运算符和表达式的使用; ? 掌握常用内部函数的使用;...


VB6.0课件第十三章_图文.ppt

VB6.0课件第十三章 - 第十三章 数据文件 教学目的要求: ? 理解与应用


VB课件 (1)_图文.ppt

VB课件 (1) - Vb6.0教程 完整版 Visual Basic入门 第一


VB6.0入门教程_图文.ppt

VB6.0入门教程 - 第1章 Visual Basic概述 Visual Ba

网站首页 | 网站地图
All rights reserved Powered by 大学生考试网 9299.net
文档资料库内容来自网络,如有侵犯请联系客服。zhit325@qq.com