为什么英雄联盟取名特殊符号Tv两个字母也算特殊符号不能让取名字含有Tv?

当前位置: >>
VB6.0培训教案
Visual Basic 6.0 培训教案提前需要进行的环境安装准备: 1. Visual Basic 6.0 中文企业版 + SP6 2. 配套的 MSDN 中文版 3. 配套的 Visual SourceSafe 6.04. 5. 6. 7. Codejock Xtreme Suite Pro ActiveX 9.601 控件包 VS FlexGrid Pro 8.0 控件包 Axialis IconWorkshop 以及 IconExperience 图标套件 ComExplorer8. 非 Win98、Windows7、Vista 操作系统 1 Visual Basic 概述 1.1 IDE 集成开发环境: 1.1.1 布局与功能区: 运行 Visual Basic 6.0,在”新建工程”提示框处点击”确定”,就进入了 IDE 集成开发环境,如下 图所示:1) 菜单与工具栏: 缺省 VB 只显示了标准的工具栏,根据编程的需要,应该通过右键菜单将所有的工具栏 都显示出来并进行合理的排布,特别是其中的”调试”工具栏比较重要。 2) 窗体设置区域: 这里是模拟运行的效果所显示的窗体,可在上面进行控件拖放等可视化设计;根据所使 用控件的不同,不一定能完全达到所见即所得的效果。 3) 控件工具箱: 显示可用的控件图标,这里只缺省列举 VB 内置的标准控件。 4) 工程浏览器: 显示各个工程以及工程所包含的各种文件的树形浏览器;对一个工程组,可能包含多个 工程,都显示在浏览器中。 5) 属性浏览器: 用于显示窗体、或者窗体中当前所选择控件的属性列表;也可以显示工程浏览器中当前 所选择的其他文件的属性。 6) 窗体布局: 用于直观显示当前窗体在屏幕中的布局,可拖动其中的窗体改变屏幕位置;该区域一般 不使用,为增加其他区域的可视区域可将它隐藏。 开发过程中,根据可视区域尺寸的需要,以上各个区域都可以关闭或者通过工具栏上面的按 钮显示出来。 注:图例中有一些菜单、工具条、页卡与标准的 VB 环境有所区别,是因为安装了 CodeSmart 辅助编程插件。 1.1.2 可视化设计开发: 窗体缺省是处于设计状态,在设计状态下,点击控件工具箱上面的对应控件,然后在窗 体上面进行拖放,就添加了这个控件;在窗体上面摆放多个控件,并进行拖放排布,在属性 浏览器中设置它的相应属性,就是可视化设计的主要工作。 除了标准的内置控件外,可以在控件工具箱上面点击右键,选择”部件”(或者选择菜单”工 程\部件”),就会弹出第三方控件列表对话框,勾选对应的控件之后,在控件工具箱上面会增 加显示对应的控件图标。 在工程浏览器中,左上角的两个图标用于切换窗体的设计界面和代码书写界面,双击窗 体设计界面也可以切换到代码书写界面;代码书写界面类似下图:其中有两个下拉框,第一个下拉框定位具体的对象(窗体或者控件),第二个下拉框定位它的 具体某个事件,当事件函数在代码中不存在时,会自动产生。 除了事件函数外,也可能有一些自已书写的函数,可以在第一个下拉框中选择”(通用)”,然 后就可以在第二个下拉框中找到这些函数进行定位。 Visual Baisc 的代码都是由一个个的函数组成,所以又称为函数式编程。 在窗体界面设计好,代码编写完成之后,点击工具栏上面的”启动”按钮 (F5),即可运行程 序;运行程序有两种方式,一种是”启动”,一种是”全编译执行”(Ctrl+F5),全编译执行可以 检查出代码中的编译错误,从好的习惯出发,一般都应该使用”全编译执行”。 程序运行之后,如果要进行调试,可以点击工具栏上面的”中断”按钮 (Ctrl+Break),即进入 代码调试状态;如果要终止程序,可以关闭窗体,或者点击工具栏上面的”结束”按钮 。 1.1.3 VB 环境设置: 在使用 VB 环境进行开发之前,先可以进行一些基本的选项设置,但不是必须的。选择菜单” 工具\选项”进入选项设置,下面介绍几个常用的选项设置,其他的保持缺省即可: 1) 自动语法检测: 在”编辑器”页面,该选项一般情况下应勾上,这样在代码书写过程中,会自动对错误的 语法进行检查提示。 2) 要求变量声明: 在”编辑器”页面,该选项一般情况下应勾上,虽然 VB 支持不声明变量直接使用,但这 样是不严谨的,我们的规范也不允许。该选项勾上的情况下,代码窗体的最前面会自动 加上” Option Explicit ”关键字。 3) 代码颜色和字体: 在”编辑器格式”页面,这里面可以根据自身的情况,设置对应的颜色和字体。 4) 窗体网格设置: 在”通用”页面,根据自身情况,确定是否勾选”显示网格”和”对齐控件到网络”; 5) 错误捕获: 在”通用”页面,这个是比较重要的参数,影响程序调试。但具体选项的作用,我们在后 面错误调试的章节再进行说明。 另外 VB 开发环境是一个开放的环境,可以在 IDE 环境中加载插件以提供一些辅助编程的功 能,比如前面提到的 CodeSmart 就是一种插件;甚至可以自已使用 VB 开发插件(本培训课程 不涉及)。 加载插件的方法是选择菜单”外接程序\外接程序管理器”,就会弹出外接程序管理器,并列 举出可用的插件,选择对应的插件,并勾选”在启动中加载、加载/卸载”,然后在菜单中, 就会自动添加相应的功能项。 VB 缺省提供了一些有用的插件,下面简单介绍一下: 1) Source Code Control Add-In: 这个是与 Visual Source Safe 源代码管理器相集成的的一个插件,加载之后,可以直接方 便地在 VB 环境中进行源代码的管理和处理。关于 Visual Source Safe 的集成使用,后面 章节再进行介绍。 2) VB6 API Viewer: 一个 Windows 标准 API 的查询和函数定义生成器,方便进行 API 编程。 3) VB6 类生成工具: 辅助定义类,类的属性、方法、事件,设置类集合,并自动生成对应代码的工具;这个 工具可能经常使用。 4) VB6 资源编辑器: 当要把图片、 字符串等资源附加到工程中, 一并编译到文件中时, 需要使用到资源文件, 这个工具可以对资源文件中的内容进行编辑。关于工程中资源的访问,后面章节再进行 介绍。 1.2 VB 工程与文件类型: 1.2.1 可开发的工程与类型: 进入 Visual Basic 6.0 时,会提新建的工程类型。这里对我们常用的几种工程类型进行说明: 1) 标准 EXE: 开发 Windows 标准的 exe 可执行文件。 2) ActiveX DLL: 开发基于 COM 对象的 DLL 部件,通过开放公共的类接口来被其他程序所调用,其他程 序可以是支持 COM 部件调用的任何语言编写的;该 DLL 部件可能是系统中的业务组件 之一,也可能是一个公共功能的组件; 3) ActiveX EXE: 与 ActiveX DLL 类似,可通过开放公共的类接口来被其他程序所调用;但它是以 exe 的方 式出现,因此相对于调用它的主程序来说,ActiveX EXE 是在独立的进程中运行。 4) ActiveX 控件: 同样是基于 COM 对象的程序,但是以控件的形式提供让其他程序调用。 1.2.2 工程文件组成: 窗体只是 VB 工程中的一种文件,VB 工程(Project,prj)中可能包含的比较常用的文件类型如 下: 1) 窗体: Form,用于与用户进行交互,文件扩展名为 frm,文本格式,存放各个控件的属性,以 及窗体中的代码;如果窗体中包含二进制数据(比如窗体中有一张图片),就会产生同名 的 frx 文件。 2) 模块: Modual,用于存放全局使用的公共变量、公共函数,文件扩展名为 bas。 3) 类模块: Class, 用于实现 VB 中的类, VB 基于对象的编程就主要靠类模块实现, 文件扩展名为 cls。 4) 用户控件: UserControl,实现自定义控件时它是主要的界面设计文件,特性与窗体文件类似,扩展 名为 ctl,对应的二进制同名文件为 ctx。 5) 属性页: PropertyPage,实现自定义控件时,对控件的属性进行设置的窗体,特性与窗体文件类 似,扩展名为 pag,对应的二进制同名文件为 pagx。 6) 资源文件: Resource,用于存放工程中使用的,额外的图片、字符串等数据,与工程一起编译。二 进制格式,扩展名为 res,一个工程中只能有一个资源文件。 以上文件的名称都可以在属性浏览器中进行设置, 保存时的磁盘文件名缺省与所设置的文件 名称相同,但也可以强制保存为其他磁盘文件名,不过这样是很不规范的行为,容易给管理 造成混乱。 1.2.3 工程属性与启动: 1) 启动工程以及工程的启动对象: 在一个工程组中(Visual Basic Project Group、vbg),可以包含多个工程(比如一个类型 为标准 exe 的主工程, 若干个类型为 ActiveDLL 的业务部件工程), 但启动工程只有一个; 在 C/S 开发模式中,启动工程就是 exe 工程,在工程浏览器中选中 exe 工程名,点击右 键,选择”设置为启动”即可;当只有一个工程时,它缺省就是启动工程。 设置了启动工程,该工程启动的入口又有两种方式;一种是缺省以工程中添加的第 一个窗体作为启动入口;另一种是以模块文件中的 Main 过程作为入口(模块中定义的 Public Sub Main 或者 Sub Main),具体可以在工程属性的启动对象中设置;当要编写无界 面交互的程序,或者在窗体显示之前先要作一些特殊处理的程序来说,Sub Main 启动就 非常有用。 2) 工程属性: 在工程浏览器中选中某个工程名,点击右键,选择”&工程名&属性”即可弹出工程属性设 置框。工程有一些比较重要的属性,下面分别介绍: 1) “通用”页面:启动对象:前面已经说了,用于选择窗体启动,还是 Sub Main 启动。这个选项 主要针对 exe 工程,对于 dll、ocx 等工程,缺省为”(none)”。 2) “生成”页面:????版本号:设置当前工程部件所对应的版本号,每一位允许在 0-9999 之间设置; 在产品化的开发中,版本号非常重要;该属性在代码中可以通过 APP.Major、 Minor、Revision 读取。 注:在 Windows 的文件属性中看到的版本号格式是 4 段的,如 10.28.0.10,这 里的对应设置为 10.28.10。 应用程序: 标题用于设置对工程的简称,如”药房业务部件”,这个标题同时也是工程中调 用 MsgBox 函数进行消息提示框的缺省标题,该属性在代码中可以通过 APP.Title 读取。 图标用于设置工程编译后所生成文件的图标, 它是通过选择工程中的某个窗体, 而使用该窗体的图标作为工程编译文件的图标。 版本信息: 设置一些附加的工程信息,一般是跟版权相关的信息,包括”产品名、公司名、 合法版权、合法商标、文件描述 ” 等,在代码中可通过 APP.ProductName 、 CompanyName 等属性访问。工程被编译成文件之后,在 Windows 的文件属性 中也可以查看到这些信息。 命令行参数: 标准 exe 工程编译之后,由其他程序调用时可以传入命令行参数;如果在这里 输入命令行参数,就是让程序运行时,模拟进行传入,以方便程序进行调试。 3) “部件”页面:?版本兼容: 对于 ActiveX EXE/DLL/控件这几种类型的工程,都是以 COM 类来开放接口,在 编译生成文件时,与以前的版本的文件存在一个接口兼容性问题,在接口类的 定义、函数、参数等未发生变化,或者只发生了向下兼容性的变化时,应该选 择按”二进制兼容”模式进行编译,并指定要进行兼容检查的磁盘文件。 这个设置对于公用性质的部件特别重要,一旦不兼容了,使用公用部件的程序 就会出错,除非也重新编译使用公用部件的程序。 1.2.4 工程编译与发布: 工程编译的方法比较简单,选择菜单”文件\生成&工程名&”,然后指定要生成到的路径和文 件名即可,标准 EXE、ActiveX DLL、ActiveX EXE、ActiveX 控件编译时分别生成的是 exe、dll、 exe、ocx 文件。 要发布所编译的文件,需要将它所依赖的其他文件一并包含,依赖的的文件包括: 1) Visual Basic 6.0 的运行支持文件:msvbvm60.dll,放在系统目录 System32 下面。 2) 工程所使用到的控件文件,包括自定义控件和第三方控件文件,如 mscomct.ocx。 3) 工程所使用到的其他 DLL 组件, 包括自已编写的 ActiveX DLL, 以及第三方的公共组件等, 如 msscrrun.dll。 4) 工程中所涉及到要读写的其他独立文件。 注:VB 在编译过程中,可能会生成 lib、exp 等一些附加文件,这些文件在编译之后可以删 除。 1.3 VB 对象的基本概念: Visual Basic 6.0 是基于对象的编程,不是完全面向对象的编程,对象的继承、多态等特性不能很 好地处理;但使用对象编程仍是 VB 中很重要的功能,在日常工作中大量使用。 1.3.1 窗体对象: 前面提到的窗体,VB 中也是一种 Form 类的对象,它拥有属性、方法、事件,对 Form,也 完全可以按照类的构建方法,自已再增加属性、方法、事件;除了可以直接通过窗体名使用 窗体外,也可以通过对象使用模式,定义基于窗体类的对象,实例化之后进行使用,如下面 的代码:方法 1: Form1.Show 方法 2: Dim objForm as Form1? Set objForm = New Form1 objForm.Show1.3.2 类模块与对象: VB 中的类模块(Class)是专门用来定义类、实现对象处理的文件,定义使用一个对象的步骤如 下: 1. 在工程中添加一个类模块,并命名,比如 clsPerson 2. 在类模块中添加属性、 方法、 事件, 比如添加两个属性”Name、 Sex”, 添加两个方法”Eat、 Sleep”,添加一个事件”GetIll”。 3. 在窗体中定义一个对象变量,并实例化,如:Dim objPerson as clsPerson Set objPerson = New clsPerson 或者 Dim objPerson as New clsPerson4. 给该对象的属性赋值、读取,调用对象的方法。 5. 使用对象的事件比较特殊,需要使用 WithEvents 关键字,并且需要将对象定义为窗体模 块级的、单独使用 New 关键字进行实例化:Private WithEvents mobjPerson as clsPerson Private Sub Form_Load() Set mobjPerson = NewclsPerson End Sub Private Sub mobjPerson_GetIll() ?? End Sub Private Sub Form_Unload(Cancel As Integer) Set mobjPerson = Nothing End Sub也可以使用外接工具”类生成器实用工具”直观地定义类并自动生成相应代码;关于对象类型 的进一步说明,将在后续章节进行。 1.3.3 其他常用内置对象: VB 中有一些内置的对象,在日常开发工作中经常用到,下面进行简要介绍: 1) Me: Me 表示的是对象实例自身,在类模块内部使用,窗体也是一种类模块,因此在窗体中 使用得非常多。 比如在 Form1 内部的代码中, 我们可以书写 Me.Caption、 Me.TextBox1.Text; 通过 Me 关键字加”.”符号,在代码书写时可以快速找到要访问的属性、方法等;当然在 类里面,对于自身的属性、方法等,也可以不加 Me 前缀直接书写访问。 2) VB.APP: 当前应用程序对象,通过 APP 对象(可以不加 VB 前缀),能够读到当前工程相关的信息, 比如版本号(Major、Minor、Revision),产品名(ProductName)等。 3) VB.Clipboard: Windows 剪贴板对象,可以读取剪贴板中的当前内容,也可以向剪贴板写入数据。 4) VB.Screen: 当前屏幕对象,可以读取屏幕的尺寸,精度,活动窗体等信息。 5) VB.Printer: 当前打印机对象,能够读取和设置打印机、纸张等信息,并可以打印机输出文本、图形 等内容。关于打印机编程,在应用类产品中非常重要,后面的章节将对打印机编程作进 一步讲解。 除了 VB 内置的对象,Windows 和一些第三方厂商也提供了一些公共的对象库,可以在 VB 中使用,比如 ADO 数据库操作对象,FileSystemObject 文件操作对象等,要使用这些对象库 的方法如下: 1) 点击菜单”工程\引用”,将弹出”引用”对话框;对话框中列举了可以使用的公共对象库, 这些对象库都是基于 COM 的 ActiveX DLL/EXE,每个工程缺省引用了 VB 的一些内置库。 2) 找到对应要使用对象库,比如 Microsoft ActiveX Data Objects 2.6 Library,Microsoft Excel 12.0 Object Library。 3) 在代码中定义公共库的对象,并实例化,比如 Dim objSheet As New Excel.Worksheet,然 后就可以使用对象的属性、方法;如果要使用事件,则需使用 WithEvents 关键字定义模 块级对象。 窗体与控件常用属性: 以下表格中,列举了窗体和控件最常见的属性,但不是说所有的控件都一定具有这些属性。 属性名 Name Caption Appearance Alignment AutoRedraw BoderStyle BackColor ForeColor MaskColor UseMaskColor Font IMEMode√ √1.4窗体√ √ √控件√ √ √类型 字符 字符 枚举 枚举 布尔 枚举 数字 数字 数字 布尔 对象 枚举 名称,运行时只读 显示的文本标题说明一般有 3D、Flat 几种选择,表示窗体或控件的外观是平 面的还是立体的。 控件标题文本在内部的对齐方式 缺省为 False,当设置为 True 时,在窗体或者控件上面作 图时,不用去处理 Paint 事件重绘。 窗体或控件的边框样式,一般有无边框、单线边框、3D 边框等样式选择。 背景色 字体颜色或者画笔颜色 当控件具有背景图片时,对图片中 MaskColor 指定的颜 色进行屏蔽透明。 所指定的 MaskColor 颜色值是否生效。 字体属性,包括字体名、字号、粗体、斜体等 对于可输入类控件具有,表示控件激活时中文输入法的 状态,一般设置为:No Operation(不处理),ON(打开), Off(关闭),Disabled(禁用) 背景图片 控件的索引,使用控件数组时使用,否则缺省为空; Index&=0,同一种控件、名称相同,Index 不同的一组控 件成为一个控件数组。 焦点顺序索引,TabIndex&=0;按键盘上面的 Tab 键时, 焦点按 TabIndex 从小到大移动,按 Shift+tab 键反之。√ √√√√ √√ √ √√ √ √Picture Index√√ √对象 数字TabIndex√数字 TabStop√布尔缺省为 False,当为 True 时,表示按键盘 Tab 键时,焦点 不经过该控件;但该控件仍可获取焦点,仍可以强行用 鼠标点击获取焦点。 输入类控件具备,表示当前键盘光标所在输入内容中的 位置,值为 0-Len(内容)。 输入类控件具备,表示当前键盘光标在输入内容中所选 中的内容长度,如果没有选中内容,则为 0。 输入类控件具备,表示当前键盘光标在输入内容中所选 中的内容,如果没有选中内容,则为””。 用于存放额外的扩展数据,数据内容是自已定义的。 鼠标悬停提示的内容 窗体或者控件是否可用(不可用一般会置为灰色) 窗体或者控件是否可见 窗体或者控件相对于它所在的容器的位置和尺寸;窗体 的容器是屏幕。 缺省为 False,当设置为 True 时,表示窗体上面的所有按 键都先触发窗体的 KeyPress 事件,而不是先触发当前控 件的 KeyPress 事件。 表示窗体是否具有最大化、最小化、关闭按钮以及图标; 在运行时只读。 表示窗体运行时是否在 Windows 任务栏上面显示;在运 行时只读。 设置窗体运行时缺省在屏幕上所出现的位置,在运行时 只读。 手动:根据在窗体布局中所调整的位置进行显示。 所有者中心:显示在上层主窗体的中心。 屏幕中心:显示在屏幕的中心。 窗口缺省:不固定位置,由 Windows 系统控制。 窗 体 当 前 的 尺 寸 状 态 , 可 设 置 为 : Normal( 正 常 ) , Minimized(最小化),Maxmized(最大化);设计时和运行时 都可以设置。SelStart SelLength SelText Tag ToolTipText Enabled Visible Left、Top Width、Height KeyPreview√ √ √ √√数字 数字 文本 字符 字符 布尔 布尔 数字 布尔√√√ √ √ √ √√ControlBox ShowInTaskBar StartUpPosition√布尔 布尔 枚举√√WindowState√枚举1.5窗体与控件常用事件: 1.5.1 窗体的使用及事件 要显示一个窗体,有几种办法。 1) 直接使用窗体的 Show 方法:Private Sub Form_Click() Form2.Show 0,Me End SubShow 方法的第一个参数表示是否以模态方式显示,1 表示模块,0 表示非模态(缺省); 第二个参数表示该窗体的主窗体,如果有主窗体,那么当主窗体最小化时,该窗体也会 最小化,当主窗体关闭时,该窗体也会自动关闭;这两个参数都是可选参数。 2) 定义窗体对象,再调用 Show 方法: 窗体是 VB 中的一种类, 前面直接调用 Show 方法的方式并没有通过创建窗体对象来处理, 这样是 VB 在后台自动创建一个窗体对象实例,但这样这个窗体只能有一个实例存在, 即只能同时打开一个;上例中,第 2 次点击 Form1 时,只是将已经显示出来的 Form2 激 活而已。 我们可以采用以下方法:Private Sub Form_Click() Dim objForm As New Form2 objForm.Show , Me End Sub这样每次点击 Form1 时,都是重新打开并显示一个新的 Form2 窗体。 3) 先加载窗体,再显示出来:Private Sub Form_Click() Dim objForm As New Form2 Load objForm ?? objForm.Show 1, Me End Sub这个方法是先将窗体对象 Load 加载到内存(激活窗体的 Load 事件),但暂时不显示,这 时可以作一些其他的处理,完成之后,再将窗体显示出来。 4) 自已定义窗体的 Show 方法: 窗体作为一种类,也可以定义其自已的方法,特别在需要传递额外的参数的时候,我们 可以人为定义一个 Show 方法,如:Form2 的代码: Public Function ShowMe(frmParent as Object, byVal strName as String) as Boolean ?? Me.Show 1,frmParent ShowMe = True End Function Form1 的代码: Private Sub Form_Click() Form2.ShowMe txtName.Text End Sub要关闭一个窗体,除了交互操作关闭外,在代码中可以使用以下方法: 1) 使用 Unload 语句: 如一般在窗体的退出按钮中书写:Unload Me 2) 使用 Hide 方法: 如 Me.Hide;但 Hide 只是将窗体隐藏掉,并没有清除窗体实例;最后还是要使用 Unload 语句。 从窗体从打开到关闭这个过程中,发生的事件以及顺序如下: 1) Form_Initialize: 窗体初始化 2) Form_Load: 窗体加载,这个时候窗体还没有显示出来;和 Initialize 相比,Load 事件用得较多一些; Initialize 中主要是进行一些比较低级和底层的初始化(如 Windows API 处理)。 3) Form_Resize 在窗体加载完成之后,没有显示出来之前,先要激活一次 Resize 事件,以根据设计时的 布局调整窗体及控件。 4) Form_Activate 窗体激活; 窗体第一次显示出来之前, 必然会激活一次 Activate 事件。 后续使用过程中, 也可能再激活该事件。 5) Form_QueryUnload (Cancel As Integer, UnloadMode As Integer) 窗体被界面交互关闭、或者调用 Unoad 代码时,会先激活该事件;该事件主要是查询窗 体被关闭的原因,并且提供阻止关闭的手段。 UnloadMode 的参数含义如下: 参数值 vbFormControlMenu vbFormCode vbAppWindows vbAppTaskManager vbFormMDIForm vbFormOwner 数值 0 1 2 3 4 5 含义 用户从窗体上的“控件”菜单中选择“关闭”指令 Unload 语句被代码调用 当前 Microsoft Windows 操作环境会话结束 Microsoft Windows 任务管理器正在关闭应用程序 MDI 主窗体关闭导致当前 MDI 子窗体被关闭 窗体的主窗体被关闭导致当前窗体被关闭根据窗体被关闭的原因,可以将 Cancel 参数置为 1,即可取消窗体的关闭。 6) Form_Unload (Cancel As Integer) 窗体对象被卸载的过程,与 QueryUnload 相比,Unload 事件更多的被用来销毁跟窗体相 关的一些变量、对象,而 QueryUnload 更多的用来作一些特殊判断处理。 7) Form_Terminate 窗体终止 1.5.2 键盘事件 窗体以及大部分的控件都具有以下键盘事件响应: 1) KeyDown/KeyUp(KeyCode As Integer, Shift As Integer) 我在键盘上按一个键或者组组合键时(如 Ctrl+F),会先后激活 KeyDown/KeyUp 事件,这 两个事件能够截获绝大部分的键盘按键; 每一个按键都有一个对应的按键代码,这些按键代码大部分也对应有 VB 常量,如 vbKeyEscape,vbKeySpace,vbKeyA; Shift 则指出组合键的情况,如 vbCtrlMask、vbAltMask、vbShiftMask;如果是几种组合键 同时按下,则是这几个值相加。 2) KeyPress(KeyAscii As Integer) 当按键时,KeyPress 事件在 KeyDown 之后、KeyUp 之激活;KeyPress 事件主要用于捕获 一般的字符按键,对于控制键和组合键则适合使用 KeyDown 事件;因此 KeyAscii 事件参 数主要是所按下字符的 ASCII 码,当然一些特殊按键也能被 KeyPress 事件捕获,比如 BackSpace 键,它的 ASCII 码是 8。 与 KeyDown 事件所不同的是,在 KeyPress 事件中,可以通过将事件参数 KeyAscii = 0 来 使按键无效,而 KeyDown 事件中的 KeyCode 参数则没有这个效果。 另外当窗体的 KeyPreview 属性为真时,如果窗体中当前焦点在某个控件上面,这时当键盘 按下时,是先激活窗体的键盘事件,再激活该控件的键盘事件;反之则只激活该控件的键盘 事件。 1.5.3 鼠标事件 窗体以及大部分的控件都具有以下鼠标事件响应 1) MouseDown/MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single) 当鼠标按下或者弹起时激活; Button 表示具体按的哪个键,1 表示左键、1 表示右键、4 表示中间按钮; Shift 表示按下鼠标时,同时按下了键盘的组合键,具体与键盘 KeyDown 事相同; X、 Y 则表示当前的鼠标位置, 注意这个鼠标位置是相对于当前窗体或者控件的左上角的。 2) MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) 当鼠标在窗体或者控件上面移动时激活,各事件参数与 MouseDown 事件相同。 3) Click: 鼠标单击事件,没有事件参数。当单击鼠标时,该事件在 MouseDown/MouseUp 之后激 活。 4) DblClick: 鼠标双击事件,没有事件参数。当双击鼠标时,该事件在 MouseDown/MouseUp/Click 之 后激活。 1.5.4 编辑事件 对于可进行数据的编辑的控件(如 TextBox、ComboBox 等),一般都具有以下事件: 1) Change 当编辑控件中的内容发生变化时激活;内容发生变化可能是因为键盘输入,也可能是因 为代码直接赋值,都将激活 Change 事件。 2) Validate(Cancel As Boolean) 在界面交互过程中,当编辑控件中的内容输入完成,转移焦点时激活;该事件的主要目 的是对所输入内容的正确性进行校验,如果检查发现输入内容不符合要求,可以通过将 事情参数 Cancel =1 来阻止进行焦点转移。 注:转移焦点也会激活 LostFocus 事件,但所不同的是 LostFocus 是强制性的,不能阻止 这个过程。 1.5.5 拖放事件 窗体以及大部分的控件都支持拖动的处理,利用拖动的事件、方法我们可以实现鼠标拖动应 用。拖动的启动有两种方式: 1) 手动: 这个时候窗体或者控件的 DragMode=0 (VbManual,缺省),需要在代码中调用 Drag 方法 进行启动: Drag &Action& Action= vbBeginDrag(开始拖动=1)、vbEndDrag(结束拖动=2)、vbCancel(取消拖动=0) 2) 自动: 这个时候窗体或者控件的 DragMode=1(VbAutomatic),这时不需要使用代码,直接使用 鼠标点击控件进行拖动即可。 在拖动的过程中,会激活下列事件: 1) DragOver(Source As Control, X As Single, Y As Single, State As Integer) 当拖动对象经过某个控件或者窗体时,这个控件或者窗体会触发 DragOver 事件: Source:表示被拖动的来源控件 X/Y:被拖动的控件在当前控件或者窗体中的坐标 State:被拖动的控件在当前控件或者窗体中的状态,分别有 0=进入,1=离开,2=经过 2) DragDrop(Source As Control, X As Single, Y As Single) 当拖动对象在某个控件或者窗体上面完成拖动(松开鼠标按钮或者调用 Drag 方法),会触 发该控件或者窗体的 DragDrop 事件,事件参数含义同 DragOver。 1.5.6 其他事件: 1) GotFocus/ LostFocus 无事件参数;当控件获取到键盘输入焦点,或者失去焦点时激活。 1.6 常用键盘快捷键: 下表列举了在实际工作中最常用的,Visual Basic 6.0 IDE 环境中的快捷键,经常使用快捷键,可以 提高工作效率;当这些快捷键也可以通过菜单功能进行执行: 功能 保存当前文件 运行程序 全编译执行 切换上一个/下一个函数定义 定位到当前光标所在函数的函数定义处 显示当前光标所在函数的函数定义提示 弹出当前光标所在对象的属性、方法列表,类 似输入”.”操作符 查找/查找下一个 替换 光标定位到当前代码文件的最前面/后面 定位到行最前/第一个字符处 按整行选择代码 按关键字选择代码 中断程序进入调试状态 将当前代码行设置为断点(包括在运行时) 从当前断点处逐条语句执行(要进入子函数) 从当前断点处逐个过程执行 将下一条执行语句从当前断点处跳转到当前光 标所在的代码行 2 快捷键 Ctrl+S F5 Ctrl+F5 Ctrl+↑/↓ Shift+F2 Ctrl+I Ctrl+J Ctrl+F,F3 Ctrl+H Ctrl+Home/End Home Shift+↑/↓ Ctrl+Shift+→ Ctrl+Break F9 F8 Shift+F8 Ctrl+F9Visual Basic 编程基础 2.1 简单数据类型 2.1.1 基本数据类型 1. 数值类型: 数值型数据可分为以下几类。 1) Integer(整型) 整型数是不带小数点和指数符号的数,每个整型数据占用 2 个字节(16 位)的存储空 间,其类型声明符为“%” ,其取值范围为-3 之间的整数。 2) Long(长整型) 长整型数也是不带小数点和指数符号的数, 每个长整型的数据占用 4 个字节(32 位) 的存储空间,其类型声明符为“&” ,其取值范围为-~ 之间 的整数。 3) Single(单精度浮点型) 单精度浮点型数是带小数的数值,通常以指数形式(科学记数法)来表示,以“E”或 “e”表示指数部分。每个单精度浮点型数据占 4 个字节的存储空间,可以精确到 7 位,其正数的取值范围为 1. ~ 3. ,其负数的取值范围为 -3.~-1.,其类型声明符为“! ” 。 4) Double(双精度浮点型) 双精度浮点型数也是带有小数的数值, 通常也以指数形式(科学记数法)表示, 以 “D” 或“d”表示指数部分,双精度浮点型数占 8 个字节的存储空间,可以精确到 15~ 16 位,其正数的取值范围为 4.47E-324~1.32E+308,其负 数的取值范围为 -1.32E+308~-4.47E-324,其类型声明符为 “#” 。 5) Currency(货币型) 货币类型是为计算货币而设置的数据类型, 它也是一种固定小数点位置的数据类型, 占用 8 个字节的存储空间,其小数点左边有 15 位数字,右边有 4 位数字,其取 值范围为-477.07,其类型声明符为“@” 。 6) Byte(字节型) 字节型数据用于存储二进制数据, 占用 1 个字节的存储空间, 其取值范围为 0~255。 注:关于类型声明符,在随后的常量与变量章节中将涉及到它的具体使用方法。 2. 字符类型(String): 字符串类型数据用来定义一个字符序列, 由 ASCII 字符组成, 包括标准的 ASCII 字符 和扩展 ASCII 字符,其类型声明符为“$” ;在 Visual Basic 中,字符串必须放在双引号 内,其中长度为空的字符串称为空串,例如&ABC&、&& (空串)。字符串型数据分为两种: 一种为变长字符串, 它能够包含字符的个数是可变的, 随着对字符串变量赋予新值, 它的长度随之发生变化,所占用的存储空间是该字符串长度再加上 10 个字节; 一种为定长字符串,即在程序运行中始终保持其长度不变的字符串,其中每个字符 都占用一个字节的存储空间,因此定长字符串所占用的存储空间就是该字符串所指定的 长度。例如,声明一个长度为 5 的定长字符串变量:Dim A As String*5 VB 中没有单独的字符类型(单个字符 Char),都使用 String 表示。 注:如果在一个字符串中要包括双引号字符,可以用两个双引号表示,如&我的名称 叫&&张三&&。& 3. 布尔类型(Boolean): 布尔型数据是一个逻辑值, 它占用 2 个字节的存储空间, 只能取两个值, 即 True(真) 和 False(假)。 4. 日期类型(Date): 日期型数据用来表示日期,它占用 8 个字节的存储空间,可以表示的日期范围从公 元 100 年 1 月 1 日到 9999 年 12 月 31 日,而表示的时间可以从 0:00:00 到 23:59:59。表 示日期的常数必须以“#”括起来,如:X = #1:38 #。 一个日期型数据同时包含了日期和时间两个部分的数据,没有单独的时间类型。 2.1.2 可变数据类型(Variant) 可变类型数据是一种通用的、动态可变的数据类型,它可以用来表示任何类型的数据(除 了用户自定义类型),可变类型变量可以在同一程序运行期间放置不同类型的数据,系统会 自动完成必要的转换,例:Dim MyVariant as Variant MyVariant = &25& '在进行数值运算时, 系统自动将 MyVariant 转换成数值类型的数据,进行运算,并以数值型的数据存储 MyVariant = MyVariant - 10没有声明而直接使用的变量,或者声明时没有指定类型的变量,都是按可变数据类型处理。 2.2 常量与变量 变量和常量是 Visual Basic 程序中最基本的数据元素,程序中的数据大多是以变量和常量的形式 出现的。可以说常量和变量是程序中都存在的基本量。但是在不同的语言中,它们的表现形式是 不同的。掌握变量和常量的表达方法是 Visual Basic 语言编程的基础。所谓常量是指在程序执行 期间,其值是不能发生变化的数据;而变量的值是可以变化的,它代表计算机内存中指定的存储 单元。 2.2.1 常量 常量是指在程序执行期间它的值不会发生变化的数据,在 Visual Basic 中常量分为两种,一 种是文字常量,另一种则是符号常量。 1. 文字常量 文字常量分为数值常量、字符串常量、逻辑型常量和日期型常量等。 1) 数值常量 数值常量又分为整型常量、长整型常量、浮点型常量和货币型常量等。 ? 整型和长整型常量 在 Visual Basic 中可以使用十进制、 八进制和十六进制来表示整型和长整型常量, 十进制数值的表示方法与人们日常的表示方法相同,例如:235;如果在数字的 开头加上前缀&O(字母 O),则所表示的是八进制数值,例如:&O315;如果在数 字的开头加上前缀&H,则表示的是十六进制数值,例如:&H418。 需要说明以下两点: ① 如果所表示的数值大小没有超过整型数据的范围(-3)时,系统 会认为它是整型数,在内存中以 2 个字节存放它,如果所表示的数值大小 超过了整型数据范围,则系统认为它是长整型数,以 4 个字节存放它。 ② 用户还可以根据需要来设置某一个数据为长整型数, 其方法是在某一个整型 常量的后面加上类型声明符“&” ,则该整型数被设置为长整型数,它们数 值是相同的,但占用内存不一样,即整型常量占用 2 个字节,而长整型数 则占用 4 个字节。 ? 浮点数常量 浮点数常量可分为单精度浮点数和双精度浮点数,浮点数由尾数、指数符号和 ± ± 指数 3 部分组成,用 mE n 或 mD n 来表示;其中 m 为尾数,它用实数表示, 指数符号是 E(表示单精度)或 D(表示双精度),n 为指数,它必须是整数;指数符 号 E 或 D 的含义是 m 乘上 10 的幂次,例如:3.145E+3 表示的数值为 3145。 ? 货币型常量 货币型常量是指货币类型数据的常量表示形式。 2) 字符串型常量 所谓字符串型常量是指用双引号括起来的一串字符(也可以为汉字),如: &Visual Basic&、&&、&ab56&、&1234&等。 3) 逻辑型常量 逻辑型常量很简单,只有两个值,即 True 和 False。 4) 日期型常量 日期型常量是指用 # 号括起来的一串日期,它可以表示日期、时间,其格式为: #yyyy-MM-dd[HH:mm:ss]#;当时间部分为 00:00:00 时,可以只书写日期部分。 2. 符号常量 所谓符号常量是用一个被定义的标识符代替数值和字符串, 定义符号常量的一般格式为: Const 常量名 = 表达式[,新常量名 = 表达式] 其中符号常量名必须符合 Visual Basic 标识符的定义方式, 表达式可以由文字常量、 算术 表达式及逻辑运算符组成,但不能使用字符串连接运算符变量及用户定义的函数或内部 函数;例:Const A1 = 3.14 Const B1 = 2*A1 '定义了一个单精度常量 '定义了一个单精度常量Const C1 = &abcd& '定义了一个字符串型常量2.2.2 变量 几乎所有编程语言都要用到变量,变量的实质是指在程序运行过程中,其值可以改变的量。 一个变量应该有一个名字,即变量名,在内存中占据一定的存储单元。在该存储单元中存放 变量的值称为变量值。为了通知计算机为变量留出所需要的空间,就需要对变量的类型进行 说明,这一过程称为声明,除了对变量进行命名和类型说明以外,还必须规定该变量的使用 范围。在 Visual Basic 中,变量的有效范围是不同的,按照其使用范围可以将变量分为过程 级变量、模块级变量及全局变量,下面将分别介绍变量的命名规则及变量的声明等内容。 1. 变量的命名规则 在 Visual Basic 中,给变量命名时应遵循以下规则: 1) 变量名只能由字母、数字和下划线组成。 2) 变量名的第一个字符必须是英文字母。 3) 变量名的有效长度为 255 个字符,而且名字的有效字符为前 40 个,后面的字符只 为了增加易读性,对于区分不同的变量无效。 4) 不能使用 Visual Basic 保留字作为变量名,但可以把保留字嵌入变量名中,例如,不 能将变量命名为 DIM(因为 DIM 是 Visual Basic 中的保留字), 但可以命令为 MYDIMS。 在 Visual Basic 中,变量名、过程名、符号常量名、记录类型名和元素名等都遵循上 述规则。 在 Visual Basic 中,不区分变量名中字母的大小写,abc、ABC、aBc 指的是同一个 名字。 2. 变量的声明 在 Visual Basic 中,变量需要声明,声明的过程就是通知系统准备使用哪些变量,该 变量需要多大的存储空间,以便系统将其存储到计算机的内存中。 声明变量的位置在过程代码的最前面,以及模块(包括窗体等)代码的最前面;但对于 过程中的变量,也可以在任意位置进行声明,只要是在使用它之前。 变量的声明有两种,即显式声明和隐式声明。显式声明是用相应的语法声明变量, 声明的变量具有所声明的数据类型;隐式声明是不经声明直接使用变量,变量自动具有 Variant 类型。 1) 变量的显示声明 在变量的显示声明中又分为以下几种方式。 ① 用 DIM 语句声明过程变量 DIM 语句用于在模块(包括窗体等)的过程中声明变量,DIM 声明的变量为过程 变量,过程变量的有效使用范围是在该过程内部,其声明变量的格式为: DIM 变量 1 As 数据类型[,变量 2 As 数据类型] [,……] 例如: DIM My2 As String DIM My1 As Integer,M3 As String 可以使用类型声明符以简化的方式声明变量,如 Dim My1 As Integer 可以书写 为 Dim X%。 ② 用 Static 语句声明静态过程变量 Static 语句用于在模块(包括窗体等)的过程中声明静态变量,Static 声明的变量 也是过程变量,其一般格式为: Static 变量名 As 类型名 例如: Static A As Integer 用 Static 语句声明的变量称为静态变量。静态变量的特点是第一次执行某个过 程时,系统为变量分配了一个存储单元,当退出这个过程,存储单元的值将保 留,下次再调用此过程时,该变量的初值就是上次被保留的值。 例如:Private Sub Command1_Click() Static M1 AsInteger Print M1 M1 = M1 + 2 End Sub当用户单击 Command1 按钮时,该事件过程被调用,此时系统对 M1 赋予默 认值 0,然后打印 M1 的值 0,接着执行语句 M1=M1+2,M1 值为 2。由于变 量 M1 是静态变量,其值将保留下来,当再次单击 Command1 按钮时,该事件 过程又被调用,变量 M1 的初始值不再为 0,而是上次保留的 M1 的值,即 M1 值为 2。 ③ 用 Private 语句声明模块变量 Private 语句用于在模块(包括窗体等)中声明变量,用 Private 声明的变量为模块 变量,模块变量的使用范围是在模块内部的各个子过程中,声明模块变量的一 般格式为: Private 变量名 As 类型名 例如: Private A As Integer 需要注意的是,在声明模块变量时,使用 Dim 也等同于 Private。 ④ 用 Public 语句声明全局变量 Public 语句用于在模块(包括窗体等)中声明变量, 用 Public 声明的变量为全局变 量,全局变量的有效使用范围是在当前整个工程中的所有地方;声明全局变量 的一般格式为: Public 变量名 As 类型名 例如: PublicA As Integer 如果是在窗体模块中声明的全局变量,在其他模块中是无法直接访问的,可以 通过加上窗体前缀进行访问,如”Form1.gstrVar ”,或者”objForm.gstrVar ”。 2) 变量的隐性声明 隐性声明的变量都是过程变量,变量的隐性声明方法有以下两种: ① 在代码中不对变量进行声明而直接使用,则此变量默认的数据类型为 Variant。 ② 可以省略声明语句,而在变量名的尾部加上变量类型声明符来使变量被隐性声 明为某种类型的变量,例如:A% = 300 3. 变量的初始值 变量在使用之前,一般都要求先赋予初始值;在 Visual Basic 中,变量在声明之后即 具有初始值,可以直接使用。 对简单数据类型的变量,初始值为 Empty,Empty 是一个通用关键字,对不同的数据 类型,它等价于不同的值: 1) 数值类型:Empty 等价于 0 2) 字符类型:Empty 等价于空串&&,也等价于另一个关键字 EmptyString 3) 日期类型:Empty 等价于# 00:00:00# 4) 布尔类型:Empty 等价于 False 对于对象类型的变量,初始值为 Nothing,可使用”Is”关键字来判断对象是否尚未进 行初始化,如:objTest Is Nothing;关于对象类型在后续章节进一步介绍。 Visual Basic 中另外有一个关键字 Null, Null 与 Empty 不同, Null 表示不具有有效数据, 主要用于 Variant 类型,可使用 IsNull()函数来进行判断;如果把 Null 值赋给明确类型的 变量,将会出现”无效使用 Null”错误。 2.3 运算符与表达式 在程序设计语言中用不同的符号描述不同的运算形式,这些符号称为运算符,而运算的对象 就称为操作数,由运算符将操作数接起来的合法的式子构成了表达式。例如:A+5、3*5*6 等都 是表达式,单个变量式常量也可以看成是简单的表达式。 Visual Basic 提供了丰富的运算符和表达式。这些运算符和表达式包括算术运算符和算术表达 式、字符串运算符和字符串表达式、关系运算符和关系表达式、逻辑运算符和逻辑表达式等。 2.3.1 算术运算符与算术表达式 1. 算术运算符 算术运算符是常用的运算符,用来执行简单的算术运算,Visual Basic 提供了 8 个算术运 算符,下表按优先级列出了这些算术运算符: 运算符 ^ * / \ Mod + 乘方 取负 乘 除 整除 取模 加 减含义 1 2 3 3 4 5 6 6优先级说明: 1) 指数运算 指数运算用来计算求方和方根,其运算符为“^” ,例如:3^2 表示为 3 的平方。当 指数是一个表达式时,必须加上括号,例如:X 的 Y+Z 次方,必须写成 X^(Y+Z)。 2) 浮点数除法与整数除法 浮点数除法运算符( / )执行标准除法操作, 其结果为浮点数, 例如: 5/4 的值为 1.25。 整数除法运算符( \ )执行整除运算, 运算结果为整型数。 整除的操作数一般是整型值, 当操作数带有小数时,首先被四舍五入为整型数或长整型数,然后进行整除运算, 其运行结果只截取整数部分, 小数部分不做四舍五入处理。 例如: 8\3 的结果为 2, 24.6\2.8 的结果为 8。 3) 取模运算 取模运算符 Mod 用来求余数,其结果为第一操作数除以第二个操作数所得的余数, 当操作数带有小数时,首先被四舍五入为整型数,然后求余数。例如:8 Mod 5 的 结果为 3,24.6 Mod 2.8 的结果为 1。 2. 算术表达式 算术表达式又叫数值型表达式,它由算术运算符、数值型常量和变量、函数和圆括号组 成,它的运算结果是一个数值。例如: 3 3+5.6 5+Sin(x) 2.3.2 字符串运算符与字符串表达式 字符串运算符有两个,即“&”和“+” ,其功能都是将两个字符串连接起来。但由于“+” 运算符还有做加法的含义,容易造成混乱,所以做字符串连接运算时最好还是使用“&”运 算符。例如: A1=&BCDE& A2=&FGHI& A3=A1+A2 'A3 的值为&BCDEFGHI& 或 A3=A1&A2 'A3 的值也为&BCDEFGHI& 字符串表达式由字符串变量、常量、函数和运算符组成。 2.3.3 日期运算符及日期表达式 日期类型在系统中本质上是按 Double 数值类型进行处理的,因此日期类型之间、日期类型 和数值类型之间也可以进行各种算术运算,如+-*/等; 日期类型与数值类型混合运算时,数值类型的数字 1 表示日期中的 1 天,数字 1.5 表示日期 中的 1 天 12 小时,1/24 表示日期中的 1 小时,1/24/60 表示日期中的 1 分钟,其他以次类 推计算; 在实际工作中,比较有意义的运算包含以下几种: 1. 日期+数值: 在日期的基础上,增加相应的天数、小数、分钟、秒,结果为日期类型,如: ## + 1 + 2/24 结果为
02:00:00 2. 日期-数值: 在日期的基础上,增加相应的天数、小数、分钟、秒,结果为日期类型,如: ## - 1 - 2/24 结果为
22:00:00 3. 日期-日期: 取两个日期之间的间隔天数,结果为一个数值;如果结果包含小数,则表示间隔中包含 不足一天的小时、分、秒;如: ## - # 12:00:00#结果为 0.5 2.3.4 关系运算符与关系表达式 1. 关系运算符 关系运算符也称为比较运算符,用来对两个表达式的值进行比较,比较的结果是一个逻 辑值,即真(True)或假(False)。 Visual Basic 把任何非 0 的值都看成是 True,但一般以“-1”表示,0 则表示 False;关系 运算符既可以进行数值比较也可以进行字符串、 日期类型的比较。 Visual Basic 提供了 6 个关系运算符,如下表所示: 关系运算符 & &= = 大于 大于等于 等于 含义 & &= && Like 关系运算符 小于 小于等于 不等于 字符串匹配 含义Like 是一个特殊的关系运算符, 只用于字符串数据, 用来比较两个字符串是否部分匹配, 在比较的字符串中,可以使用通配符: *:表示零个或多个任意字符 ?:表示单个任意字符 #:表示单个任意数字 比较的结果为匹配(True)或者不匹配(False),例如:ABCDE Like &A*E& 2. 关系表达式 关系表达式是由关系运算符将两个数值表达式或两个字符串表达式连接起来的式子。关 系表达式的值是一个布尔类型的值,只有 True 或 False 两个取值。下面是合法的关系 表达式: 5=3+2 表达式的值为真 5&2 表达式的值为假 2.3.5 逻辑运算符与逻辑表达式 1. 逻辑运算符 逻辑运算符用于对两个表达式进行逻辑运算,结果是逻辑值 True 或 False。Visual Basic 提供的逻辑运算符有 6 种,如下表所示: 逻辑运算符 Not And Or 含义 逻辑非 逻辑与 逻辑或 1 2 3 优先级 逻辑运算符 Xor Eqv Imp 含义 逻辑异或 逻辑等于 逻辑蕴含 4 5 6 优先级如果用 A 和 B 分别代表任意两个操作数,而用 T 代表逻辑真,用 F 代表逻辑假,则 各种逻辑运算符的运算结果如下表所示: 操作数 A 操作数 B Not A A And B A Or B A Xor B A Eqv B A Imp B F F T F F F T T F T T F T T F T T F F F T T F F T T F T T F T T2. 逻辑表达式 用“逻辑运算符”连接两个或多个逻辑量组成的式子称为逻辑表达式,该表达式的返回 值只有两种可能,即真(True)和假(False)。例如,下面都是合法的逻辑表达式: Not(2&8) 其结果为 True (3>8)And(7<3) 其结果为 False 2.3.6 表达式的运算顺序 前面提到的所有类型以运算符都有运算优先级的问题, 在一个表达式中可以包含不同类型的 运算符和函数,每一种运算都有执行的先后顺序,当不同类型的运算符出现在同一个表达式 中时,计算机按一定的顺序对表达式求值,其一般顺序如下。 1. 首先进行函数运算,其优先级最高。 2. 其次进行算术运算,其次序按算术运算符的优先级由高到低依次为: ^ →取负→ * →M→→ Mod→+→- 另外字符串运算、日期运算也属于算术运算相同等级。 3. 然后进行关系运算 4. 最后进行逻辑运算,其次序按逻辑运算符的优先级由高到低依次为: Not→And→Or→Xor→Eqv→Imp 需要注意两点: 1. 在同一个表达式中所有同一级运算都按从左到右的顺序进行。 2. 括号可以改变运算的优先顺序,括号内的运算必须先执行。 例如,下列表达式中运算的优先顺序为: 7/Sin(z*x)&3 Or(x*3)^(-5) +8&600 ⑤②①⑦⑨①④③⑥⑧ 2.4 类型转换与常用函数 2.4.1 数据类型转换 Visual Baisc 不是强制类型的语言,不同的数据类型,只要它们的值是兼容的,就可以自动进 行相应转换,比如:Dim n As Integer n = &12345&'字符串自动转换为整数 n = 123.45'浮点值自动转换为整数 Dim d As Date d = &&'字符串自动转换为日期但是需要注意的是,如果自动转换过程中数据类型值不兼容,则会出现”类型不匹配”的运行 时错误。 除了自动转换外,也可以显式地通过类型转换函数明确地进行类型转换,如 cInt(“12345”)就 是将字符串转换为整数类型,其他类似的函数有:cLng、cDbl、cSng、cStr、cBool、cDate 等; 使用类型转换函数同样要求转换的数据值兼容,否则也会出现”类型不匹配”错误。 但 Visual Basic 也提供了一些函数,可以在类型转换之前,提前判断要转换的数据是否符合要 求,例:Dim d As Date Dim s As String s = && If IsDate(s) Then s = s End If类似的函数有 IsNumeric、IsDate、IsArray。 2.4.2 常用基础函数 Visual Basic 为各种类型的数据提供了一些内置的基础函数,下表列举了实际工作中常用的一 些函数: 1. 数值函数: ? Int/Fix(number) 删除 number 的小数部份而返回剩下的整数。 Int 和 Fix 的不同之处在于,如果 number 为负数,则 Int 返回小于或等于 number 的第一个负整数,而 Fix 则会返 回大于或等于 number 的第一个负整数。例如,Int 将 -8.4 转换成 -9,而 Fix 将 -8.4 转换成 -8。 ? Val(String) 将一个字符串中的内容强制转换为数值,与 cDbl 不同的是如果转换的数据不兼容, 它不会出现错误而只是返回 0。 ? ?Round(number,n) 将 number 四舍五入到小数点后第 n 位。 Rnd 返回一个包含随机数的 Single 值,0&=Rnd&1;在调用 Rnd 之前,先使用无参数的 Randomize 语句初始化随机数生成器,该生成器具有根据系统计时器得到的种子; 为了生成 a~b 范围内的随机整数,可使用以下公式: Int((b- a + 1) * Rnd + a) 为了生成 1~x 范围内的随机整数,可使用以下公式: Int(x * Rnd + 1)2. 字符串函数: ? Len(string) 返回字符串的长度;汉字当成一个字符计算,如果要计算汉字所占字节长度,可以 使用 LenB 函数;以下字符串函数类似。 Mid(string, start,length) 返回从字符串 string 的第 start 位开始,取 length 长度的字符数。如: Mid(&ABCDE&, 3, 2) = &CD& InStr(string1,string2) 返回字符串 string2 在字符串 string1 中的起始位置, 如果 string2 不包含在 string1 中, 则返回 0。如: Instr(&ABCDE&,&CD&) = 3 Instr(&ABCDE&,&&) = 1 Left/Right(string, length) 返回字符串 string 左边或者右边的长度为 length 的字符数,如: Left(&ABCDE&, 2) = &AB& Right(&ABCDE&, 2) = &DE& Ucase/Lcase(string) 将字符串 string 中的字符都转换为大写或者小写后返回,如: Ucase(&abcde&) = &ABCDE& Lcase(&ABCDE&) = &abcde& Ltrim/Rtrim/Trim(string) 去掉 string 左边/右边/两边的空格 Replace(string, string1, string2) 将字符串 string 中的子串 string1 全部替换为子串 string2 之后返回,如: Replace(&This Is a Test&, &&, &_&) = &This_Is_a_Test&????? ?3. 日期函数: ? Date() 返回当前日期,不包含时间部分(或者说时间部分为 00:00:00)。 ? Time() 返回当前时间,不包含日期部分(或者说日期部分为 )。 ? Now() 返回当前日期和时间 ? ?Year/Month/Day/Hour/Minute/Second(date) 单独返回日期值 date 中的年份、月份、天、小时、分、秒的值。 Timer() 以 Single 类型返回从午夜 00:00:00 开始到现在已经过的秒数,如: Timer = 61292.71 DateAdd(interval, number, date) 将指定的日期值 date 加上 number 所指定的间隔之后返回,其中具体加上哪种间隔 可由 interval 指定,interval 的取值见下表: 设置 yyyy q m y d w ww h n s 描述 年 季 月 一年的日数 日 一周的日数 周 时 分钟 秒???如: DateAdd(&h&, 3, # 17:00#) =
20:00 DateDiff(interval, date1, date2) 返回两个日期 date1 和 date2 之间的间隔数值(date2 - date1),其中具体哪种间隔可 由 interval 指定,interval 的取值与 DateAdd 函数相同。如: DateDiff(&ww&, Now, Now + 31) = 5 WeekDay(date, [firstdayofweek]) 返一个整数,代表指定日期 date 是星期几。其中 firstdayofweek 表示一星期中的第 一天从哪天开始算,可用值见下表,如果不指定,则以星期日为一周的第一天: 常数 vbUseSystem VbSunday vbMonday vbTuesday vbWednesday vbThursday vbFriday vbSaturday 值 0 1 2 3 4 5 6 7 描述 使用 NLS API 设置。 星期日(缺省值) 星期一 星期二 星期三 星期四 星期五 星期六WeekDay 返回值的对应星期如下: 常数 vbSunday vbMonday vbTuesday 值 1 2 3 描述 星期日 星期一 星期二 vbWednesday vbThursday vbFriday vbSaturday4 5 6 7星期三 星期四 星期五 星期六如: WeekDay(##, vbSunday) = 4 4. 其他: ? Format(expression, format) 对表达式 expression 按指定的格式串 format 进行格式化,主要针对数字或者日期进 行格式化,如: Format(3.1415926, &0.000&) = 3.142 Format(Now,&yyyy-MM-dd HH:mm&) =
16:06 对于日期表达式,可用的格式字符见下表描述:字符 (:) 说明 时间分隔符。在一些国家,可能用其他符号来当时间分隔符。格式化时间值时,时间 分隔符可以分隔时、分、秒。时间分隔符的真正字符在格式输出时取决于系统的设置。 (/) 日期分隔符。在一些国别,可能用其他符号来当日期分隔符。格式化日期数值时,日 期分隔符可以分隔年、月、日。日期分隔符的真正字符在格式输出时取决于系统设置。 c 以 ddddd 来显示日期并且以 ttttt 来显示时间。如果想显示的数值无小数部分,则 只显示日期部分,如果想显示的数值无整数部分,则只显示时间部分。 d dd ddd dddd ddddd 以没有前导零的数字来显示日 (1 C 31)。 以有前导零的数字来显示日 (01 C 31)。 以简写来表示日 (Sun CSat)。 以全称来表示日 (Sunday CSaturday)。 以完整日期表示法显示(包括年、月、日),日期的显示要依系统的短日期格式设置 而定。缺省的短日期格式为 m/d/yy。 dddddd 以完整日期表示法显示日期系列数(包括年、月、日),日期的显示要依系统识别的 长日期格式而定。缺省的长日期格式为 mmmm dd, yyyy。 w ww m 将一周中的日期以数值表示(1 表星期日~ 7 表星期六)。 将一年中的星期以数值表示 (1 C 54)。 以没有前导零的数字来显示月 (1 C 12)。如果 m 是直接跟在 h 或 hh 之后,那么 显示的将是分而不是月。 mm 以有前导零的数字来显示月 (01 C 12)。如果 m 是直接跟在 h 或 hh 之后,那么显示 的将是分而不是月。 mmm mmmm q y yy yyyy h Hh 以简写来表示月 (Jan CDec)。 以全称来表示月 (January CDecember)。 将一年中的季以数值表示 (1 C 4)。 将一年中的日以数值表示 (1 C 366)。 以两位数来表示年 (00 C 99)。 以四位数来表示年 (00 C 99)。 以没有前导零的数字来显示小时 (0 C 23)。 以有前导零的数字来显示小时 (00C 23)。 N Nn S Ss ttttt以没有前导零的数字来显示分 (0 C 59)。 以有前导零的数字来显示分 (00 C 59)。 以没有前导零的数字来显示秒 (0 C 59)。 以有前导零的数字来显示秒 (00 C 59)。 以完整时间表示法显示(包括时、分、秒),用系统识别的时间格式定义的时间分隔 符进行格式化。如果选择有前导零并且时间是在 10:00 A.M. 或 P.M.之前,那么将显 示有前导零的时间。缺省的时间格式为 h:mm:ss。AM/PM在中午前以 12 小时配合大写 AM 符号来使用; 在中午和 11:59 P.M.间以 12 小时配 合大写 PM 来使用。am/pm在中午前以 12 小时配合小写 am 符号来使用; 在中午和 11:59 P.M.间以 12 小时配 合小写 pm 来使用。A/P在中午前以 12 小时配合大写 A 符号来使用;在中午和 11:59 P.M.间以 12 小时配合 大写 P 来使用。a/p在中午前以 12 小时配合小写 a 符号来使用; 在中午和 11:59 P.M.间以 12 小时配合 小写 p 来使用。AMPM在中午前以 12 小时配合系统设置的 AM 字符串文字来使用; 在中午和 11:59 P.M. 间 以 12 小时配合系统设置的 PM 字符串文字来使用。 AMPM 可以是大写或小写, 但必须 和您的系统设置相配。其缺省格式为 AM/PM。对于数值表达式,可用的格式字符见下表描述:字符 (0) 说明 数字占位符。显示一位数字或是零。如果表达式在格式字符串中 0 的位置上有一位数 字存在,那么就显示出来;否则,就以零显示。如果数值的位数少于格式表达式中零 的位数(无论是小数点的左方或右方),那么就把前面或后面的零补足。如果数值的 小数点右方位数多于格式表达式中小数点右面零的位数,那么就四舍五入到有零的位 数的最后一位。如果数值的小数点左方位数多于格式表达式中小数点左面零的位数, 那么多出的部分都要不加修饰地显示出来。 (#) 数字占位符。显示一位数字或什么都不显示。如果表达式在格式字符串中“#”的位置 上有数字存在,那么就显示出来;否则,该位置就什么都不显示。 此符号的工作原理和“0”数字占位符大致相同,不同之处只有在当表达式中数值的位 数少于“#”的位数 (无论是小数点左方或右方) 时, 不会把前面或后面的零显示出来。 (.) 小数点占位符。在一些国家是用逗号来当小数点的。小数点占位符用来决定在小数点 左右可显示多少位数。如果格式表达式在此符号左边只有正负号,那么小于 1 的数字 将以小数点为开头。如想在小数前有“0”的话,那么请在小数点占位符前加上“0” 这个数字占位符。小数点占位符的实际字符在格式输出时要看系统的数字格式而定。 (%) 百分比符号占位符。表达式乘以 100。而百分比字符 (%) 会插入到格式字符串中出 现的位置上。 (,) 千分位符号占位符。在一些国别,是用句点来当千位符号。千位符号主要是把数值小 数点左边超过四位数以上分出千位。如果格式中在数字占位符(0 或 #)周围包含有 千分位符号,则指定的是标准的千分位符号使用法。两个邻近的千分位符号或一个千 分位符号紧接在小数点左边(不管小数位是否指定),其意思为“将数值除以 1000, 按需要四舍五入”。例如,可以用格式字符串 &##0,,& 将 1 亿表示成 100。数值小 于 1 百万的话表示成“0”,两个邻近的千分位符号除了紧接在小数点左边以外,在 任何位置出现时均简单地视为指定了使用千分位符号。小数点占位符的真正字符在格 式输出时,需视系统识别的数字格式而定。 (:) 时间分隔符。在一些国别,可能用其他符号来当时间分隔符。在格式化时间值时,时 间分隔符可以用来分隔时、分和秒。时间分隔符的真正字符在格式输出时,取决于系 统的设置。 (/) 日期分隔符。在一些国别,可能用其他符号来当日期分隔符。在格式化日期数值时, 日期分隔符可以用来分隔年、月、日。日期分隔符的真正字符在格式输出时,取决于 系统设置。 (E- E+ e- e+) 科学格式。如果格式表达式在 E-、E+、e- 或 e+ 的右方含有至少一个数字占位符(0 或 #),那么数值将表示成科学格式,而 E 或 e 会被安置在数字和指数之间。E 或 e 右方数字占位符的个数取决于指数位数。使用 E- 或 e- 时,会用减号来表示负的乘 幂。使用 E+ 或 e+ 时,会用减号来表示负的乘幂并用加号来表示正的乘幂。 - + $ () 显示一个原义字符。如想显示那些列出的字符之外的字符时,可以用反斜杠 ( \ ) 字 符作前缀或以双引号 (& &) 括起来。 (\) 将格式字符串中下一个字符显示出来。如想显示一作为原义字符并有特殊含义的字符, 可将此字符置于反斜杠 (\) 之后。 反斜杠本身并不会显示出来。 而使用反斜杠 (\) 的 效果和使用双引号是一样的。如想显示反斜杠字符,可使用两个反斜杠 (\\)。 那些不能显示为原义字符的字符是日期格式字符和时间格式字符(a, c, d, h, m, n, p, q, s, t, w, y, / 和 :)、数值格式字符(#, 0, %, E, e, 逗点和句点)和字符 串格式字符(@, &, &, & 和 !)。 (&ABC&) 显示双引号 (& &) 之内的字符串。如在代码中想在 format 中包含一个字符串,必须 用 Chr(34)将文本括起来(34 为双引号 (&) 的字符代码)。2.5枚举与结构类型 1. 枚举类型: 枚举类型使用 Enum 定义,变量、参数都可以定义为 Enum 类型,Enum 类型的变量的取值 范围为 Enum 中所定义的常量范围(Long 类型值)。Enum 类型定义的语法格式为: [Public | Private] Enum &name& &membername& [= constantexpression] &membername& [= constantexpression] ... End Enum ? ? ? “name”用于指明枚举类型的名称,在后续定义变量及参数时,使用该名称作为变量和参 数的类型。枚举类型缺省是 Public 的。 “membername”表示具体的枚举元素名,作为后续枚举变量的取值常量。 “constantexpression”是可选的,枚举中的元素缺省按 0 - n 自动取值,也可以人为指定常 量表达式值(Long 类型),对于中间未指定值的则为前一个元素值+1,不同的元素的值可 以相同。枚举类型的本质是 Long 类型, 在使用时其变量可以按所定义的元素名称赋值, 这样就使得程 序代码更容易阅读,比如”lngSex=sexMan、sexWuMan、sexUnkonw ”。 2. 结构类型: 在 Visual Basic 中结构类型称作自定义类型,经常用来表示数据记录,记录一般由多个不同数 据类型的元素组成,自定义类型的语法格式为: [Private | Public] Type &typename& &elementname& As type &elementname&As type ... End Type ? “typename”用于指定自定义类型的名称,在后续定义变量或参数时,使用该名称作为变 量的类型。自定义类型缺省是 Public 的。 ? “elementname”表示具体的结构字段名, 需要指明字段的类型, 可以定义为静态或者动态 数组(见后面章节介绍)。 在结构化的数据库应用程序中,自定义类型可能会被经常用到。比如一个自定义类型对应一 张数据库表,类型中各个字段对应数据库表中的各个字段,这样自定义类型的一个变量就可 以代表一条数据库表记录,如果是自定义类型的数组,则可以表示多条数据库表记录。 2.6 数组数据类型 2.6.1 静态数组 静态数组是指数组的维数及元素个数是固定的,系统提前为数组分配固定的存储空间。数组 变量定义的语法格式为: Dim &arrayname& ([&lower& To] &upper& [,[&lower& To] &upper&] ]…) [As Type] 例如,定义一个 1 维数组: Dim arrTest(10) As Long Dim arrTest(1 To 10) As Long 定义一个 2 维数组: Dim arrTest(10, 10) As Long Dim arrTest(1 To 10, 1 To 10) As Long 静态数组定义好之后,每一个数组元素都具有初始值,初始值根据数组的类型、与对应类型 的变量初始值一致(Empty),要访问数组元素,直接用圆括号加对应的下标即可,如: a = arrTest(5) b = arrTest(2, 3) 定义数组时,如果没有指定维度的下界,则缺省为 0,除非是在模块最前面使用”Option Base 1”语句指明,但 Option Base 语句只影响位于包含该语句的模块中的数组下界。 两个数组变量之间不能直接赋值,因此如果要进行两个不同数组之间的复制,只有通过循环 复制每个元素来进行。但对于 Variant 类型的变量(不是 Variant 类型的数组),可以直接接收 数组变量的赋值。 2.6.2 动态数组 使用定长数组要预先知道需要存储的数据量的大小,但有时数据量的大小不能确定,这就需 要用到动态数组。动态数组不需要在声明中指出它的存储量的大小,它可以在运行时根据需 求动态改变其大小或上下界,从而有效利用了存储空间。 动态数组在创建时需要在数据声明部分先定义数据类型,但不需要说明数据的大小,然后在 使用中根据需要使用 ReDim 语句重新定义数组的元素个数。ReDim 的语法格式为: ReDim [Preserve] &arrayname&(&subscripts&) [As type] 例如:Dim x() As Long ReDim x(10) ReDim x(20) ReDim x(10, 10) ReDim x(10, 10, 10)ReDim 只能重新定义动态数组的上下界、维数,但不能改变数组的类型; 使用 ReDim 对数组进行重新定义之后, 数组重新分配空间, 数组中元素的原有值将会丢失; 如果想保留之前的元素值,可以使用 Preserve 关键字,例如:Dim x() As Long Dim i As Integer ReDim x(10) For i = 0 To 10 x(i) = i Next ReDim Preserve x(20)但使用 Preserve 关键字时,只能重新定义动态数组最后一维的上界,不能改变数组的维数, 也不能改变数组的下界。 对于 Variant 类型的变量(不是 Variant 类型的数组),可以使用 ReDim 将它认为是一个动态数 组进行重新定义, 并可以改变它的类型, 但在改变类型时, 不能使用 Preserve 关键字; 例如:Dim x As Variant ReDim x(10) As Long ReDim x(20) As String动态数组在定义好之后,没有使用 ReDim 重新定义之前,是没有数组元素的,也不能使用 Lbound 和 Ubound 函数访问,否则会出现下标越界错误; 对 Variant 类型的变量或者 Variant 类型的动态数组,可以使用 Array 函数动态定义数组并进 行初始化,Array 函数的作用是返回一个初始化好的 Variant 数组;例如:Dim x() As Variant 或者: Dim x As Variant x = Array(1, 2, 3) x = Array(&A&, &B&, &C&) x = Array(Array(1, 2, 3), Array(1, 2, 3)) x = Array()上例中最后一句”x = Array()”同样也是返回一个空的动态数组, 但它和刚定义好的动态数组不 一样,这个时候可以使用 Lbound、Ubound 函数访问上下界,只不过值都是-1。 除了 Array 函数外,Split 函数也是常用的一个函数,它用于将一个字符串按指定符号进行分 割、并返回一个动态大小的字符串数组,如:Dim x() as String x = Split(&A,B,C,D,E&, &,&)过程级的动态数组在使用完成之后,系统会自动收回所分配的数组空间,也可以人为消除动 态数组的空间分配(恢复定义状态),例如:Dim x() As Long ReDim x(10) Erase x2.6.3 控件数组 当界面上需要若干个控件执行大致相同的操作时,可以将这些控件定义为控件数组。控件数 组由一组类型相同的控件组成,这些控件的控件名相同,共用相同的事件过程。 控件数组与一般控件所不同的是: 1. 一般的控件其 Index 属性为空,而控件数组的 Index 为 0-n。 2. 一般控件通过名称直接访问,而控件数组需要加下标索引访问,如 txtEdit(0)。 3. 控件数组的事件过程中会多一个 Index 参数,用于在共享事件过程的同时,能够区分具 体的控件数组元素;如:Private Sub txtEdit_KeyPress(Index As Integer, KeyAscii As Integer) ?? End Sub建立控件数组有两种方法,一种是设计时建立,一种是运行时建立。 设计时建立控件数组: 1. 在设计界面上,将多个相同类型的控件指定为相同的名称(Name),则这些控件的 Index 会自动进行编号。 2. 或者先设置好一个控件,再在设计界面上复制这个控件进行粘贴;第一次粘贴时,Visual Baisc 会询问”已有一个控件为’ControlName’。创建一个控件数组吗?”。 3. 可以对自动编号的 Index 进行修改,可以不连续,但不能重复。 这种控件数组一般应用在具有大量类似输入形式的窗体中, 这些数据输入项都要进行相同的 控制,比如按回车自动跳转光标,接收焦点时自动全选内容等。 运行时建立控件数组: 1. 在设计时,先在界面上放置一个控件 (基准控件),并对它的 Index 属性进行指定(比如 Index=0)。 2. 运行时,在代码中使用 Load/Unload 语句加载/卸载控件数组中的其他控件,例如:Private Sub Form_Load() Load txtEdit(1) txtEdit(1).Left = txtEdit(0).Left + txtEdit(0).Width txtEdit(1).Visible = True Load txtEdit(5) txtEdit(5).Left = txtEdit(1).Left + txtEdit(1).Width txtEdit(5).Visible = True End Sub Private Sub Form_Unload(Cancel As Integer) Unload txtEdit(1) Unload txtEdit(5) End Sub运行时建立控件数组的特性: 1. 在代码中动态加载控件时,其下标(Index)可以任意指定,但不能重复,包括不能与设计 时的基准控件的 Index 相同。 2. 动态加载的控件, 其属性与设计时的基准控件相同, 比如 Left、 Top 等, 但 Visible=False(不 可见)。 3. 在需要时, 可以随时使用 Unload 卸载所动态加载的控件; 但设计时的基准控件不能动态 使用 Unload 卸载。 这种控件数组一般应用在界面布局或者输入的内容需要动态变化的时候。 2.7 对象数据类型 对象型数据(Object)用来表示各种对象,比如图形或 OLE 对象、或自定类对象等,它占用 4 个字 节的存储空间。 2.7.1 类模块对象 类模块是 Visual Baisc 中非常重要的一种文件,它用于实现 VB 的对象化编程,在类模块中, 可以定义一个类,并在类中添加属性、方法、事件,然后将类实例化为对象使用。 1. 添加类: 根据需要,要设计一个类,可以在当前工程中增加添加一个类模块,或者单独建立一个 ActiveX DLL 工程,在该工程中添加类模块;前者的类主要是本工程内部使用,后者的类 主要是出于公共共享的目的单独建立使用。 类模块除了它的名称(类名)外,有一个重要属性”Instancing ”需要在属性浏览器中指定, 它的取值为: 1) Private: 只允许该类在本工程中使用。标准 EXE 工程中的类缺省就是该属性,且只能是该属 性。 2) PublicNotCreatable: 只有在自己工程的部件先被创建了对象的前提下,其它应用程序才能应用此类的对 象; 不能用 CreateObject 函数或 New 操作符来创建类对象。 ActiveX 控件工程中的 类模块 Instancing 的缺省值是 PublicNotCreatable。 3) SingleUse: 允许其它应用程序从这个类创建对象,但客户创建的该类的每个对象都启动部件的 一个新的实例。在 ActiveX DLL 工程中是不允许的。 4) GlobalSingleUse: 类似于 SingleUse , 除了此类的各种属性和方法可以象简单的全局函数那样被调用, 该类的实例不需要显式创建, 因为它会自动创建。 在 ActiveX DLL 工程中是不允许的。 5) MultiUse: 允许其它应用程序从这个类创建对象。在类所在部件的一个实例中可提供按此方式 创建的任意数目的对象。 这是最常用的一种公共类属性。 6) GlobalMultiUse: 类似于 MultiUse,只附加了一点:这个类的各种属性和方法可以象简单的全局函数 那样被调用。该类的实例不需要显式创建,因为它会自动创建。 当我们需要建立一个全局的公共部件,并且希望里面的类方法、属性等能够直接方 便被其他程序所调用,就可以使用该类属性。 各种工程中的类所允许的 Instancing 取值如下表: 属性值 Private PublicNotCreatable SingleUse GlobalSingleUse MultiUse GlobalMultiUse ActiveX Exe√ √ √ √ √ √ √ √ActiveX DLL√ √ActiveX 控件√ √标准 EXE√2. 添加属性: 使用 Property 关键字定义类的属性,如下代码所示:Private mstrProperty As String Property Get MyProPerty() As String MyProPerty = mstrProperty End Property Property Let MyProPerty(ByVal vNewValue As String) mstrProperty = vNewValue End Property以上定义了一个名称为”MyProperty”的属性,在控件外部访问该属性时,Get 过 程用于读取属性值,Let 过程用于赋予属性值;在 Get 和 Let 过程中,借助了模块中间变 量 mstrProperty 来处理。 如果是对象类型的属性,则应该用 Set 过程代替 Let 过程,并且在赋值过程中可能 要用到 Set 关键字, 如果属性是 Variant 类型,则需要 Get/Let/Set 三个过程都需要处理,因为 Variant 可 能是简单类型, 也可能是对象类型, 具体需要在每个过程中进行类型判断并作相应处理, 比如使用 TypeName,IsObject 等辅助函数;不过非特定需要,不建议设计 Variant 类型 的属性。 属性所对应的 Get/Let/Set 过程缺省都是公共的,可以不加 Public 前缀;除了内部需 要,一般不使用 Private 私有属性。 使用 Get/Let/Set 过程来实现属性,而不是通过 Public 变量来实现,主要是为了在属性的 读取/赋值过程中,可以通过过程对数据的有效性进行检查、以及作相关的变动处理,这 些可以封装在属性过程中完成,而不用要求外部使用程序来处理。 3. 添加方法: 在类模块中定义的过程(Sub)或者函数(Function)称为类的方法, 通过 Public/Private 关键字 指定是公共方法还是内部私有方法。 4. 添加事件: 通过 Event 关键字在公共定义部分为类添加事件,语法格式为: [Public] Event&procedurename& [(arglist)] 对于需要开放给其他应用程序的事件,需要声明为 Public,缺省情况下 Events 类型是 Public 的,然后可按照一般的 Sub 过程的定义方法定义事件过程,但不能带 Optional 参 数、ParamArray 参数,并且没有返回值。事件过程只需要定义,具体的事件处理代码在 对象实例激活事件时才编写; 事件被声明之后,在类模块的相应地方,可以使用 RaiseEvent 语句来产生该事件,其格 式为: RaiseEvent &eventname& [(argumentlist)] 示例:Public Event GetILL(ByVal ILLName As String) ? RaiseEvent GetILL(strILL)5. 对象的使用: 前面讲述的为类定义属性、方法、事件等,除了手工编写代码之外,也可以使用 VB 的 外接程序”类生成实用工具”通过形象直观的方式进行设置,然后选择自动生成代码,可 以提高不少工作效率。 定义好类模块之后,就可以将类进行实例化为对象,使用它的属性、方法、事件。使用 对象的一般方法为: 1. 在当前工程中,引用类所在的工程,如果是当前工程中的私有类,则无需引用。 注:如果一个工程提供了公共的类(一个或多个),则该工程可以被其他工程引用;被 引用的可以是该工程编译后的部件(如 DLL),也可以是 VB 源程序环境中被加载的工 程。 2. 声明一个对象,类型为对应的类。 如:Dim objTest As clsTest 3. 使用 New 关键字将对象初始化; 也可以在声明对象的时候就使用 New 关键字进行初 始化;如:Dim ObjTest As New clsTest 或者 Set objTest = New clsTest 注意这里是对对象变量进行初始化赋值,与一般变量赋值语句不同,在前面应该使 用 Set 关键字。 4. 对对象的属性进行读取或赋值,调用对象方法。 5. 如果要使用对象的事件,则对象需要定义为模块级的,并且在定义对象时使用 WithEvents 关键字,且不能在定义时使用 New 关键字,如: Private WithEvents mobjTest As clsTest 然后在代码窗体的对象列表中就可以选择该对象,选择该对象的对应事件后,会自 动生成事件过程,然后在事件过程中编写处理代码。 6. 将对象卸载,如:Set objTest = Nothing 2.7.2 动态对象 前面讲了使用对象时,要将对象所在的工程进行引用,这样就要求被引用的工程部件必须是 安装存在的,在当前工程编译之后,如果被引用的部件不存在,则当前工程无法运行,会出 现”ActiveX 部件不能创建对象”实时错误。 有时候可能需要动态判断要使用的对象部件是否安装存在,如果存在则提供相应的功能,如 果不存在也能保证主体程序的其他功能能够正常运行,这时就可以使用 CreateOjbect 函数动 态创建对象,CreateOjbect 的语法格式为: 对象 = CreateOjbect(&类名&) 例如:Dim objTest as Object Set objTest = CreateObject(“prjTest.clsTest”) Dim ExcelSheet As Object Set ExcelSheet = CreateObject(&Excel.Sheet&)当要创建的对象库不存在时,CreateObject 函数同样会引发”ActiveX 部件不能创建对象”错误, 但我们可以对该错误进行检测,保证程序能够正常运行,例如:Dim objExcel As Object On Error Resume Next Set objExcel= CreateObject(&Excel.Application&) Err.Clear:On Error Goto 0 If objExcelIs Nothing Then Msgbox &没有安装 Excel,不能使用 XXX 功能。& End IF使用 CreateOjbect 函数时,不需要在当前工程中引用要使用的部件,但因为这种方式创建的 对象采用的是后期绑定方式,对象变量只能定义能通用对象类型(Object、Control),并且在 代码中使用对象变量时,输入”.”符号时 Visual Baisc 不能提示对象的属性、方法列表。 注:要判断对象变量是否有效,是用”Is”运算符判断 Nothing,而不是”=”。 使用引用方式时, 可以方便地在工程的引用列表中找到要引用的对象库, 但通过 CreateOjbect 动态创建对象时,很可能不清楚对象的类名是什么,这个时候可以借助 ComExplorer 工具, 例如,我们要使用 Microsoft Scripting Runtime 库中的 FileSystemObject 对象,通用它引用的 方式,我们可以如下操作: 然后我们可以直接定义使用 scrrun.dll 这个部件库中的 FileSystemObject、 Dictionary 等类的对 象,现在如果只想动态创建 FileSystemObject 类的对象,类名是什么呢,通过 ComExplorer 可以查到:2.8集合类型 VisualBasic 中提供的数组可以对大量的数据进行操作,并且速度非常快;但使用数组只能通过下 标的方式访问数据,且数组元素所存放的数据类型比较单一,使用不太方便,下面介绍一下 VisualBasic 中所提供的两种集合类型,他们在一定场合下可以替代数组。 2.8.1 Collection Collection 是 VB 内置的一种对象,它可以实现类似数组的数据集合处理,它的特点是除了可 以通过索引访问数据元素外,也可以通过关键字(调用 Add 方法添加元素时指定的 Key)来访 问,例如:Dim x As Collection Dim i As Integer Set x = New Collection Call Randomize For i = 1 To 100 x.Add Int(100 * Rnd() + 1), &_& & i Next MsgBox &集合中共有 & & x.Count & & 个元素,第 50 个元素值为:& & x(&_50&) MsgBox &集合中共有 & & x.Count & & 个元素,第 50 个元素值为:& & x(50) For i = 100 To 90 Step -1 x.Remove i Next x.Remove &_50&1. Collection 中的元素是 Variant 类型,即它可以添加任意数据类型的元素。 2. Collection 提供了添加、删除一个元素的方法,但不能直接更新一个元素的值;要更新一 个元素的值,需要先删除这个元素,再重新添加。 2.8.2 对象集合 对象集合的本质是对象类型结合 Collection 的实现;它的特点同样是除了可以通过下标访问 数据元素外,也可以通过关键字来访问;它的集合元素是一个对象,具有若干属性(包括再 嵌套对象集合)。 对象集合只能通过 VB 的外接程序”类生成实用工具”来设置和生成, 因为 VB 在代码中添加了 一些隐藏处理。构建一个对象集合的方法为: 1. 进入”类生成实用工具”, 先新建一个类, 设置好该类的属性。 比如建立一个”项目”类 item, 具有属性”编码、名称”。 2. 再新建一个集合”项目集”Items,并选择由现存的类 Item 组成。 3. 点击更新工程, 即自动生成对应的代码; 在工程中会自动增加两个类模块: Items, Item; 其中类模块 Items 就是一个对象集合, 它缺省提供了 Add、 Remove 两个方法, 以及 Item、 Count 两个属性。 4. 再通过类似代码,使用构建好的集合:Dim objItem As Item Dim colItems As Items Dim i As Integer Set colItems = New Items For i = 1 To 10 Set objItem = New Item objItem.编码 = Format(i, &0000&) objItem.名称 = &项目& & i colItems.Add objItem.编码, objItem.名称, &_& & objItem.编码 Next MsgBox colItems(&_0005&).名称 colItems.Remove 5 注:Item 属性是对象集合的缺省属性,在访问某个集合元素时,可以省略 Item 关键字, 同时可以用索引(Index)或者关键字(调用 Add 方法时指定的 Key)来访问某个集合元素。 对象集合适合于数据量不太大的数据集操作,当数据量比较大时速度比较慢;对象集合在数 据库应用程序中,一般用于映射数据表,表中的各个字段就是集合元素的对象属性,集合中 的记录就对应表中的数据记录。 2.9 程序语句结构 Visual Basic 程序代码由 3 种基本结构构成:顺序结构、选择结构和循环结构,无论多么复杂的程 序,都是由这 3 种基本结构中的一种或多种的组合构成的。 2.9.1 顺序结构 顺序结构是按照程序段书写的顺序执行的语句结构,是一种最基本的结构,表明事情发生的 先后顺序,如图所示,要先执行语句 A,然后才执行语句 B,两者是顺序执行的关系:1. 语句与行数 在 Visual Basic 中,语句没有结束符,一条语句就占用一个代码行。 当一条语句太长时,在一行代码内可能不方便阅读,这个时候可以考虑将这一条语句分 成多行书写, 分成多行时, 使用”空格_”进行续行, 但一条语句最多只允许 25 行, 例如:varMsg = MsgBox(&你输入的内容尚未保存,确实要退出吗?& &_ vbCrLf & vbCrLf & &注:如果退出将可能导致数据丢失!&, _ vbYesNo + vbQuestion + vbDefaultButton2, &病历输入&)有时也可以将多条语句合并合在一行,用”:”分隔,例如:X = 100: Y = 100: Z = 1002. 赋值语句 赋值语句是程序设计中最常用的语句之一,在程序中,需要大量的变量存储程序中 用到的数据,所以对变量进行赋值的赋值语句也会在程序中大量出现。赋值语句将表达 式的值赋给变量或对象的属性。 赋值语句包括两种,一种是用来对一般的变量进行赋值的赋值语句,此语句用关键 字 Let 描述;另一种是用来对对象型的变量进行赋值的赋值语句,用关键字 Set 描述。 赋值语句的语法格式为: [Let] 变量 = 表达式 Set 变量 = 表达式 第一条语句中的 Let 是可选项, 它在 Basic 语言的早期版本的赋值语句中被要求使用, 在 Visual Basic 程序的赋值语句中通常被省略,只是为了保持兼容。表达式可以是任何数 值型或字符串变量、常量或表达式;第二条语句的 Set 关键字是必需的。 3. 注释语句: 注释是在程序中加入一些评注,往往起着提供编写程序的日期、编写人、解释程序 代码的作用、实现方法等,其根本目的是为程序的阅读和修改提供信息,提高程序的可 读性和可维护性。 注释的方法有两种:使用 Rem 关键字或撇号(')。二者的用法基本相同,在一行中撇 号(')或 Rem 关键字后面的内容为注释内容。它们之间的区别在于使用 Rem 关键字时, 必须使用冒号(:)将其与前面的语句隔开。 VisualBasic 中只有行注释,没有块注释,要进行块注释,需要将其中的每行都进行注 释;一般都使用比较简洁的撇号(')进行注释。 4. With 语句 With 语句可以对某个对象执行一系列的语句,而不用重复指出对象的名称。其语法格 式为: With ojbect …… End With 例如,要改变一个对象的多个属性,可以在 With 控制结构中加上属性的赋值语句,这 时候只是引用对象一次而不是在每个属性赋值时都要引用它。下面的例子显示了如何使 用 With 语句来给同一个对象的几个属性赋值:With MyLabel .Height = 2000 .Width = 2000 .Caption = &This is MyLabel& End With可以将一个 With 块放在另一个之中,而产生嵌套的 With 语句。但是,由于外层 With 块成员会在内层的 With 块中被屏蔽住,所以必须在内层的 With 块中,使用完整的对 象引用来指出在外层的 With 块中的对象成员。 5. GoTo 语句 Goto 语句用于无条件跳转到指定行执行,其语法格式为: Goto &行标签& 行标签写在一行代码的最前面,格式为: 标签名: 例如:?? Goto LineABC ?? LineABC: ??在结构化的代码中,应该尽量少使用 Goto 语句,因为它使得程序不容易阅读和调试。 6. 数据输入输出 1) 用输入框输入数据(InputBox) InputBox 函数用于打开一个对话框,等待用户输入或选择确定、取消按钮,若用户 单击”确定”按钮或按回车键,则返回用户在文本框中输入的内容,具体格式为: InputBox (提示[,标题][,默认][,X 坐标位置][,Y 坐标位置]) 其中: ? “提示”为一个字符串表达式,作为对话框中的提示信息,不能省略。若要多 行显示,则必须在每行行末加入回车和换行符(vbCrLf)。 ? “标题”为一个字符串表达式,在对话框的标题区显示。若省略,则显示应用 程序标题(App.Title)。 ? “默认值”为一个字符串表达式,提供给用户的默认输入内容。 ? “X 坐标位置”和“Y 坐标位置”为整型表达式,它们确定对话框左上角在屏 幕上的位置,屏幕左上角为原点,单位为缇(Twip)。 例如:Dim strPhone as String strPhone = InputBox(&请输入你的联系电话,可以是手机或者座机号码。& & vbCrLf & vbCrL}

我要回帖

更多关于 英雄联盟特殊符号翅膀 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信