资源预览内容
第1页 / 共298页
第2页 / 共298页
第3页 / 共298页
第4页 / 共298页
第5页 / 共298页
第6页 / 共298页
第7页 / 共298页
第8页 / 共298页
第9页 / 共298页
第10页 / 共298页
亲,该文档总共298页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
Visual Basic程序设计简明教程程序设计简明教程第第 二二 版版同济大学计算机系基础教研室同济大学计算机系基础教研室同济大学计算机系基础教研室同济大学计算机系基础教研室Visual Basic 程序设计简明教程程序设计简明教程第一章 Visual Basic程序设计概述(1)第二章 VB简单的程序设计(3)第三章 VB语言基础(2)第四章 基本的控制结构(6)第五章 数组(4)第六章 过程(5)第七章 常用控件(4)第八章 界面设计(3)第九章 文件(2)第十章 图形(3)第十一章 数据库技术(1)第一章第一章 Visual Basic程序设计概述程序设计概述(1学时)学时)1.1 引例1.2 VB主要功能和特点1.3 VB集成开发环境1.1 引例引例1.1 一行内容在窗体左、右移动; 移动两种方法:手动和自动,当自动时,文字闪烁显示; 当内容超出窗体,进行反弹。 1.1 引例引例 2.1 对输入的字符进行转换的程序。 转换规则: 大写字母转换成小写字母, 小写字母转换成大写字母 空格不转换 其余转换成“*”。要求:每输入一个字符,马上就进行判断和转换。通过上述两例说明VB面向对象、可视化、事件驱动的特点。1.2 VB主要功能和主要功能和特点特点1.具有面向对象的可视化设计工具;2.事件驱动的编程机制;3.提供了易学易用的应用程序集成开发环境;4.结构化的程序设计语言;5.支持多种数据库系统的访问;6.Active技术;7.VB6.0在开发环境上、网络功能等的增强;8.完备的help联机帮助功能。1.3 VB集成开发环境集成开发环境1. 1. 主窗口主窗口应用程序窗口,由标题栏、菜单栏和工具栏组成。2. 2. 窗体窗体( (form)form)窗口窗口设计VB程序的界面。3. 3. 代码代码( (code)code)窗口窗口编辑窗体、标准模块中的代码。4. 4. 属性属性( (properties)properties)窗口窗口所有窗体或控件的属性设置。5. 5. 工程资源管理器工程资源管理器( (projectproject expror expror) )窗口窗口保存一个应用程序所有的文件。6. 6. 工具箱工具箱( (toolbox)toolbox)窗口窗口显示各种控件的制作工具,供用户在窗体上设计。第二章第二章 VB简单的程序设计简单的程序设计(3学时)学时)2.1 2.1 程序设计方法的发展程序设计方法的发展2.2 2.2 VBVB中的有关概念中的有关概念2.3 2.3 建立简单的应用程序建立简单的应用程序2.4 2.4 基本控件和属性基本控件和属性2.5 2.5 工程的管理及环境的设置工程的管理及环境的设置2.6 2.6 生成可执行文件和制作安装盘生成可执行文件和制作安装盘 2.7 2.7 程序调试程序调试 2.8 2.8 常见错误常见错误2.1 2.1 程序设计方法的发展程序设计方法的发展1. 1. 初期的程序设计初期的程序设计高运行效率、少占用内存为目标。2. 2. 结构化程序设计结构化程序设计程序的可读性、可维护性为目标。程序=算法+数据结构的面向过程的程序设计。3. 3. 面向对象的程序设计面向对象的程序设计降低程序的复杂性、提高软件的开法效率和改善工作界面为目标。程序=对象+消息的面向对象的程序设计。2.2 2.2 对象的有关概念对象的有关概念1. 1. 类类类是创建对象实例的模板,包含了创建对象的属性描述和行为特征的定义。2. 2. 对象对象是类的一个实例,继承了类的属性、方法。VB中常用的对象有:窗体、控件等。3. 3. 对象的建立和命名对象的建立和命名4. 4. 对象的三要素对象的三要素 (1 1)属性)属性对象的性质,即用来描述和反映对象特征的参数。 (2 2)方法)方法对象的行为,即将一些通用的过程编写好并封装起来,作为方法供用户直接调用。(3 3)事件)事件 响应对象的动作称为事件,它发生在用户与应用程序交互时。如单击控件、鼠标移动、键盘按下等。 事件过程 指附在该对象上的用户编写的程序代码,是事件的处理程序。事件驱动过程是图形用户界面的本质,由用户控制而代码作出响应。5. 5. VBVB程序的执行步骤如下:程序的执行步骤如下:(1)启动应用程序,装载和显示窗体;(2)窗体(或窗体上的控件)等待事件的发生;(3)事件发生时,执行对应的事件过程;(4)重复执行步骤(2)和(3);(5)直到遇到END结束语句结束程序的运行;或按“结束”强行停止程序的运行。2.3 2.3 建立简单的应用程序建立简单的应用程序以例例2.12.1为例:1. 建立用户界面的对象;2. 对象属性的设置;3. 对象事件过程及编程;4. 程序运行和调试;5. 保存文件。2.4 2.4 基本控件和窗体基本控件和窗体一、常用属性一、常用属性 1. 1. NameName名称属性名称属性创建的对象名称,有默认的名。在程序中,控件名是作为对象的标识而引用,不会显示在窗体上。 2. 2. CaptionCaption标题属性标题属性该属性决定了控件上显示的内容。 3. 3. HeightHeight、widthwidth、toptop和和leftleft属性属性4. 4. EnabledEnabled属性属性控件是否可操作。当设置为false时,呈暗淡色,禁止用户进行操作。5. 5. VisibleVisible属性属性控件是否可见。当设置为false时,用户看不到,但控件本身存在。6. 6. FontFont属性属性 Fontname:字体;Fontsize:字体大小;Fontbold:是否是粗体;Fontitalic:是否斜体;Fontstrikethru:是否加一删除线。Fontunderline:是否带下划线。例2.2在窗体是建立两个命令按钮Command1和Command2,Command2的Font通过属性窗口设置,其余属性通过代码实现。7.7. ForecolorForecolor前景颜色属性前景颜色属性设置控件的前景颜色(即正文颜色).。其值是一个十六进制常数,用户可以在调色板中直接选择所需颜色。8 8. . BackcolorBackcolor背景颜色属性背景颜色属性9. 9. BackstyleBackstyle背景风格属性背景风格属性0-transparent:透明显示,即控件背景颜色显示不出来。10.10. BorderStyleBorderStyle边框风格属性边框风格属性0-None:控件周围没有边框。1-FixedSingle:控件带有单边框。11. 11. AlignmentAlignment属性属性控件上正文水平对齐方式 0:正文左对齐;1:右对齐;2:居中。12.12. AutoSizeAutoSize属性属性控件是否根据正文自动调整大小,False13.13. WordWarp WordWarp属性属性 AutoSizeTrue时,WordWarp才有效。按正文字体大小在垂直方向上改变显示区域的大小。14.14.TabIndexTabIndex属性属性决定了按Tab键时,焦点在各个控件移动的顺序。各个控件默认TabIndex值就是以控件建立时的顺序,第一个为0。15.15.控件默认属性控件默认属性反映该控件最重要的属性,使用时可省略属性名。注意:Command的默认属性为Default,当该属性为True,当按Enter键,该控件起作用。例2.3控件设置效果二二. .窗体窗体1.1.属性属性 Caption标题MaxButton、MinButtonIcon、ControlBoxPicture、AutoRedrawBorderStyle(012345)WindowsState(0-正常、1-最小化、2-最大化)2.2.事件事件 Click、DblClick和Load Load 当装入窗体时激发,通常用于对属性和变量初始化3.3.方法方法Print、Cls和Move等例2.4上述属性、Click、DblClick和Load 事件演示。三、标签三、标签 LabelLabel用于显示文本(输出)信息,不能作为输入信息的界面。例2.5显示浮雕效果的文字,实现方法:字颜色、标签位置四、文本框四、文本框 TextBoxTextBox是一个文本编辑区域,可在该区域输入,编辑和显示正文内容。 1.1.其他属性其他属性Text:正文内容;Maxlength:设置正文的最多字符个数,0任意长度值;MultiLine:是否为多行,默认为一行,False;ScrollBars:MultiLine为True时,该属性才有效,表示滚动条的形式0-None、1-Horizontal、2-Vertical、3-Both;Locked:是否可被编辑属性,False,表示为可编辑。PassWord:口令字符;Text属性返回输入的数据,屏幕显示该字符;SelStart、SelLength、SelText:选中文本的起始、长度、内容。例2.6复制选中的文本2.2.常用事件常用事件Change:当改变文本框的Text属性时会引发该事件。KeyPress(KeyAsciiAsInteger):同上,并可返回一个KeyAscii参数KeyAscii为13,按回车键;为0去除刚输入的字符。LostFocus:当控件失去焦点时发生。GotFocus:当控件获得焦点时发生。3.3.常用方法常用方法 对象.SetFocus:是把光标移到指定的文本框对象中。4.4.文本框的应用文本框的应用 数据过滤数据过滤例例2.7 要求输入合法的数字数据。当输入结束时(按Tab键),对于输入正确的数据,显示正确信息;对输入的非数字数据,则响铃(Beep)、显示错误信息、清除文本框中的内容,并使焦点重新回到文本框。 Text2_LostFocus当输入结束按Tab键时,该事件激发。IsNumeric(Text2):判断是否输入非数字数据。Text2.SetFocus:使焦点重新回到文本框。五、命令按钮五、命令按钮CommandButtonCommandButton 接受用户输入的命令。输入命令可以有三种方式:鼠标单击、Tab键焦点到该按钮、快捷键。1. 1. 其他属性其他属性Caption:命令按钮显示的内容,可设置快捷键,例&Ok,显示Ok。Value:检查该按钮是否按下。该属性在设计时无效。Picture:按钮可显示图片文件(.bmp和.Ico),当Style为1时有效。Style:确定显示的形式,0只能显示文字,1文字、图形均可。ToolTipText:设置工具提示,和Picture结合使用。 2. 2. 事件事件 Click3. 例例 2.8建立一个允许剪切、复制和粘贴的简单便笺板程序。可增加内容:利用MouseMove事件决定命令按钮的有效性,即当选中内容,“剪切”、“复制”按钮有效,否则无效。六、常用方法六、常用方法方法是面向对象的,故使用的形式为:对象.方法 1 1. .PrintPrint方法方法形式:对象.PrintSpc(n)|Tab(n)表达式列表;|,作用:在对象上输出信息对象象:窗体、图形框或打印机(Printer),省略对象在窗体上输出。Spc(n)函数:插入n个空格,允许重复使用。Tab(n)函数:左端开始右移动n列,允许重复使用。;(分号):光标定位上一个显示的字符后。,(逗号):光标定位在下一个打印区的开始位置处。无;,时换行。开始打印的位置是由对象的CurrentX和CurrentX属性决定,缺省为打印对象的左上角0,0。注意注意:Print方法在Form _Load事件过程中起作用,必须设置窗体的 AutoRedraw为True。例例2.9 显示图形显示图形PrivateSubForm_Click()Fori=1To5PrintTab(i);String(6-I,);Spc(6);String(I,)NextiEndSub注意注意:String(number,character)返回指定长度重复字符的字符串。考虑:若把Spc(6)换成Tab(6),效果如何?2. 2. ClsCls方法方法 形式:对象.Cls作用:清除运行时在窗体或图形框中显示的文本或图形。注意:不清除在设计时的文本和图形。3. 3. MoveMove方法方法形式:对象.Move左边距离,上边距离,宽度,高度作用:移动窗体或控件,并可改变其大小。对象:可以是窗体及除时钟、菜单外的所有控件例例2.10 图形移到窗体的中心。七、应用举例七、应用举例例2-11编一计算月支付贷款的程序。现要求根据房产商提供的信息,买房者选择房型、面积、单价、按揭期等信息,计算每月支付代款的程序。窗体1:列表框选择数据、标签显示数据、文本框输入数据;窗体2:图形框显示房屋的平面图。Pmt函数计算月支付贷款。2.5 工程的管理及环境的设置工程的管理及环境的设置一、工程的组成一、工程的组成工程文件包含了一个应用程序的所有文件:窗体文件(.frm):控件及属性、事件过程和自定义过程;窗体的二进制数据文件(.frx),自动产生同名.frx文件;标准模块文件(.bas);类模块的文件(.cls);资源文件(.res);ActiveX控件的文件(.ocx).二、创建、打开和保存工程二、创建、打开和保存工程三、添加、删除和保存文件三、添加、删除和保存文件1.窗体名和窗体文件名概念 窗窗体名体名:窗体的Name属性,在代码中用来引用该窗体,同一工程不能有相同的窗体名; 窗体文件名窗体文件名:窗体存放在磁盘上的文件名,该文件包含了该窗体的所有控件属性和代码,同一文件夹不能有相同的文件名。2. 在工程中添加现存的窗体时,只是对该窗体文件的引用纳入工程。因此,如果更改窗体并保存它,会影响包含此窗体文件的任何工程。3. 在工程中删除窗体时,仅将此窗体从工程里删除掉,但是窗体文件仍存在于磁盘上。但是,如果在VB之外删除一个窗体文件,VB不能更新此工程文件,当打开此工程时,将显示一个文件丢失的错误信息。4. 对窗体文件改名方法1) 打开工程 “另存为Form”实现文件的复制保存工程文件。 2) 利用编辑程序打开工程文件,修改FORM=XXX的文件名。窗体文件名窗体名2.6 生成可执行文件和制作安装盘生成可执行文件和制作安装盘以工程文件例2.11为例。1. 1. 生成可执行文件生成可执行文件文件/生成V6B2-11.exe文件,然后关闭VisualBasic6.0。2. 2. 制作安装盘制作安装盘在向导的指导下运行VB6.0中文版工具“Package&Deployment”;“打包”:把工程中用到的各种类型的文件进行打包压缩后,存放到特定的目录下。“展开”:再把这些打包的文件展开到用户可以携带的安装介质软盘、光盘等。3. 3. 检测安装程序检测安装程序 在没有VB6.0系统的环境下,执行安装盘中的Setup.exe文件,将发行盘进行安装。2.7 程程 序序 调调 试试一、错误类型一、错误类型 (1 1)编辑错误编辑错误在编辑代码时,VB会对键入的代码直接进行语法检查。当发现代码存在打字错误,遗漏关键字或标点符等语法错误,VB在Form窗口中弹出一个子窗口,提示出错信息,出错的那一行变成红色。这时,用户必须单击“确定”按钮,关闭出错提示窗,然后对出错行进行修改。(2 2)编译错误)编译错误编译错误指按了“启动”按钮,VB开始运行程序前,先编译执行的程序段时,产生的错误。此类错误由于用户未定义变量、遗漏关键字等原因产生。这时,VisualBasic也弹出一个子窗口,提示出错信息,出错的那一行被高亮度显示。(3 3) 运行错误运行错误运行时错误指VB在编译通过后,运行代码时发生的错误。这类错误往往是指令代码执行了一非法操作引起的。例如类型不匹配、试图打开一个不存在的文件等。(4 4) 逻辑错误逻辑错误程序运行后,得不到所期望的结果,这说明程序存在逻辑错误。这类错误往往是程序存在逻辑上的缺陷所引起。例如,运算符使用不正确、语句的次序不对、循环语句的起始、终值不正确等。通常,逻辑错误不会产生错误提示信息,故错误较难排除,需要程序员仔细地阅读分析程序以及调试。二、调试错误二、调试错误 (1)(1)VBVB的三种模式的三种模式设计模式设计进行程序的界面设计、属性设置、代码编写等。运行模式运行执行“运行/启动”命令,可以查看程序代码,但不能修改。中断模式中断当在运行模式,按了“中断”命令或当程序出现运行时错误时进入中断模式。可以查看代码、修改代码、检查数据。 (2) (2)调试窗口调试窗口有三个调试窗口,它们是:“立即”窗口、“监视”窗口、和“本地”窗口。可单击视图菜单中的对应命令打开这些窗口。(3 3)设置断点和逐语句跟踪)设置断点和逐语句跟踪断点是告诉VB挂起程序执行的一个标记,当程序执行到断点处即暂停程序的运行,进入中断模式。设置或删除断点的步骤:中断模式下,直接查看某个变量的值,只要把鼠标指向所关心的变量处,稍停一下,就在鼠标下方显示该变量的值。断点标记当前行2.8 常常 见见 错错 误误1. 使用中文标点符号使用中文标点符号系统产生“无效字符”,以红色显示。2. 字母和数字形状相似字母和数字形状相似小写字母“l”和数字“1”形式相同、小写字母“o”与数字“0”。3. 对象名称对象名称(Name)属性写错属性写错Text1、Text2、Command1txtInput、txtOutput、cmdOk4. 对象的属性名、方法名、标准函数名写错对象的属性名、方法名、标准函数名写错尽量使用自动列出成员功能。正确的系统按规定的大小写表示。5. 无意形成控件数组无意形成控件数组建立控件时小心使用“复制”、“粘贴”按钮。6. 打开工程时找不到对应的文件打开工程时找不到对应的文件保存文件时先保存窗体.frm文件、再保存.vbp文件,注意路径。第三章第三章 VB语言基础语言基础(2学时)学时)3.1 编码规则3.2 数据类型3.3 变量与常量3.4 运算符和表达式3.5 常用函数3.6 常见错误3.1 编编 码码 基基 础础1. VB代码不区分字母的大小写代码不区分字母的大小写系统保留字自动转换每个单词的首字母大写;用户自定义行以第一次为准。2. 语句书写自由语句书写自由一行可书写几句语句,之间用冒号分隔;一句语句可分若干行书写,用续行符_连接一行ABRA结果为False 男字男字 女字女字 按汉字的拼音字母比较按汉字的拼音字母比较 4. 逻辑运算符逻辑运算符将操作数进行逻辑运算,结果是逻辑值:条件表达式1And条件表达式2条件表达式均为T,结果为T;条件表达式1Or条件表达式2条件表达式有一个为T结果为T。二、表达式二、表达式 1. 组成组成 变量、常量、函数、运算符和圆括号。2.书写规则书写规则(1)运算符不能相邻。例a+ -b是错误的。(2)乘号不能省略。例x乘以y应写成:x*y。(3)括号必须成对出现,均使用圆括号。(4)表达式从左到右在同一基准上书写,无高低、大小。 3. 不同数据类型的转换不同数据类型的转换运算结果的数据类型向精度高的数据类型靠。IntegerLongSingleDouble=字符运算符关系运算符逻辑运算表达式书写举例sin(45*3.14/180)+(exp(10)+log(10)/sqr(x+y+1)a*b*c*d/e/f/g或a*b*c*d/(e*f*g)例:用人单位招聘秘书:年龄小于40岁的女性,学历专科或本科,年龄40,性别=“女”,(学历=“专科”,学历=“本科”)AndAndOr比a小,比b大用Ora小数b大数a小数b大数比a大,比b小用And例:表示算术表达式:正确的VB表达式:3=xAndx=7错误的VB表达式:3=x=7或3=xOrx=7考虑:若分别写成:年龄40And性别=女And(学历=专科And学历=本科)年龄40Or性别=女Or(学历=专科Or学历=本科)3.5 3.5 常用内部函数常用内部函数1. 数学函数数学函数Rnd函数返回0和1(包括0但不包括1)之间的双精度随机数。每次运行时,要产生不同序列的随机数,执行Randomize语句。例产生1100的随机数:Int(Rnd*100)+12. 转换函数转换函数 Chr(66)BAsc(B)66Asc(Chr(99)99Chr(Asc(K)KUcase$(abcdefg)ABCDEFG3.日期函数日期函数Time返回系统时间、Date返回系统日期、Now返回系统日期和时间DateAdd(要增减日期形式,增减量,要增减的日期变量)DateDiff(要间隔日期形式,日期1,日期2)例如求离你毕业还有多少天:DateDiff(d,date,#2006/07/01#)假定2006年毕业4. 字符串编码和函数字符串编码和函数 (1)字符串编码字符串编码Windows系统对字符采用了DBCS编码,中文2字节,西文1字节VB中字符Unicode编码,任何字符2字节。Len(“中国good”)为6;LenB(“中国good”)为12。StrConv()进行DBCS与Unicode之间转换。 (2)字符串函数字符串函数Mid$(ABCDEFG,2,3)BCDInStr(2,ABCDEFG,EF)5 S=Split(123,56,ab,)Join(S,)12356abReplace(ABCDABCD,CD,123)“AB123AB123”S(0)=123”,S(1)=56”,S(2)=ab5.格式输出函数格式输出函数例3.1利用Format函数显示有关的日期和时间。Private Sub Form_Click( ) FontSize = 12 MyTime = #9:21:30 PM# MyDate = #7/21/1997# Print Tab(2); Format(MyDate, m/d/yy) Print Tab(2); Format(MyDate, mmmm-yy) Print Tab(2); Format(MyTime, h-m-s AM/PM) Print Tab(2); Format(MyTime, hh:mm:ss A/P) Print Tab(2); Format(Date, dddd,mmmm,dd,yyyy) Print Tab(2); Format(Now, yyyy年年m月月dd日日 hh:mm) Print FormatDateTime(Now) VB6.0新提供的函数新提供的函数End Sub6. Shell函数函数Shell函数负责执行一个可执行文件,返回一个Variant,如果成功,代表这个程序的进程ID,若不成功,则会返回0。形式:Shell(命令字符串,窗口类型)窗口类型值为1表示正常窗口,缺省窗口最小化为图标。i = Shell(c:windowscalc.exe) j = Shell(c:command.com, 1)提示:提示:如果不知道应用程序的路径名,可用Start命令启动程序i = Shell(start & calc.exe) ; i = Shell(start & vb6.exe )3.6 3.6 常常 见见 错错 误误1. 逻辑表达式书写错,在逻辑表达式书写错,在VBVB没有造成语法错而形成逻辑错没有造成语法错而形成逻辑错例如,数学表达式3x10 VB表达式写为 3=x10。 问题在于VB中的逻辑量与数值量可相互转换。2. 同时给多个变量赋值,同时给多个变量赋值,在在VBVB没有造成语法错而形成逻辑错没有造成语法错而形成逻辑错例如:Dimx%,y%,z%x=y=z=13. 标准函数名写错标准函数名写错 4. 变量名写错变量名写错检查方法:在通用声明段加OptionExplicit5. 语句书写位置错语句书写位置错 在通用声明段只能有Dim语句,不能有赋值等其他语句第四章第四章 基本的控制结构基本的控制结构(8学时)学时) 4.1 顺序结构 4.2 选择结构 4.3 循环结构 4.4 其他辅助控制语句 4.5 常用算法(一) 4.6 常见错误 (顺序、条件、循环)4.1 4.1 顺顺 序序 结结 构构一、赋值语句一、赋值语句 形式:LET变量名表达式变量名表达式作用:将表达式的值赋值给变量名。一般用于给变量赋值或对控件设定属性值。例:sRate!=0.1Text1.Text欢迎使用VisualBasic6.0当表达式的类型与变量的类型不一致时,强制转换成左边的精度,如iA%=10/3iA中的结果为3注意:注意:虽然赋值号与关系运算符等于号都用“=”表示,VB系统会根据所处的位置自动判断是何种意义的符号。二、与用户交互函数和过程二、与用户交互函数和过程1. 1. InputBoxInputBox函数函数InputBoxInputBox( (提示提示 ,标题,标题,缺省,缺省,x x 坐标位置坐标位置,y y坐标位置坐标位置)其中:提示:提示信息;标题:对话框标题;缺省:输入区缺省值函数返回字符类型。例要在屏幕上显示图示的对话框:相应的语句如下:DimstrNameAsString*40strName=InputBox(请输入你的姓名+vbCrLf+然后单击确定,输入框)也可以使用如下语句:DimstrNameAsString*40,strS1AsString*40strS1=请输入你的姓名+Chr(13)+Chr(10)+然后单击确定strName=InputBox(strS1,输入框,100,100)当键盘输入“王晓明”后,变量strName获得键盘输入的值。2. MsgBoxMsgBox函数和函数和MsgBoxMsgBox过程过程 函数形式:变量%=MsgBox(提示,按钮,标题)过程形式:MsgBox提示,按钮,标题按钮值如下:函数返回所选按钮整数值:例例4.1 编一帐号和密码检验程序。要求:帐号不超过6位数字,有错,清除原内容再输入。密码输入时在屏幕上以“*”代替;若密码错,显示有关信息,选择“重试”按钮,清除原内容再输入,选择“取消”按钮,停止运行。分析:帐号6位,MaxLength为6,LostFocus判断数字IsNumeric函数密码PassWordChar为“*”,MsgBox函数设置密码错对话框。常常 见见 错错 误误数据合法性检查中引起程序的死循环PrivateSubText1_LostFocus()IfNotIsNumeric(Text1)ThenText1=Text1.SetFocusEndIfEndSubPrivateSubText2_LostFocus()IfNotIsNumeric(Text2)ThenText2=Text1.SetFocusEndIfEndSubIfText2AndNotIsNumeric(Text2)Text2Text1确定 4.2 4.2 选选 择择 结结 构构1. 1. IfThenIfThen语句语句( (单分支结构单分支结构) )If Then 语句块语句块 End If 或或 If Then 例:已知两个数x和y,比较它们的大小,使得x大于y.If xy Then t=x x=y y=t End If 或或 If xy Then t=x: x=y: y=t重要的是学会两个数的交换,若上述语句次序变一下,结果如何?重要的是学会两个数的交换,若上述语句次序变一下,结果如何?2. 2. IfThenElseIfThenElse语句语句( (双分支结构双分支结构) ) If Then Else End IfIf Then Else 计算分段函数:单分支结构实现:y=cos(x)x3+3*x If x0 Then y=sin(x)+sqr (x*x+1)双分支结构实现:If x0 Then y=sin(x)+sqr (x*x+1) Else y=cos(x)x3+3*x End If3. 3. IfThenIfThenElseIfElseIf语句语句( (多分支结构多分支结构) )形式:If Then ElseIf Then Else 语句块语句块 n+1 End If例例4.2 已知变量strC中存放了一个字符,判断该字符是字母字符、数字字符还是其他字符。用多分支结构实现用多分支结构实现:If Ucase(strC) =A And Ucase (strC) =0 And strC =9 Then Print strC + 是数字字符 Else Print strC + 其他字符 End If不管有几个分支,依次判断,当某条件满足,执行相应的语句,其余分支不再执行;若条件都不满足,且有Else子句,则执行该语句块,否则什么也不执行。. ElseIf不能写成 Else If。例例4.2a 根据边长判断三角形类型例例4.3 已知百分制成绩mark,显示对应的五级制成绩哪些正确,哪些错误?返回724 4IfIf语句的嵌套语句的嵌套If语句的嵌套是指If或Else后面的语句块中又包含If语句。形式如下:If Then If Then End If End If例例4.4 已知x,y,z三个数,使得xyz用一个IF语句和一个嵌套的IF语句实现 If xy Then t=x: x=y: y=t If yz Then t=y: y=z: z=t IfxyThent=x:x=y:y=tEndIfEnd IfIf语句的嵌套注意事项:书写锯齿型;If与EndIf配对。:与同类型的下面四种形式之一:表达式例:A一组枚举表达式(用逗号分隔)2,4,6,8表达式1To表达式2 60 To 100Is关系运算符表达式 Is =AAndUcase(strC)=0AndstrC 0 And y 0 Then Print 在第一象限 ElseIf x 0 Then Print 在第二象限 ElseIf x 0 And y 0 And y 0 And y 0Print 在第一象限 Case x 0Print 在第二象限 Case x 0 And y 0 And y y,x,y)(2)Choose函数形式是:Choose(数字类型变量,值为数字类型变量,值为1的返回值,值为的返回值,值为2的返回值的返回值)例如,Nop是1-4的值,转换成+ 、-、运算符的语句如下: Op=Choose(Nop,+,-,)当值为1,返回字符串“+”,然后放入Op变量中,值为2,返回字符串“-”,依次类推;当Nop是1-4的非整数,系统自动取Nop的整数办法在判断;若Nop不在14之间,函数返回Null值。(3)Switch函数形式是:Switch(条件表达式条件表达式1,条件表达式,条件表达式1为为True时的值时的值,条件表达式,条件表达式2,条件表达式,条件表达式2为为True时的值时的值)常常 见见 错错 误误1在选择结构中缺少配对的结束语句对多行式的If块语句中,应有配对的 End If语句结束。2. 多边选择ElseIf关键字的书写和条件表达式的表示 ElseIf 不要写成Else If;多个条件表达式次序问题,见例4.3。3. Select Case语句的使用 Select Case 后不能出现多个变量;Case子句后不能出现变量,见例4.6。4.3 4.3 循循 环环 结结 构构1. For循环语句循环语句 (一般用于循环次数已知)形式For 循环变量初值循环变量初值 to 终值终值 Step 步长步长 语句块语句块Exit For 语句块语句块 Next 循环变量循环变量循环变量 =终值 语句块ExitFor语句块循环变量加步长TF循环变量得初值循环体例4.8计算1100的奇数和,程序段如下:Dimi%,s%等价于:Dimi%,s%s=0s=0:i=1Fori=1To100step2re:Ifi0初值终值=1时,可省略终值=0死循环循环次数要注意:要注意:v出了循环,循环控制变量值的问题。例程序段:Fori=2To13Step3循环执行次数Printi,输出i的值分别为:Nexti25811Print:Print“I=“,i出了循环输出为:I=14v在循环体内对循环控制变量可多次引用;但最好不要对其赋值,否则影响原来的循环控制规律。步长例4.9 改变循环控制变量对循环的影响。PrivateSubCommand1_Click()j=0Fori=1To20Step2i=i+3j=j+1Print第;j;次循环i=;iNextiPrint退出循环后i=;iEndSub正常情况:i=1,3,5,7,9,11,13,15,17,19现在:i=4,9,14,19例4.10 输出可打印的ASCII码字符与它的编码值。2. DoLoop循环语句循环语句(用于控制循环次数未知)形式1:Do While|Until 语句块语句块 Exit Do 语句块语句块 Loop形式2:Do 语句块语句块 Exit Do 语句块语句块Loop While|Until 例4.11 我国有13亿人口,按人口年增长0.8%计算,多少年后我国人口超过26亿。分析:解此问题两种方法,可根据公式:26=13*(1+0.008)n 直接利用标准对数函数求得;也可利用循环求得,程序如下:PrivateSubCommand1_Click()x=13n=0DoWhilexn;(2)m除以n得余数r;(3)若r=0,则n为最大公约数结束;否则执行(4);(4)mn,nr,再重复执行(2)。例求m=14 ,n=6的最大公约数.If m n Then t = m: m = n: n = t r=m mod n Do While (r 0) m=n n=r r= m mod n Loop Print 最大公约数最大公约数=, n mnr14626 2 0辗转相减法 m=m-n mn n=n-m nmm、n为公约数m=nDo While m n mnIf m n Then 146 m = m n 86 Else 26 n = n m 24 End If 22Loop3. 循环的嵌套循环的嵌套一个循环体内又包含了一个完整的循环结构称为循环的嵌套.例例4.13打印九九乘法表.For i = 1 To 9 For j = 1 To 9 se = i & & j & = & i * j Picture1.Print Tab(j - 1) * 9 + 1); se; Next j Picture1.Print Next i思考:思考:打印上三角或下三角程序如何改动?要打印下三角打印上三角或下三角程序如何改动?要打印下三角?For j = 1 To iFor ii =1 To 10 For jj=1 To 20 Next ii Next jjFor ii =1 To 10 For ii=1 To 20 Next ii Next iiFor ii =1 To 10 For jj=1 To 20 Next jj Next iiFor ii =1 To 10 Next ii For ii =1 To 10 Next ii 对于循环的嵌套,要注意以下事项:内循环变量与外循环变量不能同名;外循环必须完全包含内循环,不能交叉;不能从循环体外转向循环体内,反之则可以。正确错误4.4 4.4 其他辅助控制语句其他辅助控制语句 1. Go To 语句语句 形式形式: Go To 标号标号|行号行号作用:无条件地转移到标号或行号指定的那行语句.标号是一个字符序列,行号是一个数字序列. 2.Exit语句语句多种形式:Exit For、Exit Do、Exit Sub、Exit Function等。作用:退出某种控制结构的执行。 3. End语句语句多种形式:End、EndIf、EndSelect、EndWith、EndType、EndSub、EndFunction、作用:End结束一个程序的运行;其余表示某个结构的结束,与对应的结构语句配对出现。4.With 语句语句形式如下:With对象语句块EndWith作用:对某个对象执行一系列的操作,而不用重复指出对象的名称。WithLabel1.Height=2000.Width=2000.FontSize=22.Caption=MyLabelEndWithLabel1.Height=2000Label1.Width=2000Label1.FontSize=22Label1.Caption=MyLabel等价4.5 4.5 常用算法(一)常用算法(一)算法是对某个问题求解过程的描述1. 1. 累加、连乘累加、连乘1100的5或7的倍数的和Sum = 0Fori=1To100IfiMod5=0OriMod7=0ThenSum = Sum + iEndIfNextiPrintSum310的乘积t = 1Fori=3To10t = t * iNextiPrintt思考:若把循环体前面置各变量初值的语句放在循环体内,程序运行时会产生什么情况?例例4.14 求自然对数e的近似值,要求其误差小于0.00001,近似公式为: 该例题涉及两个问题: (1)用循环结构求级数和的问题。本例根据某项值的精度来控制循环的结束与否。 (2)累加:e=e+t 循环体外对累加和的变量清零 e=0 连乘:n=n*i 循环体外对连乘积变量置1 n=1 Private Sub Form_Click()Private Sub Form_Click() Dim i%,n&, t!, e! Dim i%,n&, t!, e! e = 0 : n = 1 e = 0 : n = 1 e存放累加和、n存放阶乘 i = 0 : t = 1 i = 0 : t = 1 i计数器、t第i项的值 Do While t 0.00001Do While t 0.00001 e = e + t : i = i + 1 e = e + t : i = i + 1 累加、连乘 n = n * i : t = 1 / nn = n * i : t = 1 / n Loop Loop Print Print 计算了计算了 ; ; i; i; 项的和是项的和是 ; ; e eEnd SubEnd Sub2. 求素数求素数素数是一个大于2,且不能被1和本身以外的整数整除的整数。判别某数m是否为素数最简单的方法是:对于m从i=2,3,m-1判别m能否被i整除,只要有一个能整除,m不是素数,否则m是素数。例例4.15 求100以内素数的代码:For m = 2 To 100 For i = 2 To m - 1 If (m Mod i) = 0 Then GoTo NotNextM Next i Print mNotNextM: Next mm是否为素数求100以内的素数思考:思考:此例用GoTo语句对非素数不作判断,若不用GoTo语句,如何修改程序?3.3.穷举法穷举法“穷举法”也称为“枚举法”或“试凑法”,即将可能出现的各种情况一一测试,判断是否满足条件,一般采用循环来实现。例例4.16百元买百鸡问题。假定小鸡每只5角,公鸡每只2元,母鸡每只3元。现在有100元钱要求买100只鸡,编程列出所有可能的购鸡方案。设母鸡、公鸡、小鸡各为x、y、z只,根据题目要求,列出方程为:x+y+y=1003x+2y+0.5z=100三个未知数,两个方程,此题有若干个解。解决此类问题采用“试凑法”,把每一种情况都考虑到。方法一:最简单三个未知数利用三重循环来实现。方法二:从三个未知数的关系,利用两重循环来实现。4.4.递推法递推法 “递推法”又称为“迭代法”,其基本思想是把一个复杂的计算过程转化为简单过程的多次重复。每次重复都从旧值的基础上递推出新值,并由新值代替旧值。 例例4.17猴子吃桃子。小猴在某天摘桃若干个,当天吃掉一半多一个;第二天吃了剩下的桃子的一半多一个;以后每天都吃尚存桃子的一半多一个,到第7天要吃时只剩下一个,问小猴共摘下了多少个桃子?分析:这是一个“递推”问题,先从最后一天推出倒数第二天的桃子,再从倒数第二天的桃子推出倒数第三天的桃子。设第n天的桃子为xn,那么它是前一天的桃子数的xn-1的一半减1,即xn=(xn-1+1)25.5.最小、最大值最小、最大值在若干个数中求最大值,一般先假设一个较小的数为最大值的初值,若无法估计较小的值,则取第一个数为最大值的初值;然后将每一个数与最大值比较,若该数大于最大值,将该数替换为最大值;依次逐一比较。例例 随机产生随机产生1010个个100100200200之间的数,求最大值。之间的数,求最大值。 PrivateSubCommand1_Click()Max = 100Fori=1To10x=Int(Rnd*101+100)Printx;If x Max Then Max = xNextiPrintPrint最大值=;MaxEndSub例4.18 实际应用,求最短残料。有一根长度为321米的钢材料,要将它截取成两种规格a、b的长度分别为17米和27米的短料,每种至少1段,问分隔成a,b各多少段后,剩余的残料r最少?分析,该题利用“试凑法”通过二重循环求残料r的最小值正数,残料不可能是负数。程序如下:PrivateSubCommand1_Click()Dima%,b%,r!,ia%,ib%r=321 最小值初值取钢材料的长度Forb=1To32127 b最多的段数Fora=1To32117-b a最多的段数t=321-b*27-a*17 当前的残料Ift0AndtMax ThenMax=iA(i)iMax=i End If Next I5. 5. 将数组中各元素交换将数组中各元素交换For i =1 To 102 t=iA(i) iA(i)=iA(10-i+1) iA(10-i+1)=t Next I5.5 5.5 控控 件件 数数 组组一组相同类型的控件组成。它们共用一个控件名,具有相同的属性,建立时系统给每个元素赋一个唯一的索引号(Index)。控件数组共享同样的事件过程,通过返回的下标值区分控件数组中的各个元素。例:Private Sub cmdName _Click(Index As Integer) If Index = 3 then 处理第四个命令按钮的操作处理第四个命令按钮的操作 End If End Sub1.1.在设计时建立控件数组在设计时建立控件数组l在窗体上画出控件,进行属性设置,这是建立的第一个元素l选中该控件,进行“Copy”进行若干次和“Paste”操作建立了所需个数的控件数组元素。l进行事件过程的编程。例例5. 3建立含有四个命令按钮的控件数组,当单击某个命令按钮,分别显示不同的图形或结束操作。Private Sub Command1_Click(Index As Integer) Select Case Index Case 0 画直线画直线 Case 1 画矩形画矩形 Case 2 画圆画圆 Case Else End End Select End Sub控件名IndexCaption Command10直线 Command11矩形Command12圆Command13结束Picture1空白2 2运行时添加控件数组运行时添加控件数组建立的步骤如下:l在窗体上画出某控件,设置该控件的Index值为0,表示该控件为数组,这是建立的第一个元素。l在编程时通过Load方法添加其余的若干个元素,也可以通过Unload方法删除某个添加的元素l每个新添加的控件数组通过Left和Top属性确定其在窗体的位置,并将Visible属性设置为True。 例例5.4利用在运行时产生控件数组,构成一个国际象棋棋盘。当单击棋格,显示对应的序号,并且将所有棋格颜色变反。5.6 5.6 自定义数据类型自定义数据类型 一组不同类型变量的集合。相当于C语言中的结构类型;Pascal中的记录类型。1.1.自定义类型的定义自定义类型的定义 形式如下:Type自定义类型名元素名(下标)As类型名元素名(下标)As类型名End Type例如,以下定义了一个有关学生信息的自定义类型:TypeStudTypeNoAsInteger学号NameAsString*20姓名SexAsString*1性别Mark(1To4)AsSingle4门课程成绩TotalAsSingle总分EndType元素名:表示自定义类型中的一个成员元素名:表示自定义类型中的一个成员下标:表示是数组下标:表示是数组类型名:为标准类型类型名:为标准类型注意:注意:(1)自定义类型一般在标准模块(.BAS)中定义,默认是Public;在窗体必须是Private。(2)自定义类型中的元素类型可以是字符串,但应是定长字符串。(3)不要将自定义类型名和该类型的变量名混淆,前者表示了如同Integer、Single等的类型名,后者VB根据变量的类型分配所需的内存空间,存储数据。(4)自定义类型一般和数组结合使用,简化程序的编写。2 2自定义类型变量的声明和使用自定义类型变量的声明和使用(1)声明形式:Dim变量名As自定义类型名例DimStudentAsStudType(2)引用形式:变量名.元素名例表示Student变量中的姓名,第4门课程的成绩,则表示如下:Student.Name,Student.Mark(4)3 3自定义类型数组的应用自定义类型数组的应用例例5.5 利用自定义类型数组,编写一个输入、显示、查询程序。5.7 常用算法(二)常用算法(二) 1. 1. 统计统计 例例5.6输入一串字符,统计各字母出现的次数,不区分字母大小写。分析:统计26个字母出现的个数,先声明一个具有26个元素的数组,每个元素的下标表示对应的字母,元素的值表示对应字母出现的次数。从输入的字符串中逐一取出字符,转换成大写字符(不区分大小写),进行判断。运行界面:For I = 1 To le c = UCase(Mid(Text1, I, 1) If c = A And c = Z Then j = Asc(c) - 65 + 1 a(j) = a(j) + 1 End IfNext I2.2.大量数据的输入大量数据的输入例例5.7 输入一系列的数据,并将它们分离后存放在数组中。对输入的数据允许修改和自动识别非数字数据。分析:(1)利用文本框输入和编辑数据,输入时去除非法数字。(2)输入结束利用Rplace函数去除重复输入的分隔符;(3)对利用Split函数按分隔符分离,放到数组中;(4)还可利用Join函数将数组中各元素合并成一个字符串。3.3.数组排序(选择法)数组排序(选择法)例例5.8对已知存放在数组中的n个数,用选择法按递增顺序排序。(1)从n个数的序列中选出最小的数(递增),与第1个数交换位置;(2)除第1个数外,其余n-1个数再按(1)的方法选出次小的数,与第2个数交换位置;(3)重复(1)n-1遍,最后构成递增序列。For i = 1 To n - 1 iMin= i For j = i+1 To n If iA(j) iA(iMin) Then iMin = j Next j t= iA(i): iA(i) = iA(iMin) : iA(iMin) = tNext I 排序(冒泡法)排序(冒泡法)例例5.9选择法排序在每一轮排序时找最小(递增次序)数的下标,出了内循环(一轮排序结束),再交换最小数的位置;而冒泡法排序在每一轮排序时只要将第一个与其他几个比较,只要次序不对,就交换,出了内循环,最小数已冒出。排序进行的过程见下表。 For i = 1 To n-1 进行n-1轮比较 For j = i+1 To n 从ni个元素进行两两比较 If iA(j) iA(i) Then 若次序不对,则马上进行交换位置 t = iA(j) : iA(j) = iA(i) : iA(i) = t End If Next j 出了内循环,一轮排序结束,最小数已冒到最上面 Next i4.4.数组元素的插入与删除数组元素的插入与删除 (1) 插入插入例例5.10在有序数组a(1ton)(原有n-1个元素)插入一个值Key元素,算法:查找要插入的位置k(1=k0 找到用找到用NewS 字符子串替换字符子串替换OldS字符子串字符子串s=Left(s,i-1)+NewS+Mid(s,i+lenOldS)i=InStr(s,OldS) 找下一个找下一个OldS字符子串字符子串LoopMyReplace=s 替换后的字符串赋值给函数过程名替换后的字符串赋值给函数过程名EndFunction假定S为“abcdefgabcd”,Oolds为“cd”,News为“3”,调用MyReplace函数的返回值为“ab3efgab3”。上述程序循环执行2次:(“abcdefgabcd”,“cd”,“3”) 第1 次 i=3 结果 “ab3efgabcd” (“ab3efgabcd”,“cd”,“3”) 第2 次 i=9 结果 “ab3efgab3” 3.3.函数过程的调用函数过程的调用函数过程调用同标准函数调用,形式:函数过程名函数过程名(参数列表参数列表)参数列表:称为实参或实元,它必须与形参个数相同,位置与类型一一对应。可以是同类型的常量、变量、表达式。PrivateSubCommand1_Click()s=“VB程序设计教程5.0版”PrintMyReplace(s,5.0,6.0)EndSubFunctionMyReplace$(s$,OldS$,NewS$)Dimi%,lenOldS%lenOldS=Len(OldS)i=InStr(s,OldS)DoWhilei0s=Left(s,i-1)+NewS+Mid(s,i+lenOldS)i=InStr(s,OldS)LoopMyReplace=sEndFunctionEndSubPrivateSubCommand1_Click()s=VB程序设计教程5.0版PrintMyReplace(s,5.0,6.0)S”5.0”6.0”MyReplace$(s$,OldS$,NewS$)程序运行的流程程序运行的流程 :6.2 6.2 子子 过过 程程函数过程的不足:(1)不是为了获得某个函数值,而是为了某种功能的处理,如例1.1。(2)要获得多个结果。 1. 1.引引例例6.3编写一个两个数交换的过程供多次调用。Swap(x,y)子过程的定义主调程序调用Swap子过程PublicSubSwap(x,y)PrivateSubForm_Click()DimtDima,bt=xa=10x=yb=20y=tCallSwap(a,b)EndSubPrinta=;a,,b=;bEndSub2.2.子过程定义子过程定义Sub 子过程名子过程名(参数列表)局部变量或常数定义语句ExitSub语句End Sub3.3.子过程的调用子过程的调用 子过程名子过程名参数列表或Call 子过程名子过程名(参数列表)4.4.子过程与函数过程区别子过程与函数过程区别:(1)函数过程名有值,有类型,在函数体内至少赋值一次;子过程名无值,无类型,在子过程体内不能对子过程名赋值;(2)调用时,子过程调用是一句独立的语句。函数过程不能作为单独的语句加以调用,必须参与表达式运算。(3)一般当过程有一个函数值,使用函数过程较直观;反之若过程无返回值,或有多个返回值,使用子过程较直观。例6.4分别编一计算某级数部分和的子过程和函数过程,并调用。级数为:精度为:函数过程实现求部分级数和 Function Function jishu1jishu1(x!,(x!, eps eps#)#) As Double Dim n%, s#, t#n = 1: s = 0: t = 1Do While (Abs(t) = eps) s = s + t t = t * x / n n = n + 1Loop jishu1 = sEnd FunctionEnd Function子过程实现求部分级数和 Sub jishu2Sub jishu2(s#, x!, eps#) Dim n%, t#n = 1: s = 0: t = 1Do While (Abs(t) = eps) s = s + t t = t * x / n n = n + 1LoopEnd SubEnd Subf1 = jishu1(2#, 0.000001) 调用函数过程Call jishu2(f2, 2#, 0.000001) 调用子过程或 jishu2 f2,2#,0.00001 程序运行流程:程序运行流程:Private Sub Command1_Click() Dim f1#, f2# f1 = jishu1(2#, 0.000001) Call jishu2(f2, 2#, 0.000001) Print f1=; f1, f2 = ; f2 End SubSub jishu2(s#, x!, eps#) s=表达式表达式End Sub找子过程名调用找子过程名调用jishu2Function jishu1(x!, eps#) As Doubl jishu=表达式表达式End Function找函数名调用找函数名调用jishu1jishu1函数名带了值返回函数名带了值返回6.3 6.3 参数传递参数传递指主调过程的实参传递给被调过程的形参。1. 1. 传址与传值传址与传值传址:传址: 形参得到的是实参的地址地址,当形参值的改变同时也改变实参的值也改变实参的值。传值:传值: 形参得到的是实参的值值,形参值的改变不会影响实参的值不会影响实参的值。例例6.5两个变量的交换。Sub Swap1(ByVal x%, ByVal y%) t% = x: x = y: y = tEnd SubPrivate Sub Command1_Click() a% = 10: b% = 20: Swap1 a, b 传值传值 Print A1=; a, B1=; b a = 10: b = 20: Swap2 a, b 传址传址 Print A2=; a, B2=; bEnd Sub例例6.6 求若干个数的最大公约数。Sub Swap2(x%, y%) t% = x: x = y: y = tEnd Sub2. 2. 数组参数的传递数组参数的传递当参数是数组通过传址方式进行传递。注意:在实参和形参中写数组名,忽略维数的定义,但圆括号不能省。被调过程可通过Lbound和Ubound函数确定实参数组的下、上界。Lbound和Ubound函数的形式如下:L|Ubound(数组名,维数)其中:维数指明要测试的是第几维的下标值,缺省是一维数组。例6.7编一函数tim,求任意一维数组中各元素之积。调用tim,求和Function tim(a() As Integer) Dim t#, i% t = 1 For i = Lbound(a) To Ubound(a)t = t * a(i) Next i tim = tEnd Function调用:调用:SubCommand1_Click()Dima%(1To5),b%(3To8) t1# = tim(a() t2 #= tim(b()Printt1,t2EndSub使用过程注意事项:使用过程注意事项:1. 1. 确定自定义的过程是子过程还是函数过程确定自定义的过程是子过程还是函数过程函数过程名有值,子过程名无值。2 2过程中形参的个数和传递方式的确定过程中形参的个数和传递方式的确定过程中参数的作用是实现过程与调用者的数据通信。(1)从主调程序获得初值,值传递。(2)将结果返回给主调程序,地址传递。3. 3. 实参与形参结合时对应问题实参与形参结合时对应问题 个数、类型、位置、次序一一对应。形参是值传递,对应实参可以是表达式、常量、数组元素。形参是地址传递,对应实参只能是简单变量。数组、记录类型、对象只能是地址传递。实验实验6.2子过程子过程DeleStr(s1,ByVal s2 As String)形参的确定形参的确定 s1,要处理的字符串,从主调程序得初值,删除子串后结果在s1中,所以用地址传递。s2删除的子串,值传递。实验实验6.3函数过程函数过程 MaxLength(s)形参的确定形参的确定s要处理的字符串,值传递。MaxLength函数名,最长的单词长度。实验实验6.4回文数的判断中形参的确定回文数的判断中形参的确定1.函数过程,用一个形参,值传递对所判断的数字;函数名是否为回文数。FunctionIsH(ByValssAsString)AsBoolean2.子过程,用两个形参,值传递对所判断的数字,地址传递是否为回文数。Subhui(ByValssAsString,TagAsBoolean)6.4 变量、过程的作用域作用域:变量、过程随所处的位置不同,可被访问的范围。1.1.过程的作用域过程的作用域窗体/模块级:加Private关键字的过程,只能被定义的窗体或模块中的过程调用。全局级:加Public关键字(缺省)的过程,可供该应用程序的所有窗体和所有标准模块中的过程调用。2. 2. 变量的作用域变量的作用域局部变量:在过程内用声明的变量,只能在本过程中使用。窗体/模块级变量:在“通用声明”段中用Dim语句或用Private语句声明的变量,可被本窗体/模块的任何过程访问。全局变量:在“通用声明”段中用Public语句声明的变量,可被本应用程序的任何过程或函数访问。例如在下面一个标准模块文件中不同级的变量声明:PublicPaAsinteger全局变量PrivateMbAsstring*10窗体/模块级变量SubF1()DimFaAsinteger局部变量EndSubSubF2()DimFbAsSingle局部变量EndSub若在不同级声明相同的变量名,系统按局部、窗体/模块、全局次序访问如:PublicTempAsinteger全局变量 Sub Form_Load() Dim Temp As Integer局部变量Temp=10访问局部变量Form1.Temp=20 访问全局变量必须加窗体名PrintForm1.Temp,Temp显示2010EndSub3. 3. 静态变量静态变量局部变量声明:Dim 声明声明,随过程的调用而分配存贮单元,每次调用都对变量初始化;过程体结束,变量的内容自动消失,存储单元释放。Static 声明声明,每次调用过程,变量保持原来的值。声明形式:Static变量名AS类型StaticFunction函数过程名(参数列表)As类型StaticSub子过程名(参数列表)过程名前加Static,表示该过程内的局部变量都是静态变量。例例6.9 Private Sub Form_Click() Dim i% ,isum% For i = 1 To 5isum = sum(i)Print isum Next i End SubPrivate Function sum(n As Integer)Dim j As Integerj = j + n sum = jEnd FunctionStatic j As Integer,结果?结果为:1,2,3,4,5Subf1(x)x=f2(xx)*3EndSubSubCommand1_Click()Callf1(y)EndSubFunctionf2(x)f2=f3(x)+3EndSubFunctionf3(x)f3=x*xEndSubSubf1(x)Callf1(y)EndSub过程的直接调用过程的直接调用SubCommand1_Click()Callf1(y)EndSub过程的递归调用过程的递归调用6.5 6.5 递归递归1.1.递归的概念递归的概念用自身的结构来描述自身就称为“递归”。例对阶乘的定义:2. 递归过程递归过程过程在自身定义的内部调用自己。例例6.10编fac(n)=n! 的递归函数Function fac(n As Integer) As Integer If n = 1 Then fac = 1 Elsefac = n * fac(n - - 1) End If End FunctionSub Command1_Click() Print “fac(4)=”;fac(4)End Sub结果:fac(4)=24递推回归在递归处理中,用栈来实现。栈中存放形参、局部变量、返回地址。递推过程:每调用自身,当前参数压栈,直到达到递归结束条件。回归过程:不断从栈中弹出当前的参数,直到栈空。递归算法设计简单,但消耗的机时和占据的内存空间比非递归大。思考:若上述fac函数中少了:Ifn=1Thenfac=1即仅有语句:fac=n*fac(n-1)或nr Then Callf(n r, r) Print n Mod r; End SubPrivate Sub Command1_Click() Call f(100, 8)End Sub显示结果显示结果 1 4 4例6.12打印分形图递归常见错误:递归常见错误: 1.递归调用出现“栈溢出” 在递归调用时,其中的参数要向终止方向收敛。如下求阶乘的递归函数过程:Public Function fac(n As Integer) As IntegerIf n = 1 Then fac = 1Else fac = n * fac(n - 1)End IfEnd FunctionPrivate Sub Command1_Click() Print fac(5)= ;fac(5) Print fac(5)= ;fac(-5) 栈溢出栈溢出End Sub 1.1.数制转换数制转换例6.13将一个十进制整数m转换成r (216)进制字符串。方法:将m不断除r 取余数,直到商为零,以反序得到结果。6.6 6.6 常用算法常用算法( (三)三)2.2.例例6.146.14加密和解密加密和解密简单加密的思想是:将每个字母C加一序数K,式子c=chr(Asc(c)+k),例如序数k为5,这时“A”“F”,“a”“f”,“B”“G”当加序数后的字母超过“Z”或“z”则c=hr(Asc(c)+k-26)。解密为加密的逆过程。返回返回2242243.3.查找查找(1)顺序查找例例6.15。顺序查找根据查找的关键值与数组中的元素逐一比较(数组可无序)Public Sub Search(a() As Variant, ByVal key As Variant, index%) Dim i% For i = LBound(a) To UBound(a) If key = a(i) Then 找到,元素的下标在index中,结束查找 index = i Exit Sub End If Next i index = -1 找不到,index形参的值为-1End Sub平均查找次数平均查找次数 n/2Keya(mid)low=mid+1查找区域缩小一半,继续直到找到或查找区域中无元素.本例用递归实现6.16Subbirsearch(a(),low%, high%, key, index%)(2)二分法查找二分法查找要查找的数组必须有序必须有序。思想:要查找的关键值Key同数组的中间mid项元素比较:12345678111222333444555666777888Lowhighmid444Key4.4.排序排序选择、冒泡、插入法排序等。前两种排序欲排序的数据全部输入后,再进行排序;插入法排序每输入一项,马上插入到数组应在的位置,数组始终有序。例例6.17 6.17 实现的步骤: (1)输入欲排序的数据项x;在数组a中找x应所处的位置j; (2)从数组的最后一个元素开始到下标j依次往后移,使j位置空出; (3)将x放入位置j处,一个数据插入完成; (4)有若干个数重复(1)(3)。5. 5. 例例6.18 6.18 高次方程求根高次方程求根 有牛顿迭代法、二分法、弦截法等(1)牛顿迭代法迭代公式:思想:对方程给定一个初值x0作为方程的近似根,利用迭代公式,求得x1,当 x1为求得的近似根,否则x1作为x0再迭代。(2) (2) 二分法求根二分法求根思想:已知求根区间a,b有一根,每次把求根区间缩小一半,直到找到解或求根区间足够小。方法:求a,b的中点c,判断:f(c)=0,,c为求得的根,结束;f(a)与f(c)同号,则a,c无根,代替a;否则c,b无根,c代替b;使求根区间缩小一半,重复上述步骤,直到区间小于精度。Public Function halfRoot(ByVal a!, ByVal b!) Dim c! Do While Abs(b - a) 0.00001 c = (a + b) / 2 If f(c) = 0 Then Exit Do ElseIf f(a) * f(c) 0 Then a = c Else b = c End If Loop halfRoot = cEnd Function6.6.例例6.196.19数值积分数值积分有矩形法、梯形法、抛物线法(又称辛卜生法)等。梯形法积分的思想是:将积分区间a,bn等分,小区间的长度为,第i块小矩形的近似面积为:整个积分的结果为这n块小面积的累加,即:Public Function trapez(ByVal a!, ByVal b!, ByVal n%) As Single Dim sum!, h!, x! h = (b - a) / n sum = (f(a) + f(b) / 2 For i = 1 To n - 1 x = a + i * h sum = sum + f(x) Next itrapez = sum * hEnd Function7.7.字符串处理字符串处理例6.20编写一个英文打字训练的程序.要求如下:(1)在标签框内随机产生30个字母的范文;(2)当焦点进入文本框时开始计时,并显示当时时间;(3)在键入文本框按产生的范文输入相应的字母;(4)当键入满了30个字母后结束计时,禁止向文本框输入内容,与范文逐一比较,显示打字的速度和正确率。6.7 重点和难点1. 1. 确定自定义的过程是子过程还是函数过程确定自定义的过程是子过程还是函数过程函数过程名有值,子过程名无值。过程有一个返回值,则使用函数过程;若返回多个值或无返回值,一般使用子过程。2 2过程中形参的个数和传递方式的确定过程中形参的个数和传递方式的确定过程中参数的作用是实现过程与调用者的数据通信。(1)从主调程序获得初值,值传递。(2)将结果返回给主调程序,地址传递。3. 3. 实参与形参结合时对应问题实参与形参结合时对应问题 个数、类型、位置、次序一一对应。形参是值传递,对应实参可以是表达式、常量、数组元素。形参是地址传递,对应实参只能是简单变量。数组、记录类型、对象只能是地址传递。4. 4. 变量的作用域问题变量的作用域问题局部变量、静态变量、全局变量特点、作用5. 5. 递归调用出现递归调用出现“栈溢出栈溢出”递归过程中有终止的条件和终止时的值或某种操作;每递归调用一次,其中的参数要向终止方向收敛。第七章第七章 常常 用用 控控 件件7.1 7.1 单选按钮和复选框单选按钮和复选框7.2 7.2 框架框架7.3 7.3 列表框和组合框列表框和组合框7.4 7.4 滚动条和滚动条和SlideSlide控件控件7.5 7.5 时钟时钟7.6 7.6 ProgressBarProgressBar控件控件7.7 7.7 UpDownUpDown控件控件7.8 7.8 AnimationAnimation控件控件7.9 7.9 SSTabSSTab控件控件7.10 7.10 鼠标器和键盘鼠标器和键盘1.1. 标准控件标准控件2.内部控件3.出现在工具箱上的控件20个。2. ActiveX控件控件 ActiveX部件:是可以重复使用的编程代码和数据。是由用ActiveX技术创建的一个或多个对象所组成。ActiveX部件文件:扩展名OCX,在Windows的SYSTEM目录中。ActiveX部件ActiveX控件ActiveX文档ActiveXDLLActiveXEXEActiveX控件添加到工具箱:工程/部件选定控件常用ActiveX控件所在的文件:ActiveX控件ActiveX部件文件名通用对话框(CommonDialog)MicrosoftCommonDialogControl6.0COMDLG32.OCXToolBarMicrosoftWindowsCommonControl6.0MSCOMCTL.OCXStatusBarProgressBarSliderAnimationMicrosoftWindowsCommonControl-26.0MSCOMCT2.OCXUpDownActiveX控件与ActiveXDLL/EXE的区别:ActiveX控件:有界面;用“工程/部件”命令加载;工具箱上有图标。ActiveXDLL/EXE:没有界面;用“工程/引用”设置引用;工具箱上没有图标。3. 可插入对象可插入对象Windows应用程序的对象;可插入对象可添加到工具箱上;同标准控件一样使用。例如:MicrosoftExcel工作表。7.1 单选钮和复选框单选钮和复选框Caption属性:属性:文本标题。Alignment属性属性0:控件钮在左边,标题显示在右边。1:控件钮在右边,标题显示在左边。Value属性属性单选钮( (逻辑型逻辑型) ) 检查框(数值型)(数值型)True:选定 0-Unchecked:未被选定False:未选定 1-Checked:选定2-Grayed:灰色,禁止选择Style属性属性0-Standard:标准方式1-Graphical:图形方式 事件事件:Click因为单击时自动改变状态,故不需要编写过程。例例7.1 7.1 用单选钮和检查框设置文本框的字体。7.2 框架框架(Frame)框架内控件的创建方法:框架内控件的创建方法:方法1:单击工具箱上的工具,然后用出现的“+”指针,在框架中适当位置拖拉出适当大小的控件。不能使用双击工具箱上图标的自动方式。方法2:将控件“剪切”到剪贴板,然后粘贴(Ctrl+V)到框架。框架设Caption为字体Caption属性属性:框架标题Enabled属性属性False:标题呈灰色,不允许对框架内的对象进行操作。Visible属性属性True:框架及其控件可见。False:框架及其控件被隐含起来。Click、DblClick事件:一般不需要编写框架的事件过程。例例7.27.2 框架用法示例。7.3 列表框和组合框列表框和组合框列表框各主要属性的值:List1.ListIndex=3(下标从0开始的)List1.ListCount=5List1.Selected(3)=True,其余为False。List1.Sorted=False,没有排序。List1.Text为“cox”,与List1.List(List1.ListIndex)相等List1列表框各主要属性的值:List1.ListIndex=0List1.ListCount=8List1.Selected(3)=True其余为False。List1.Sorted=FalseList1.Text为“李宁”Combo11. 共有的重要属性共有的重要属性(P:可在程序中设置或引用,D:可在设计状态设置。)List:PD字符型数组,存放列表框的项目,下标是从0开始。ListIndex:P选中的项目的序号,没有项目被选定时为-1ListCount:P项目的数量,ListCount-1是最后一项的下标。Sorted:DTrue:按字母顺序排列。False:按加入先后顺序排列。Text:P列表项中被选定的内容,List1.List(List1.ListIndex)=List1.Text。2. 列表框的特有属性列表框的特有属性Selected:P逻辑数组。Selected(i)的值为True表示第i+1项被选中。MultiSelect0-None:禁止多项选择。1-Simple:简单多项选择。2-Extended:扩展多项选择。3. 列表框的特有属性列表框的特有属性Style类型类型Style输入输入下拉式组合框0能简单组合框1能下拉式列表框2不能4. 方法方法AddItem对象.AddItemitem,indexRemoveItem对象.RemoveItemindexClear对象.Clear5. 事件事件列表框:Click、DblClick。组合框:Click,只有简单组合框才有DblClick事件。一般不需要编写Click事件过程。通常在单击命令按钮或发生DblClick事件时才读取Text属性。例例7.3对列表框进行项目添加、修改和删除操作。例例7.4对列表框进行项目添加、修改和删除操作。7.4 滚动条和滚动条和Slider控件控件共同具有的重要属性共同具有的重要属性Max:最大值 -3276832767Min:最小值-3276832767SmallChange最小变动值,单击箭头时移动的增量值。LargeChange最大变动值,单击空白处时移动的增量值。Value滑块所处位置所代表的值。水平滚动条垂直滚动条SmallChangeMinValueMaxSmallChangeLargeChangeLargeChangeSlider控件事件:事件:Scroll:拖动滑块时会触发Scroll事件。Change:Value属性改变时触发Change事件。例例7.5 用一个文本框(txtSpeed)显示滚动条(hsbSpeed)滑块当前位置所代表的值。例例7.6 调色板程序。SubhsbSpeed_Change()Text1.Text=HScroll1.ValueEndSub例例7.7用Slider控件设置文本框中的字体大小。时钟控件以Interval为时间间隔产生Timer事件。属性属性Interval属性单位:ms(0.001s),0.5秒是500。Interval0:屏蔽计时器。Enabled属性True:有效计时False:停止时钟工作事件事件Timer例例7.87.8 定时的闹钟例例7.9 7.9 蝴蝶飞舞7.5 时钟时钟(Timer)例例7.10用进度条指示一个大数组的计算进度。7.6 ProgressBar控件控件位于MicrosoftWindowsCommonControl6.0部件。重要属性:重要属性: Max、Min:该控件的界限。 Value:决定控件被填充多少。 位于MicrosoftWindowsCommonControl-26.0。通常与伙伴控件“捆绑”在一起使用。UpDown应用示例。7.7 UpDown控件控件位于MicrosoftWindowsCommonControl-26.0。属性:属性:Center:决定动画是否在控件的中央播放。AutoPlay属性:决定在用Open方法打开文件时是否自动播放。方法:方法:Open:打开文件;Play:播放动画;Stop:停止播放;Close:关闭文件。例例7.11 为例7.10配上动画。7.8 Animation控件控件位于MicrosoftTabbedDialogControl6.0。重要属性:重要属性:Style:选项卡样式;Tabs:选项卡总数;TabsPerRow:每一行选项卡的数目;Rows:选项卡总行数;TabOrientation:选项卡的位置;ShowFocusRect:决定选项卡上的焦点矩形是否可视;Tab:当前选项卡的序号。序号从0开始,如果Tab为1,则第二个选项卡为当前活动的选项卡。例例7.12选项卡制作示例。7.9 SSTab控件控件7.10 鼠标器和键盘鼠标器和键盘1. 1. 鼠标器事件鼠标器事件注意:鼠标事件发生在什么对象上,是窗体上还是控件上。MouseDownMouseDown事件事件Sub Form_MouseDown(Button As Integer, Shift As Integer,X As Single, Y As Single)(发生在窗体上的事件过程)MouseUpMouseUp事件事件Sub Form_MouseUp(Button As Integer, Shift As Integer,X As Single, Y As Single) (发生在窗体上的事件过程)MouseMoveMouseMove事件事件Sub Form_MouseMove(Button As Integer, Shift As Integer,X As Single, Y As Single) (发生在窗体上的事件过程)(1) (1) ButtonButton参数参数b2b1b0B0为1:按下了左键;B1为1:按下了右键;B2为1:按下了中键。例如:Button为2(010B),即B1为1,表示按下了右键;如果按了左键,则B0为1,B1和B2为0,Button为1(001B)If Shift = 1 Then 或者或者 If Shift = vbLeftButton Then 这是按了左健后执行的代码这是按了左健后执行的代码 Endif 使用符号常数:使用符号常数:1vbLeftButton:用户按下左键触发了鼠标事件;2vbRightButton:用户按下右键触发了鼠标事件;4vbMiddleButton:用户按下中键触发了鼠标事件。(2) (2) ShiftShift参数参数b2b1b0B0为1:按下了Shift键;B1为1:按下了Ctrl键;B2为1:按下了Alt键。例如:Button为2(010B),即B1为1,表示仅仅按下了Shift键;如果同时按了Ctrl和Shift键,则B0和B1为1,B2为0,Button为3(011B)注意:注意: 可能同时按下两个或三个键。如果Button1成立,并不表示没有按下Shift,因为可能其他键也被按下了。如果要测试按下了某个键,则应用and进行位运算。例如Buttonand1成立,表示肯定按下了Shift(可能其他键也被按下了)。If Shift = 1 and Button = 2 Then 这是这是仅仅按住按住Ctrl了健单击鼠标后执行的代码了健单击鼠标后执行的代码 End If 思考:Shift=1andButtonand2表示什么意义?符号常数:符号常数:1vbShiftMask;2vbCtrlMask;4vbAltMask 。ShfitAndvbCtrlMask为真:按下了Ctrl键;CBool(ShiftAndvbCtrlMask)OrCBool(ShiftAndvbShiftMask)为真,按下了Ctrl键和Shift键(3) x,y:鼠标的当前位置鼠标的当前位置例例7.13 7.13 显示鼠标器指针所指的位置。例例7.14 7.14 画圆程序。按下鼠标右键画圆,按下鼠标左键移动时画线。在画线时用note14.ico作为鼠标的指针。2. 键盘事件键盘事件 KeyPress事件过程事件过程SubForm_KeyPress(KeyAsciiAsInteger)Subobject_KeyPress(indexAsInteger,KeyAsciiAsInteger) KeyDown事件过程事件过程SubForm_KeyDown(keycodeAsInteger,shiftAsInteger)Subobject_KeyDown(indexAsInteger,keycodeAsInteger,shiftAsInteger)KeyUp和和KeyDown事件过程事件过程SubForm_KeyUp(keycodeAsInteger,shiftAsInteger)Subobject_KeyUp(indexAsInteger,keycodeAsInteger,shiftAsInteger) 参数说明参数说明Shift与鼠标事件过程Shift相同。KeyCode:键盘扫描码;KeyAscii:字符ASCII码。KeyPressKeyDown和和KeyUp事件发生的时间事件发生的时间输入一个ASCII字符按任意一个键参数值参数值KeyAscii接收到字符的ASCII值KeyCode接收到键的扫描码按按Shift+A时时事件发生的次数事件发生的次数事件发生一次事件发生两次按按Shift+A时参数值时参数值(键盘处于大写状态键盘处于大写状态)97第一次是17第二次是65按按Shift+A时参数值时参数值(键盘处于小写状态键盘处于小写状态)65第一次是17第二次是65区别区别窗体的:KeyPressKeyDownKeyUp 控件的:KeyPressKeyDownKeyUp 窗体的KeyPreview为True焦点在控件上输入Sub Form_KeyPress(KeyAscii AsInteger) KeyAscii = KeyAscii + 1End SubSub Text1_KeyPress(KeyAscii As Integer) KeyAscii = KeyAscii + 1End Sub假定窗体KeyPreview为True,并有下面事件过程,则当文本框中输入“1”时,实际上是得到的是“3”?窗体KeyPreview为False时在文本框中输入“1”时,实际上得到的是什么。在这里作一点修改在这里作一点修改影响所有控件影响所有控件在这里作一点修改在这里作一点修改影响一个控件影响一个控件对输入的数据进行验证、限制和修改对输入的数据进行验证、限制和修改1.修改输入数据接收大写字符。将KeyPreview设置为True时:Sub Form_KeyPress(KeyAscii As Integer) If KeyAscii = Asc(a) And KeyAscii = Asc(z) ThenKeyAscii = KeyAscii + Asc(A) - Asc(a) End IfEnd Sub如果把它改为某个控件的事件过程,效果一样吗?2.限制数据输入文本框只能接收“0”“9”的数字字符。Sub txtExample_KeyPress(KeyAscii As Integer) If KeyAscii 57 ThenKeyAscii = 0 End IfEnd Sub 例例7.15编写一个程序,当按下Alt+F5时终止程序的运行。先把窗体的KeyPreview设置为True,再编写如下的程序:SubForm_KeyDown(KeyCodeAsInteger,ShiftAsInteger)按下Alt键时,Shift的值为4If(KeyCode=vbKeyF5)And(Shift=4)ThenEndEndIfEndSub例例7.167.16 “锤打红心”游戏(1)利用上、下、左、右四个箭头键控制“铁锤”:“”:37(&H25)“”:38(&H26)“”:39(&H27)“”:40(&H28)(2) 如 果 Abs(Image1.Left - Image2.left 300) And Abs(Image1.Top -Image2.Top320)成立,则认为是重叠,“铁锤”锤打到“红心”。(3)在窗体上的时钟控件(Timer1)过程中控制“红心”移动。Timer1的Interval属性为200,即每1秒产生5个Timer事件。Image2Image13.3.拖放拖放自动拖放手工拖放 (1DragMode属性属性0:(缺省),手工拖动模式;1:自动拖动模式。( 2 )DragIcon属性属性拖动过程中显示的图标(Ico或Cur文件)。lblExample1.DragIcon=LoadPicture(C:IconsMail.ico)lblExample2.DragIcon=picIcon.Picture( 3 ) Drag方法方法当DragMode为0时,需用Drag方法启动拖放。控件名称.Drag参数0:开始拖放操作;1(省略):结束拖放操作;2:取消拖放操作。例例7.177.17拖放应用示例。例例7.187.18拖放应用示例。 4. 4. OLE OLE 拖放拖放 OLEDragMode属性(源控件设置):0-Manual:缺省,手工;1-Automatic:自动。OLEDropMode属性(目标控件设置):0-None:缺省,目标控件不接受“放”;1-Manual:手工实现“放”操作;2-Automatic:自动实现“放”。完全支持自动OLE拖放:PictureBoxImage TextBox。示例支持自动“拖”操作,不支持自动“放”:ComboBoxFileListBoxDirListBox和ListBox。示例只支持OLE拖放事件的控件有:CheckBoxFrameOptionButton、LabelDriveListBox CommandButton例例7.19从Windows资源管理器把文件的文件名拖到标签上。SubLabel1_OLEDragDrop(DataAsDataObject,EffectAsLong,_ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle)Label1.Caption=Data.Files(1)在资源管理器中选定文件且拖出时,系统就把所选定的文件名保存在Data对象的Files属性中,Files属性实质上是一个数组Label1.Caption=Data.Files(1)将保存的第一个文件名显示在标签中EndSubOLEDropMode为1(Manual)8.1 8.1 通用对话框通用对话框8.2 8.2 菜单设计菜单设计8.3 8.3 多重窗体和多文档界面多重窗体和多文档界面 8.4 8.4 工具栏和状态栏工具栏和状态栏8.5 8.5 RichTextBoxRichTextBox控件控件8.6 8.6 应用程序向导应用程序向导第八章第八章 界界 面面 设设 计计(3学时)学时)8.1 通用对话框通用对话框(CommonDialog)属性Action:打开通用对话框。DialogTiltle:对通用话框标题。CancelErrorTrue:选择“取消”按钮,出现错误警告;Err.Number置为32755(cdCancel)。False(缺省):选择“取消”按钮,没有错误警告。工程/部件选定部件标签选定MicrosoftCommDialogControl6.0通用对话框添加到工具箱:确定打开通用对话框:1.1.文件对话框(打开、保存)需设置的属性文件对话框(打开、保存)需设置的属性FilterFileNameInitDirFilterIndex属性属性FileName:包含路径;FileTitle:不包含路径。Filter:例如,Documents(*.DOC)|*.DOC|TextFiles(*.TXT)|*.txt|AllFiles|*.*FilterIndex:决定在文件类型列表框中显示第几组类型的文件。InitDir:初始化路径。“打开打开”文件对话框属性页文件对话框属性页DialogTiltleFileNameInitDirFilterFilterIndexDefaultExt例例8.18.1 用命令按钮的Click事件显示文件打开对话框。 CommonDialog1.InitDir=C:Windows设置初始目录CommonDialog1.Filter=文本文件|*.Txt过滤文件类型CommonDialog1.CancelError=True控制取消按钮CommonDialog1.ShowOpen 打开对话框2. “2. “另存为另存为”对话框对话框没有提供真正的存储文件操作,仍需要编程完成储存操作。属性属性 DefaultExt:缺省扩展名。3 3. . “颜色颜色”对话框对话框属性属性Color:返回或设置选定的颜色。例例8.28.2“颜色”对话框的使用。4.4.“字体字体”对话框对话框Flags属性:指示所显示的字体类型,必须设置必须设置。cdlCFScreenFonts&H1屏幕字体cdlCFPrinterFonts&H2打印机字体cdlCFBoth &H3打印机字体和屏幕字体。cdlCFEffects&H100显示删除线和下划线检查框以及颜色组合框FontNameFontBold、FontItalic FontSizeFontStrikethruFontUnderlineColorMin、Max 例例8.3字体对话框的使用。5. 5. “打印打印”对话框对话框属性属性FromPage:起始页号;ToPage:终止页号;Copies:打印份数。如果打印驱动程序不支持多份打印,该属性有可能始终返回1。 例例8.4打印对话框的使用。6. 6. “帮助帮助”对话框对话框帮助文件需要用其他的工具制作,如MicrosoftWindowsHelpCompiler。 例例8.5 属性属性HelpCommand:在线Help帮助类型;HelpFile:Help文件的路径及其名称;HelpKey:在帮助窗口显示由该帮助关键字指定的帮助信息。8.2 菜单的设计菜单的设计下拉式菜单系统的组成结构:主菜单名快捷键热键下级子菜单标记主菜单条分隔线菜单项子菜单名一、菜单编辑器的使用一、菜单编辑器的使用工具菜单编辑器(Ctrl+E);窗体上快显菜单菜单编辑器。常用属性:1.标题(Caption)热键前面加&2.名称(Name)文本框分隔符也应有名称3.快捷键(Shortcut)菜单名没有快捷键4.复选(Checked)检查框TRUE有5.有效(Enabled)检查框6.可见(Visible)检查框菜单列表框菜单项属性操作按钮例例 8.6 建立一个有菜单功能的文本编辑器。二、二、 菜单项增减菜单项增减在程序运行时,菜单随时增减,如“文件”菜单能保留最近打开的文件数。这同控件数组一样,使用菜单数组。步骤:1.在菜单设计时,加入一个菜单项,其Index为0(菜单数组),Visual为False。2.在程序运行时,通过Load方法向菜单数组增加新的菜单项。例例8.7 在8.6中的文件菜单中保留最近打开的文件清单。同样,要删除所建立的菜单项,使用UnLoad方法向菜单数组减少菜单项。三、三、 弹出菜单弹出菜单( (快捷菜单快捷菜单) )弹出菜单是独立于窗体菜单栏而显示在窗体内的浮动菜单。显示位置取决于单击鼠标键时指针的位置。设计与普通菜单相同(如果不希望菜单出现在窗口的顶部,该菜单名Visible属性设置为False)。菜单弹出的方法: 对象对象.PopupMenu 菜单名菜单名, 标志标志, x, y标志,表示弹出的位置和触发的键SubText1_MouseDown(ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle)IfButton=2ThenPopupMenuEditMenu,vbPopupMenuCenterAlignEndSub例例8.7 弹出菜单。8.3 多重窗体和多文档窗体多重窗体和多文档窗体一、多重窗体一、多重窗体1. 1. 添加窗体添加窗体 “工程|添加窗体”新建现存添加添加“现存现存”窗体时要注意:窗体时要注意:防止多个窗体的Name相同而不能添加;添加的窗体实际是将其他工程中已有的窗体加入,多个工程共享窗体;通过“另存为”命令以不同的窗体文件名保存,断开共享。 2. 2. 保存窗体保存窗体一个工程中有多个窗体,应分别取不同文件名保存在磁盘上,VBP工程文件中记录了该工程的所有窗体文件名。3. 3. 设置启动窗体设置启动窗体设置启动对象4. 4. 窗体语句窗体语句 (1)Load语句:装入窗体到内存但没有显示窗体形式:Load窗体名称(2)Unload语句:从内存删除窗体形式:Unload窗体名称“工程工程/属性属性” “启动对象启动对象” 5. 5. 窗体方法窗体方法(1)Show方法:显示一个窗体(当窗体没有Load,自动Load)窗体名称.Show模式0Modal:关闭才能对其他窗体进行操作。1Modeless,可以对其他窗体进行操作。(2)Hide方法:隐藏窗体,没有Unload删除窗体名称.Hide6. 6. 不同窗体间数据的存取不同窗体间数据的存取 (1)存取控件的属性存取控件的属性 另一窗体名.控件名.属性(2)存取变量的值存取变量的值另一窗体名.全局变量名例例8.8 8.8 输入和计算学习成绩。模块:模块:PublicMATHAsSinglePublicPHYSICSAsSinglePublicCHEMISTRYAsSinglePublicCHINESEAsSinglePublicENGLISHAsSingle二、二、 多文档界面多文档界面(MDI) 例例8.91. 1. 创建和设计创建和设计MDIMDI窗体及其子窗体窗体及其子窗体 (1) 创建和设计MDI窗体 创建:创建: “工程/添加MDI窗体”命令设计:设计:一般有菜单栏、工具栏、状态栏(2) (2) 创建和设计创建和设计MDIMDI子窗体子窗体 创建:创建: MDI子窗体是一个MDIChild属性为True的普通窗体。要创建多个子窗体,通过窗体类来实现:Public Sub FileNewProc() Dim NewDoc As New frmMDIChild No = No + 1 NewDoc.Caption = no & No NewDoc.Show End Sub设计:设计:可有菜单栏,但必须有文本框。MDI子窗体的Name2. 2. MDIMDI窗体与子窗体的交互窗体与子窗体的交互(1)活动子窗体和活动控件活动子窗体和活动控件MDI窗体的两个属性:ActiveForm和ActiveContro。l例:将子窗体的文本框中所选文本复制到剪贴板上。ClipBoard.SetTextfrmMDI.ActiveForm.ActiveControl.SelText(2)显示显示MDI窗体及其子窗体窗体及其子窗体显示任何窗体的方法为show,还有有关规则:加载子窗体时,其父窗体会自动加载并显示;反之则无。MDI窗体有AutoShowChildren属性,决定是否自动显示子窗体。(3)维护子窗体的状态信息维护子窗体的状态信息(4)用用QueryUnload卸载卸载MDI窗体窗体3. 3. 多文档界面应用程序中的多文档界面应用程序中的“窗口窗口”菜单菜单 (1)显示打开的多个文档窗口显示打开的多个文档窗口要在某个菜单上显示所有打开的子窗体标题,只需利用菜单编辑器将该菜单的WindowList属性设置为True。(2)排列窗口排列窗口利用Arrange方法进行层叠、平铺和排列图标。形式:MDI窗体对象.Arrange的排列方式: 8.4 工具栏和状态栏工具栏和状态栏“MicrosoftWindowsCommonControls6.0”将控件添加到工具箱,通过ToolBar、ImageList组合使用建立工具栏,步骤:(1)在ImageList控件中添加所需的图像。(2)在ToolBar控件中创建Button对象。(3)在ButtonClick事件中用SelectCase语句对各按钮进行相应的编程。一、在一、在ImageList控件中添加图像控件中添加图像ImageList控件不单独使用,专门为其他控件提供图像库。索引(Index)、关键字(Key)在ToolBar中引用图像文件的扩展名为:.ico、.bmp、.gif、.jpg等。二、在二、在ToolBar控件中添加按钮控件中添加按钮 1.为工具栏连接图像为工具栏连接图像 ToolBar与ImageList的连接工具栏样式 2.为工具栏增加按钮为工具栏增加按钮索引(Index)、关键字(Key)每个按钮的编号、标识,ButtonClick事件中引用;图像(Image)ImageList对象中的图像,值可以是Key或Index样式(Style),共6种除菜单按钮(5)外的5种样式三、三、 响应响应ToolBar控件事件控件事件 ToolBar控件常用的事件有两个:ButtonClick和ButtonMenuClick。前者对按钮样式为02,后者对样式为5的菜单按钮。(1)用索引Index确定按钮(2)用关键字Key确定按钮Private Sub Toolbar1_ButtonClick(Byval Button As ComctlLib.Button) Select Case Button.Index Case 1 FileNewProc Case 2 FileOpenProc End SelectEnd Sub注意:第1个按钮的Index值为1。用Index还是用Key比较,Key 可读性好,可维护性好。Select Case Button.Key Case TNew FileNewProc Case TOpen FileOpenProc .四、状态栏四、状态栏状态栏显示系统信息和对用户的提示,如:系统日期、软件版本、光标的当前位置、键盘的状态等。一般在窗口的底部。1建立状态栏建立状态栏可插入图像显示的文本样式 8.5 RichTextBox控件控件RichTextBox控件可以输入和编辑文本,还可以实现多种文字格式、段落等的设置,还可以插入图形的功能,可真正构成一个像Word一样的字处理软件。选择“MicrosoftRichTextBoxControls6.0”将控件添加到工具箱。1.文件操作方法(1)LoadFile方法LoadFile方法能够将RTF文件或文本文件装入控件,其形式如下:对象.LoadFile文件标识符,文件类型文件类型:0或rtfRTF为RTF文件(缺省);1或rtfTEXT为文本文件(2)SaveFile方法SaveFile方法将控件中的文档保存为RTF文件或文本文件,其形式:对象.SaveFile(文件标识符,文件类型)2常用格式化属性常用格式化属性格式化属性,可对该控件中选中的任何部分的文本使用不同的格式。3. 应用例应用例8.94. 插入图像插入图像在RichTextBox控件中可插入(*.bmp)的图像文件,形式如下:对象.OLEObjects.Add索引,关键字,文件标识符其中:OLEObjects是集合,包含一组添加到RichTextBox控件的对象;索引和关键字表示添加的元素编号和标识,可省,但逗号不能省。例如:RichTextBox1.OLEObjects.Add,c:windowscircles.bmp 8.6 应用程序向导应用程序向导 是方便的程序生成器,用来生成一个应用程序的界面。 选择“文件/新建工程”命令,在其对话框选中“B应用程序向导”。 1.选择操作界面,有三种:2.2.选取菜单和菜单项选取菜单和菜单项 向导提供了文件、编辑、视图、工具、窗口、帮助六个菜单名,每个菜单名下有若干个菜单项。用户可自由地选取、取消菜单名或菜单项。3.3.选取工具栏按钮选取工具栏按钮 提供的工具栏有13个按钮。用户也可根据需要增加(右移所选按钮)或删除(左移所选按钮)按钮。第九章第九章 文文 件件9.1 文件系统控件9.2 文件的读写9.3 常用的文件操作语句和函数9.1 驱动器、目录和文件列表框驱动器、目录和文件列表框SubdrvDrive_Change()dirDirectory.Path=drvDrive.DriveEndSubSubdirDirectory_Change()filFile.Path=dirDirectory.PathEndSubSubForm_Load()Item=“所有文件(*.*)”cboType.AddItemItem+Space(20-Len(Item)+*.*Item=窗体文件(*.FRM)cboType.AddItemItem+Space(20-Len(Item)+*.FRMItem=位图文件(*.BMP)cboType.AddItemItem+Space(20-Len(Item)+*.BMPcboType.ListIndex=2EndSubSubcboType_Click()filFile.Pattern=Mid(cboType.Text,21)EndSubSubfilFile_Click() EndSubSubfilFile_DblClick() EndSub例9.1示例程序1. 驱动器列表框驱动器列表框Drive属性:属性:对象.Drive=driveChange事件:事件:重新设置Drive属性引发Change事件 2. 目录列表框目录列表框Path属性属性 :对象.Path=pathnameChange事件:事件:重新设置Path属性引发Change事件3. 文件列表框文件列表框Path属性:属性:显示该路径下的文件。重新设置Path属性引发PathChange事件。 Pattern属性:属性:显示的文件类型。对象.Pattern=value 重新设置Pattern属性引发PatternChange事件。例如:例如:filFile.Pattern=*.frm,显示*.frm文件。多个文件类型用分号;分界。例如:*.frm;*.frx FileName属性属性:对象.FileName=pathname 引用时只返回文件名,相当于ilFile.List(filFile.ListIndex),需用Path属性得到其路径;设置时可带路径。Click、DblClick事件:事件:例如,单击输出文件名。SubfilFile_Click()MsgBoxfilFile.FileNameEndSub例如,双击执行可执行程序:SubfilFile_DblClick()ChDir (dirDirectory.Path)改变当前目录RetVal = Shell(filFile.FileName, 1) 执行程序EndSub9.2 文件的读写文件的读写文件:存储在外部介质上数据的集合。按名存取1. 记录记录由若干个相互关联的数据项组成。例如,由学生的学习成绩信息组成的记录:数据项2. 文件及其种类文件及其种类文件是记录的集合。顺序访问模式:顺序文件,记录可长可短;随机访问模式:随机文件,记录的长度相同;二进制访问模式:二进制文件(可认为记录长度为1)。(1)顺序文件按顺序依次把记录写入文件;按顺序依次把记录读出来。文本文件:一行一条记录,记录可长可短,以“换行”字符为分隔符号。(2)随机文件随机文件可以直接访问文件中的任意一个记录。记录长度相同;根据记录号访问;(3)二进制文件直接把二进制码存放在文件中。1. 打开文件打开文件Open文件名For模式As#文件号Len=记录长度(1)模式OUTPUT:写操作;INPUT:读操作;APPEND:追加到文件末尾。(2)文件号1511,可以用FreeFile函数获得下一个可利用的文件号。(3)记录长度小于或等于32767的整数,它指定数据缓冲区的大小。例如,打开C:VBSCORE,供写入数据,指定文件号为#1。OPEN C:VBSCORE FOR OUTPUT AS #1一、顺序访问模式顺序访问模式打开文件读出或写入关闭文件2. 写入命令写入命令Print #文件号,输出列表保存文本框保存文本框假定文本框的名称为Text1,文件名为TEST.DAT。方法1:把整个文本框的内容一次性地写入文件。Open TEST.DAT For Output As #1Print #1, Text1Close #1方法2:把整个文本框的内容一个字符一个字符地写入文件。Open TEST.DAT For Output As #1For i=1 To len(Test1)Print #1,Mid(Text1, i, 1);Next iClose #1Write#文件号,输出列表紧凑格式。数据项之间插入“,”,并加上双引号。例如,命令:Write#1,One,Two,123内容:One,Two,1233. 关闭文件关闭文件Close#文件号,#文件号.例如,Close#1,#2,#34. 读顺序文件读顺序文件INPUT #文件号,变量列表把读出的每个数据项分别存放到所对应的变量。LINE INPUT#文件号,字符串变量读一行到变量中,主要用来读取文本文件。INPUT$(读取字符数,#文件号)随意读取字符5. 函数函数LOF(文件号):返回文件的长度(总字节数)。EOF(文件号):返回读写位置。指针在文件尾时,EOF函数为True,否则为False。读文本文件到文本框读文本文件到文本框假定文本框名称为Text1,文件名为MYFILE.TXT。方法1:一行一行读Text1.TextOpenMYFILE.TXTForInputAs#1DoWhileNotEOF(1)LineInput#1,InputDataText1.TextText1.Text+InputData+vbCrLfLoopClose#1方法2:一次性读Text1.TextOpenMYFILE.TXTForInputAs#1Text1.Text=Input$( LOF(1), 1)Close#1方法3:一个个字符读DimInputDataasString*1Text1.TextOpenMYFILE.TXTForInputAs#1DoWhileNotEOF(1)InputData=Input$(1,#1)Text1.TextText1.Text+InputDataLoopClose#1例例9.2读入文本文件。例例9.3文件加密程序。PrivateSubFile1_DblClick()OpentfilenameForInputAs#1Text1.Text=DoWhileNotEOF(1)indata=Input(1,#1)Text1.Text=Text1.Text+indataLoopEndSubCommonDialog1.Action=2OpenCommonDialog1.FileNameForOutputAs#1Fori=1ToLen(Text1.Text)Print#1,Mid(Text1.Text,i,1);NextiClose#1参阅例6.14二、二、随机文件随机文件1.打开Open文件名For RandomAs#文件号Len=记录长度记录长度2.写操作Put#文件号,记录号,变量名将一个记录变量的内容写到指定的记录位置处。忽略记录号,则表示在当前记录后的位置插入一条记录。3.读操作Get #文件号,记录号,变量名忽略记录号,则读出当前记录后的那一条记录。例例9.4学生信息管理程序。追加记录(Command1):将一个学生的信息作为一条记录添加到随机文件末尾。显示记录(cmdDisplay):显示在右边文本框(text4)中指定的记录。1.打开Open文件名For BinaryAs#文件号2.写操作Put#文件号,位置,变量名写入长度等于变量长度的数据。3.读操作GET#文件号,位置,变量名从指定位置开始读出长度等于变量长度的数据存入变量中,数据读出后移动变量长度位置,如果忽略位置,则表示从文件指针所指的位置开始读出数据,数据读出后移动变量长度位置。三、三、二进制文件二进制文件例例9.5文件复制DimcharAsByteDimFileNum1,FileNum2asIntegerFileNum1=FreeFile打开源文件OpenC:STUDENT.DATForBinaryAs#FileNum1FileNum2=FreeFile打开目标文件OpenC:STUDENT.BAKForBinaryAs#FileNum2DoWhileNotEOF(FileNum1)Get#1,char从源文件读出一个字节Put#2,char将一个字节写入目标文件LoopClose#FileNum1Close#FileNum29.3 常用的文件操作语句和函数常用的文件操作语句和函数1.FileCopy语句语句格式:FileCopysource,destination功能:复制一个文件。说明:FileCopy语句不能复制一个已打开的文件。2. Kill语句语句格式:Killpathname功能:删除文件。说明:pathname中可以使用统配符“*”和“?”。例如:Kill*.TXT3. Name 语句语句格式:NameoldpathnameAsnewpathname功能:重新命名一个文件或目录。说明:(1)Name具有移动文件的功能。(2)不能使用统配符“*”和“?”,不能对一个已打开的文件上使用Name语句。4. ChDrive 语句语句格式:ChDrivedrive功能:改变当前驱动器。说明:如果drive为“”,则当前驱动器将不会改变;如果drive中有多个字符,则ChDrive只会使用首字母。5. MkDir 语句语句格式:MkDirpath功能:创建一个新的目录。6. ChDir 语句语句格式:ChDirpath功能:改变当前目录。例如:ChDirD:TMP7. RmDir 语句语句格式:RmDirpath功能:删除一个存在的目录。说明:只能删除空目录。8. CurDir函数函数格式:CurDir(drive)功能:利用CurDir函数可以确定任何一个驱动器的当前目录。说明:drive为,则CurDir返回当前驱动器的当前目录。例例9.6利用ChDrive和ChDir语句改写例9.1中的File1_DblClick()事件过程。SubFile1_DblClick()ChDriveDrive1.Drive设置缺省驱动器ChDirFile1.Path设置缺省目录RetVal=Shell(File1.FileName,1)EndSub例例9.7为例9.1添加事件过程File1_MouseDown(),使之支持Del键,即按下Del键删除选定的文件。SubFile1_KeyDown(KeyCodeAsInteger,ShiftAsInteger)IfKeyCode=vbKeyDeleteThenChDriveDrive1.DriveChDirFile1.PathKillFile1.FileNameFile1.Refresh文件删除后更新文件列表框EndIfEndSub第十章第十章 图图 形形 操操 作作(3学时)学时)10.1 10.1 图形操作基础图形操作基础10.2 10.2 绘图属性绘图属性10.3 10.3 图形控件图形控件10.4 10.4 图形方法图形方法*10.5 10.5 应用应用10.1 图形操作基础图形操作基础10.1.1 坐标系统坐标系统每个容器都有一个坐标系,构成一个坐标系,需要三个要素:坐标原点、坐标度量单位、坐标轴的长度与方向。坐标度量单位由容器对象的ScaleMode属性决定。缺省时为Twip。每英寸1440个Twip,20个Twip为一磅。原点HeightScaleHeight10.1.2 自行定义坐标系自行定义坐标系方法一:通过ScaleTop,ScaleLeft,ScaleWidth和ScaleHeight属性实现。(ScaleTop,ScaleLeft)例例10.110.1 在Form_Paint事件中定义窗体的坐标系。方法二:采用Scale方法来设置坐标系:对象.Scale(xLeft,yTop)-(xRight,yBotton)例如,Form1.Scale(-200,250)-(300,-150)将建立和例例10.110.1一样的坐标系。可在程序中使用Scale方法改变坐标系统。当Scale方法不带参数时,取消用户定义的坐标系,采用缺省坐标系。改变坐标系后产生的影响:(xLeft,yTop)(xRight,yBotton)例例10.110.1a aLine(0,0)-(1000,1000)在不同坐标系的效果。例例10.110.1b b控件对象在坐标系内与X轴和Y轴的位置保持相对不变。利用图形层的特点,实现悬浮效果。在命令按钮后放置一个表面色彩为黑色的标签,如图所示。同一图形层内控件对象排列顺序称为Z序列。Zorder方法的语法为:对象.Zorderpositionposition=0表示该控件被定位于Z序列的前面;position=1表示该控件被定位于Z序列的后面。例例 Zorder方法的使用。10.1.3 图形层图形层10.2绘 图属性10.2.1 当前坐标当前坐标CurrentX,CurrentY属性给出窗体或图形框或打印机在绘图时的当前坐标。这两个属性在设计阶段不能使用。例例10.2 10.2 利用CurrentX,CurrentY属性在窗体上随机打印100个“”。10.2.2 线宽与线型线宽与线型窗体、图形框或打印机的DrawWidth属性给出这些对象上所画线的宽度或点的大小。DrawWidth属性以像素为单位来度量,最小值为1。 例例10.3 10.3 用DrawWidth属性改变直线宽度。窗体或图形框或打印机的DrawStyle属性给出这些对象上所画线的形状。10.2.3 填充与色彩填充与色彩VisualBasic默认采用对象的前景色(ForeColor属性)绘图,也可以通过以下颜色函数指定色彩。1.RGB(红,绿,蓝)函数 红、绿、蓝三基色使用0255之间的整数。2.QBColor(颜色码)颜色码使用015之间的整数。10.3 图图 形形 控控 件件10.3.1 Picture Box(图形框图形框)主要作用:显示图片、也可作为其他控件的容器。装入图形:图形框对象.Picture=LoadPicture(“图形文件名”)删除图形:图形框对象.Picture=LoadPicture()Autosize属性设置为True时,图形框能自动调整大小与显示的图片匹配。例例10.410.4 颜色的渐变过程。10.3.2 Image(图像框图像框)图像框比图形框占用更少的内存块。图像框内不能保存其他控件。Stretch属性=False,图像框可自动改变大小,以适应其中的图形。Stretch属性=True,图形可自动调整尺寸,以适应图像框的大小。例例10.510.5 图形框Autosize属性与图像框的Stretch属性对加载图形的影响。SavePicture对象名.属性,文件名把绘制或装在窗体、图形框和图像框内的图形保存到Bmp格式文件内。10.3.3 Line(画线工具画线工具)10.3.4 Shape(形状形状)例例10.610.6例例10.710.710.4 图图 形形 方方 法法10.4.1 Line方法方法画直线或矩形: 对象.LineStep(x1,y1)-(x2,y2),颜色,BF其中:对象可以是窗体或图形框。(x1,y1),(x2,y2)为线段的起终点坐标或矩形的左上角右下坐标。关键字B表示画矩形,关键字F表示用画矩形的颜色来填充矩形。例例10.810.8 用Line方法在一个窗体上画坐标轴与坐标刻度。例例10.910.9用Line方法在一个窗体上画随机射线。10.4.2 Circle方法方法Circle方法用于画圆、椭圆、圆弧和扇形。10.4.3 Pset方法方法Pset方法用于画点:对象.PsetStep(x,y),颜色参数(x,y)为所画点的坐标,关键字Step表示采用当前作图位置的相对值。例例10.10 10.10 本例用Pset方法绘制阿基米德螺线10.4.4 Point方法方法Point方法用于返回指定点的RGB颜色,其语法格式如下:对象.Point(x,y)其中参数对象与(x,y)的意义与前述相同。如果(x,y)点位于对象之外,Point方法将返回True。 例例10.11 10.11 用Point方法获取一个区域的信息。利用例10.11的处理方法可使图片产生朦胧的效果。10.5 应应 用用10.5.1 几何图形绘制几何图形绘制利用Line方法和Circle方法及DrawWidth、DrawStyle和DrawMode属性。 例例10.1210.12 用Circle方法在窗体上绘制由圆环构成的艺术图案。算法:等分半径为r的圆周为n份,以等分点为圆心,半径r1绘制n个圆。例例10.1310.13 用Line方法绘制函数f(x)=x2在区间a,b之间积分面积图。 为了能绘制任意区间a,b上函数f(x)积分面积图,可在窗体上放置一个图形框和两个文本框。文本框用于指定积分上下限的值,图形框用于绘图。根据区间a,b的值设置图形框的左上角坐标为(a-1,bb+1),右下角坐标为(b+1,-1)。将区间a,b等分为n份,在每一等分点i上,用Line方法连线到(i,i*i)。10.5.2 简单动画设计简单动画设计动画:有计划地移动一个对象包括改变对象的形状和尺寸。编程时可以采用帧动画原理,即通过一系列静态图辅之以连续快速变化产生动画效果,也可以通过Move方法改变图形对象的Top及Left属性来移动图形。动画的速度使用时钟控制。例例10.1410.14 通过改变图形形状演示一个陀螺在图形框内转动。例例10.1510.15演示地球图标的转动,在转动时同时使地球图标在窗体内移动,并变化地球图标的尺寸。(用PictureClip控件来存放一组图片)10.5.3 图形漫游图形漫游滚动图形通过滚动条的滑块移动,只要设置图形框的Left或Top为滑块当前值的负数,就可形成图形相对移动。例例10.1610.16 本例在窗体内显示一幅地图,移动滚动条漫游地图。10.5.4 图形处理技术图形处理技术1.操作象素通过PaintPicture方法访问内置在操作系统中的BitBlt服务程序。dpic.PaintPicturespic,dx,dy,dw,dh,sx,sy,sw,sh,rop其中:参数dpic为目标图形对象,spic为传送源,dx,dy是传送目标矩形区域左上角坐标(目标控件内任一位置)。dw,dh是目标形矩形区域的宽和高。sx,sy是要传送图形矩形区域左上角坐标。sw,sh是要传送图形矩形区域的大小。rop指定传送的象素与目标中现有的象素组合模式(如表所示)。传送源spic目标dpicPaintPicture方法(sx,sy)swdpic.PaintPicturespic,dx,dy,dw,dh,sx,sy,sw,sh,ropdw,dhsw,sh至少8个Twip(dx,dy)dwdhsh复制图形:设置目标区域左上角坐标和大小与源矩形区域相同。翻转图形:只需改变坐标系,设置图形宽为负数,则水平翻转图形;图形高度为负数,则上下翻转图形;如果宽度和高度都为负数,则两个方向翻转图形。放大图形:改变目标图形的宽度和高度。旋转图形:要需要对原始图片按行和列的顺序或按列和行的顺序扫描象素点,然后在目标图形区颠倒行和列的顺序复制象素点。例例10.1710.17 PaintPicture方法翻转放大位图。例例10.1710.17a a 本例使用PaintPicture方法实现百叶窗效果。2. 使用使用DrawMode属性绘制图形属性绘制图形DrawMode属性可以将新象素与原有象素用不同的方法组合。两次Xor运算恢复原有象素。例例10.1810.18 用鼠标选定图形中的区域复制到指定的图片框。例例10.1810.18a a 在Xor运算符下图形叠加的效果。10.5.5 改变窗体对象外观改变窗体对象外观通过调用Windows的API函数可改变窗体的外观形状。VB应用程序要访问API函数,必须在VB应用程序中用Declare语句将API函数声明为外部过程。Declare语句将API函数声明为外部过程VisualBasic应用程序访问返回执行VB程序组中的API文本浏览器,启动API函数查看工具。单击“文件|加载文本文件”命令,装入Win32api.Txt文件。通过“工程/添加模块”在当前工程内加入一个BAS模块文件。添加指定的API函数到选定项框中,并将函数声明复制到剪贴板。将剪贴板中的内容粘贴到BAS模块文件中。将API函数声明为外部过程,操作流程如下:API文本浏览器应用程序文件/加载文本文件1。选择信息类型2。选定3。4。送剪贴板选定API函数复制到剪贴板例例10.19 建立一个椭圆形状的窗体。API函数CreateEllipticRgn建立椭圆外形区域,SetWindowRgn显示该区域。SetWindowRgn函数参数说明:hWnd窗口句柄,hRgn为窗口形状,bRedraw图形重绘控制,为一逻辑值。句柄(Handle)可看作一个对象的指针,通过它可访问该对象。可通过API函数或对象的属性返回句柄。使用API的区域设置函数不仅可以改变窗体外观,也可以改变控件外观。CreateEllipticRgn函数参数说明:坐标参数采用象数值。实际显示的窗体区域由窗体的Height、Width属性确定。需要使用ScaleX和ScaleY方法对窗体的度量单位进行转换。(x1,y1)(x2,y2)10.5.6 在程序中加入后台音乐在程序中加入后台音乐API函数sndPlaySound可以直接播放音频文件或系统声音。sndPlaySound函数有两个参数,lpszSoundName指定播放的音频文件或系统声音,uFlags设定播放状态。例例10.20 本例示范用sndPlaySound函数播放音频文件。调用形式:k=sndPlaySound(音频文件名,播放方式)播放文件为空,就可停止音乐播放注:本例要求有多媒体设备注:本例要求有多媒体设备第十一章第十一章 Visual Basic与数据库与数据库(1学时)学时)11.1 11.1 数据库概念数据库概念11.2 11.2 数据库管理器数据库管理器11.3 11.3 数据控件数据控件* *1111.4 .4 ADOADO数据控件数据控件* *11.5 11.5 结构化查询语言结构化查询语言( (SQL)SQL)* *11.6 11.6 报表制作报表制作11.7 11.7 错误处理错误处理11.1 数据库概念数据库概念数据库表数据库就是一组排列成易于处理和读取的相关信息的集合。关系模型已经成为数据库设计事实上的标准。关系型数据库模型一个数据库可以由多个表组成,表与表之间可以用不同的方式相互关联。若第一个表中的一条记录内容与第二个表中多条记录的数据相符,但第二个表中的一条记录只能与第一个表的一条记录的数据相符,这样的表间关系类型叫做一对多关系。若第一个表的一条记录的数据内容可与第二个表的多条记录的数据相符,反之亦然,这样的表间关系类型叫做多对多关系。一对多关系可以将一个或几个表中的数据构成记录集Recordset对象,记录集也由行和列构成,它与表类似。学号课程成绩990001数学85学号姓名性别专业出生日期990001万林男物理82-1-11990002庄前 女 物理82-9-21。(表一)数据库记录集学号姓名专业课程成绩990001万林物理数学85990002庄前 物理外语90。在VB中数据库内的表格不允许直接访问,而只能通过记录集对象进行记录的操作和浏览,因此,记录集是一种浏览数据库的工具。数据库记录集11.2 数据库管理器数据库管理器VB的数据库管理器(Visdata.exe)可用于管理数据库。在VB开发环境内单击外接程序菜单中的可视化数据管理器命令可打开可视数据管理器。数据库管理器使用小结:1建立新表:鼠标右键单击数据库窗口,弹出菜单,选择对应命令。2打开、删除表,修改表结构和建立表间的关联等操作:右键单击数据库窗口内的表名,弹出菜单,选择对应命令。3编辑记录:双击表名,打开表格输入窗,编辑、增删记录。建立Student.mdb数据库,所含学生基本情况表结构如下:11.3 数数 据据 控控 件件工具箱内数据控件图标形状画在窗体上的外观11 .3.1 数据控件数据控件注:注: RecordSource属性可以是数据库中的单个表名,也可以是使用属性可以是数据库中的单个表名,也可以是使用SQL查询语言的一个查询字符串。如果连接的是单表数据库,则查询语言的一个查询字符串。如果连接的是单表数据库,则DatabaseName属性应设置为数据库文件所在的子目录名,而具体文件属性应设置为数据库文件所在的子目录名,而具体文件名放在名放在RecordSource属性中。属性中。能够利用三种记录集对象访问数据库中的数据,连接方法:数据库记录集绑定控件姓名庄前性别女数据控件只能连接数据库产生记录集,不能显示记录集中的数据,要显示记录集中的数据必须通过能与它绑定的控件来实现。常用绑定控件绑定控件具有DataSource和DataField两个重要属性,其作用如下:Data控件、记录集与绑定控件记录集学号姓名专业课程成绩990001万林物理数学85990002庄前 物理外语90。数据库例例11.211.2 用一个数据网格控件MsFlexGrid显示Student.mdb数据库中基本情况表的内容。例例11.111.1 设计一个窗体显示在11.2节中建立的的Student.mdb数据库中基本情况表的内容。属性:Rows、Cols(网格的行或列数);FixedRows、FixedCols(不可卷动的行或列数)。11.3.2 数据控件的事件数据控件的事件11.3.3 数据控件的常用方法数据控件的常用方法Refresh11.3.4 记录集的属性与方法记录集的属性与方法1. 属性属性EofBofBookMarkRecordCount2. 记录集的方法记录集的方法MoveLastMoveFirstMoveNextMovePreviousFindFirst、 FindLast、 FindNext、 FindPrevious方 法 可 在 指 定 的Dynaset或Snapshot类型的记录集对象中查找。Seek方法在Table表中查找。Nomarch属性可判定是否找到。Data1.Recordset.FindFirst姓名=黎明Nomarch=False例11.3 在窗体上用Move方法代替数据控件对象的4个箭头的操作。例11.4 使用Find方法查找记录。11.3.5 记录的增删改操作记录的增删改操作Data1.Recordset.AddNew增加记录数据库UpData填入新数据编辑记录删除记录调用Edit方法。调用Delete方法。给各字段赋值。移动记录指针。调用Update方法。例11.5 对数据库提供增、删、改和查找功能。11.4 ADO数据控件数据控件ADO是Microsoft处理数据库信息的最新技术,它是一种ActiveX对象,采用了被称为OLEDB的数据访问模式。它是数据访问对象DAO、远程数据对象RDO和开放数据库互连ODBC三种方式的扩展。ADO对象模型更为简化,不论是存取本地的还是远程的数据,都提供了统一的接口。11.4.2 使用使用ADO数据控件数据控件11.4.1 ADO对象模型对象模型在使用ADO数据控件前,必须先通过“工程/部件”菜单命令选择“MicrosoftADODataControl6.0(OLEDB)”选项,将ADO数据控件添加到工具箱。ADO数据控件与VisualBasic的内部数据控件很相似,它允许使用ADO数据控件的基本属性快速地创建与数据库的连接。工具箱内ADO控件图标形状画在窗体上的外观能够利用三种记录集对象访问数据库中的数据,连接方法:连接操作-鼠标右击ADO控件,选择快捷菜单“ADODC属性”命令,打开ADO控件属性页窗:单击选定选定数据库选定设置完成后,ADO控件的ConnectionString属性为:Provider=Microsoft.Jet.OLEDB.3.51;PersistSecurityInfo=False;DataSource=Student.mdbRecordSource属性为:基本情况(表)ADO控件的的其他操作与Data控件相同。11.4.3 ADO控件上绑定控件的使用控件上绑定控件的使用MSFlexGridMSHFlexGridDataGridMSChartDataComboDataList例例11.6 使用ADO控件和DataGrid网格控件浏览数据库。 11.4.4 使用数据窗体向导使用数据窗体向导通过数据窗体向导能建立一个访问数据的窗口。在使用前必须执行“外接程序/外接程序管理器”命令,将“VB6数据窗体向导”装入到“外接程序”菜单中。步骤1:执行“外接程序”菜单中的“数据窗体向导”命令。步骤2:选择数据库类型。数据库步骤3:选择具体的数据库文件。步骤4:设置应用窗体的工作特性。步骤5:选择记录源(所需要的实际数据)。步骤6:选择所需要的操作按钮。例例11.711.5 结构化查询语言结构化查询语言(SQL)11.5.1 结构化查询语言结构化查询语言结构化查询语言SQL是操作数据库的工业标准语言。在SQL语言中,指定要做什么而不是怎么做。不需要告诉SQL如何访问数据库,只要告诉SQL需要数据库做什么。利用SQL,可以确切指定想要检索的记录以及按什么顺序检索。可以在设计或运行时对数据控件使用SQL语句。用户提出一个查询,数据库返回所有与该查询匹配的记录。11.5.2 使用使用SELECT语句查询语句查询1.使用SELECT语句从数据库中的获取数据称为查询数据库,查询数据库通过使用SELECT语句。常见的SELECT语句形式为:Select字段表From表名Where查询条件GroupBy分组字段OrderBy字段Asc|Desc可以在设计或代码中对数据控件的RecordSource属性设置SQL语句,也可将SQL语句赋予对象变量。在建立SQL语句时,如果需要通过变量构造条件,则需要在应用程序中将变量连接到SELECT语句。例如:Select*From基本情况Where专业=&Text1&例11.8将例11.4中的查找功能改用SQL语句处理。例11.9用SQL语句从两个数据表中选择数据构成记录集。例11.10用SQL指令按专业统计Student.mdb数据库各专业的人数。例11.11 在ADO数据控件上使用SQL语句。将例11.9中的Data控件改用ADO数据控件,用SQL语句从Student.mdb数据库的两个数据表中选择数据构成记录集。例11.12 设计一个窗体,计算Student.mdb数据库内学生成绩表中每个学生的平均成绩,产生姓名、平均成绩和最低成绩三项数据,按平均成绩升序排列数据,并用该数据作图。*2.使用UPDATE语句修改记录UPDATE创建一个更新查询来按照某个条件修改特定表中的字段值。其语法如下:UPDATE表集合SET表达式WHERE条件例11.12a 本例把学生平均成绩字段的值增加了10%,并刷新网格。*3.使用DELETE语句查询可以创建删除查询来删除FROM子句中列出的、满足WHERE子句的一个或多个表中的记录,其语法所示如下:DELETE表字段FROM表集合WHERE条件例11.12b 删除例11.12a所产生temp表中平均成绩80的全部记录,并刷新网格。*11.5.3 使用对象变量访问数据库使用对象变量访问数据库DAO对象定义了一个可编程的对象集合。可按下列方法定义数据库对象和记录集对象,不必在窗体上放置数据控件。要想在程序中使用DAO对象,必须先为当前工程引用DAO对象的数据库引擎库。引用方式:执行工程菜单的引用命令,启动引用对话框,在清单中选取“MicrosoftDAO3.51ObjectLibrary”项目。例11.12e 使用DAO模型访问数据库,约束绑定控件。记录集的字段对象可以使用如下几种方法获取:Recordset.Fields(字段名称)、Recordset(字段名称)Recordset.Fields(数字)、Recordset(数字)在DAO中记录集对象为对象变量,故字段可用rs(j)表示。使用DAO模型访问数据库的例题。例11.12d 使用DAO模型访问数据库,分页显示基本情况表的记录。本程序通过Bookmark属性设置当前记录的书签,用于当前页上记录的定位。*11.5.4 ADO对象对象使用ADO对象访问数据库比DAO对象模型更为简化,不论是存取本地的还是远程的数据,都提供了统一的接口。11.6 报报 表表 制制 作作 数据报表设计器属于ActiveXDesigner组中的一个成员,在使用前需要执行“工程|添加DataReport”命令,将报表设计器加入到当前工程中,产生一个DataReport1对象,并在工具箱内产生一个“数据报表”标签。标签文本图形线条形状函数“标签”控件在报表上放置静态文本“文本”控件在报表上连接并显示字段的数据“图形”控件可在报表上添加图片“线条”控件在报表上绘制直线“形状”控件在报表上绘制各种各样的图形外形“函数”控件在报表上建立公式。报表标头区包含整个报表最开头的信息,一个报表只有一个报表头,可使用“标签”控件建立报表名报表注脚区包含整个报表尾部的信息,一个报表也只有一个注脚区页标头区设置报表每一页顶部的标题信息;页注脚区包含每一页底部的信息;细节区包含报表的具体数据,细节区的高度将决定报表的行高。例11.13建立新工程,在窗体上放置两个命令按钮。在当前工程内加入一个DataEnvironent1对象。完成与指定数据库的连接。在Connection1下创建Command1对象。在当前工程中加入报表设计器DataReport1,设置报表设计器的DataSource属性为数据环境对象,DataMember属性为Command1对象。 将数据环境设计器中Command1对象内的字段拖动到数据报表设计器的细节区。使用“标签”控件,在报表标头区插入报表名,页标头区设置报表每一页顶部的标题信息等。使用“线条”控件在报表内加入直线,使用“图形”控件和“形状”控件加入图案或图形。 在命令按钮Click事件内加入代码DataReport1.Show显示报表,DataReport1.PrintReport打印报表。 11.7 错错 误误 处处 理理错误处理步骤:1.用OnError语句设置错误陷阱,捕捉错误。2.编写错误处理程序,根据可预知的错误类型决定采取何种措施。捕捉错误示意:OnErrorErr对象Number错误号其他可根据Err.Number的值来编写出错处理程序。OnError语句有如下几种形式:(1)OnErrorResumeNext忽略错误行,继续执行下一语句。(2)OnErrorGoTo标号使程序转跳到语句标号所指示的程序块(3)OnErrorGoTo0不使用错误处理程序块。处理方法:Resume 重新执行引起错误的语句或指令。ResumeNext 忽略错误行,继续执行下一语句。Resume标号 忽略错误行,转跳到由指明的语句继续执行。若为0,则表示终止程序执行。例例11.14错误处理的基本方法SubOnErrorStatementDemo()DimResponse,Msg,Style,TitleAsStringDimdbAsDatabase,rsAsRecordsetOnErrorGoToErrorHandlerSetdb=OpenDatabase(A:Student.mdb)打开数据库Setrs=db.OpenRecordset(基本情况)设置记录集 ExitSub正常退出本程序ErrorHandler:错误处理块入口Style=vbRetryCancel+vbCritical+vbDefaultButton2SelectCaseErr.NumberCase53出错号53为文件不存在Msg=文件不存在!Response=MsgBox(Msg,Style,出错提示)IfResponse=vbCancelThenExitSubCase7171号驱动器未准备好Msg=A盘未准备好Response=MsgBox(Msg,Style,出错提示)IfResponse=vbCancelThenExitSubCaseElse当发生其他不可预知的错误,退出本程序ExitSubEndSelectResume再次执行原出错语句EndSub例例11.15 下列程序用于处理删除一个已打开的文件所产生的错误。SubResumeStatementDemo()OnErrorGoToErrorHandler设置错误陷阱OpentestfileForOutputAs#1Killtestfile企图删除一个打开的文件ExitSubErrorHandler:SelectCaseErr.NumberCase55文件已打开错误Close#1处理方法:关闭文件CaseElse EndSelectResumeEndSub例例11.16 采用忽略错误的方法处理错误。SubOnErrorStatementDemo()OnErrorGoToErrorHandler设置错误陷阱OpentestfileForOutputAs#1Killtestfile企图删除一个打开的文件OnErrorGoto0关闭错误陷阱OnErrorResumeNext忽略Killtestfile出错行指令Err.Clear清除出错号ExitSubErrorHandler:SelectCaseErr.NumberCase55Close#1CaseElseEndSelectResumeEndSub例例11.1711.17 处理被零除、溢出和非法的过程调用三种情况产生的错误。FunctionDivide(numer,denom)asVariantConstmnErrDivByZero=11用于代表被零除ConstmnErrOverFlow=6溢出ConstmnErrBadCall=5非法的过程调用OnErrorGoToMathHandlerDimMsgasStringDivide=numer/denom计算ExitFunctionMathHandler:IfErr.Number=MnErrDivByZeroOrErr.Number=ErrOverFlow_OrErr=ErrBadCallThenDivide=Null产生错误则返回NULLElse显示意想不到的错误信息。Msg=Unanticipatederror&Err.NumberMsg=Msg&:&Err.DescriptionMsgBoxMsg,vbExclamationEndIfResumeNext不管什么情况,ResumeNextEndFunction
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号