前言

《软件开发工具》

教学实验模拟系统

陈学东

常 丹

北京交通大学

经济管理学院


实验说明

本教学实验指导书是根据经济管理类《软件开发工具——Visual Basic》本科教学大纲设计，作为信息管理专业及其他管理类、经济类专业学生学习及实践Visual Basic的配套指导教材。

该教学实践指导书以经济管理类《软件开发工具——Visual Basic》教学大纲为蓝本，通过一个简化的“学生信息管理系统”的程序开发实例，将教学大纲涉及内容贯穿起来，为学生提供一个较为全面的管理类应用系统实践环境和学习、演练、规范的空间。以一具体的小型应用系统作为实验的内容，目的在于：

（1） 便于学生全面理解软件开发工具的内容体系，并系统地掌握程序设计思路与方法，而不是独立地学习某几个方面的编程技术；

（2） 力图使学生在完成实验后，可以熟练地掌握VB程序设计理念和规范、方法和技巧，掌握各知识点在实际系统开发中的应用，并能独立创建应用系统。

（3） 弥补本科学生缺乏实际系统开发经验，面对实际应用问题不知如何入手、如何组织的弊端，以循序渐进的过程、分阶段、分步骤逐步完成整个系统，独立分析问题、综合问题、解决问题的能力。

（4） 使学生在认真、独立地完成本书的实践任务后，可以胜任经济类、管理类应用系统的程序设计工作。

为了充分考虑学生自主学习的特点，在实验任务中对部分核心知识、关键算法等做必要的提示，并以简练直观的形式将实验过程和结果展示出来，便于学生查阅及掌握相关知识在系统实践中的应用以及自我检测实验效果。


实验内容及要求

实验内容

实验内容主要以“学生基本信息管理”的分步实施贯穿于整个实践环节，对于该系统中未练习到的编程方法和技巧，专门设置了扩展实验作为补充练习。

创建“学生信息管理系统”，包括如下子系统或功能模块：

代码维护子系统：

1） “学院专业”用于学院专业代码的维护；

2） “课程代码”用于课程代码的维护；

3） “民族代码”用于民族代码的维护；

4） “操 作 员”用于用户帐号、用户口令和用户权限的设置与维护；

5） “个人事务”用于管理个人备忘录；

6） “退出系统”用于关闭所有打开文件，包括数据库文件，退出“学生信息管理系统”；

学生信息管理子系统：

1） “信息输入”用于学生基本信息的维护；

2） “信息查询”用于按用户组合条件或模糊查询条件筛选学生基本信息记录；

选课及在线考试子系统：

1） “学生选课”用于学生选课；

2） “在线考试”用于学生参加计算机答题方式的考试；

学生成绩管理子系统：

1） “成绩录入”用于录入学生平时成绩及考试成绩；

2） “成绩统计”用于对学生成绩进行统计分析；

其他辅助功能：

1） “层叠”将MDI窗体中的各子窗体以层叠方式排列；

2） “水平平铺”将MDI窗体中的各子窗体以水平平铺方式排列；

3） “垂直平铺”将MDI窗体中的各子窗体以垂直平铺方式排列；

4） “关于…”用于显示系统版本版权信息及系统的简单说明。


实验要求

1） 建库：创建Access数据库（作为选做内容，也可创建为其他类型的大型数据库，如SQL Server、Oracle等数据库），并为之建立学院专业表、民族代码表、课程代码表、管理员表、学生基本信息表、学生成绩表等数据表；

2） 进入系统的身份验证：进入系统前，首先通过“系统登录”窗体检查用户身份的合法性，如果用户身份合法，则允许用户进入系统，并根据用户权限提供允许该用户操作的功能；如果用户身份不合法，则不允许用户进入系统；

3） 系统主窗体中显示允许登录用户操作的功能菜单，通过该菜单来驱动相应的功能模块。要利用该系统主窗体将所有子系统、功能模块集成于一个整体系统；

4） 基本代码维护界面，能够分别完成对“学院专业表”、“民族代码表”、“课程代码表”等基本代码表的维护；

5） “操作员管理”界面，能够完成对操作员帐号的增减改，密码、操作权限的设置，并在密码写入数据表前进行加密处理；

6） “学生基本信息维护”用户界面（含窗体、控件属性的设置），用于接收及显示用户输入数据；

7） 为“学生基本信息维护”模块编写程序代码完成如下功能：

l 窗体、复选框、选项按钮、下拉列表框等的初始化设置，要求通过程序代码为“民族”、“所在学院”下拉列表作初始化赋值，“专业”下拉列表根据“所在学院”值的不同，从表中有选择地读取记录进行初始化设置；

l 控制无效字符的输入：“身份证号”项只能输入15或18位数值型数据，且禁止用户输入非数值型数值；

l 对用户输入数据有效性的检验：数值型、日期型数据；

l 输入域的动态控制：“是共产党员”选中时，“入党时间”设为可编辑状态，否则，设置为不可编辑状态；

l 用户输入数据完整性的检查：“姓名”、“身份证号”为空时不能保存；

l 退出窗体前的安全保护：退出窗体时，根据信息是否保存提示用户；

l 对经计算得出的间接数据，如“成绩录入”模块中的“总评成绩”，要在计算该数据的基本数据输入完成后自动计算并显示结果，而不允许用户输入或修改。

8） 为“学生基本信息维护”模块加入菜单、工具栏，至少包括如下几项：

主菜单 | 文件 | 记录 | 帮助
子菜单 | 打开 关闭 ——— 退出 | 增加 删除 保存 ——— 筛选 | 帮助 ——— 关于…

其中：“打开”“关闭”命令用于打开/关闭一个图片文件，同时在界面指定的PictureBox中显示/清除该图片；“关于…”命令用于打开一个关于版本版权信息的窗口。

9） 建立一个数据环境：用于对数据库的操作，在“学生基本信息维护”模块中增加对数据库操作的功能，并将这些功能与菜单、工具栏相应项链接：

l 增加：加入一条空白记录，接收用户输入数据；

l 保存：将用户输入数据或对数据库记录的修改保存；

l 删除：从数据库中删除指定（当前）记录；

l 筛选：筛选满足条件的记录。

10） “学生基本信息查询”模块中，允许用户自己设计组合查询条件或按模糊查询条件筛选学生基本信息记录（组合查询条件及模糊查询条件的具体要求参见实验5中相应部分）；

11） “在线考试”模块，能够自动在开始考试后调入试卷、答题纸，并开始计时；在考试时间到或用户提交答卷时，自动锁定答题纸、清空试卷，并结束计时；

12） “成绩统计”模块中，使用“图形”控件对统计结果绘制成直方图。

根据软件开发工具在管理、经济领域的应用和信息管理专业、经济类、管理类专业教学大纲的要求，按教学进度和内容要求，共设计八类实验：Visual Basic开发环境及简单应用程序、窗体和基本控件应用、程序设计基础、程序控制结构、数据库访问技术、界面的扩展设计、VB深入编程和面向对象编程。每类实验分有若干小作业（功能），分步完成上述实验，对上述系统各功能模块的具体设计要求，可参考各实验中的设计要求。


选做实验

1） 创建“学生选课表”、“学生答卷表”等数据表；

2） “学生选课”模块中，在学生上次选课记录基础上进行新的调整；

3） 学生“在线考试”结果写入“学生答卷表”，并自动进行阅卷、打分。


实验报告

在每一类实验完成后，要提交相应的实验报告，包括下面几方面内容：

一、准备工作

1） 上机实验前做了哪些准备工作；

2） 上机实验的操作步骤及内容；

3） 界面草图；

4） 复杂功能的程序流程图；

5） 程序代码；

6） 测试用数据；

7） 要解决的问题。

二、实验步骤及内容

1） 分类写出上机完成任务的主要内容及步骤、实现的功能；

2） 出现的问题及解决方法；

3） 调试完成后的对象主要属性设置？；

4） 程序源代码。

三、实验用数据及实验结果

1） 实验用数据及调整；

2） 使用不同数据的程序运行结果；

3） 主要的程序运行界面及执行结果界面。

四、实验收获及掌握的技能

1） 实验中所用知识点的总结；

2） 程序代码中的核心算法；

3） 编程技巧的总结；

4） 利用哪些知识、技巧解决了实际应用系统中的哪些功能需求，还可将其用于哪些方面。

五、需要进一步解决的问题

1） 上机实验后有哪些想解决、但尚未解决的问题；

2） 希望从哪些方面做进一步的了解；

3） 对教学过程中有哪些进一步的要求、意见和建议。

5） 分类写出上机完成任务的主要内容及步骤、实现的功能；

6） 出现的问题及解决方法；

7） 调试完成后的对象主要属性设置？；

8） 程序源代码。


附1

附1： 磁盘文件

1） 可运行的源代码磁盘文件；

2） 测试用数据文件；

3） 磁盘文件及磁盘上要标明制作人的姓名、学号。

附2：

试验报告表格

班级： | 姓名： | 学号： | 分数：
实验题目： |
1、实验目的： |
2、实验准备工作： |
3、实验步骤： |
4、实验数据及结果： |
5、实验收获及需解决问题： |


实验目的

本实验主要是熟悉Visual Basic程序设计开发工具的可视化集成开发环境（IDE）及Visual Basic应用程序的创建和运行，通过实验学生应该：

1． 了解Visual Basic系统对计算机软、硬件资源的要求；

2． 掌握Visual Basic系统和帮助文件MSDN的安装与选项的设置；

3． 熟悉Visual Basic可视化集成开发环境各元素的使用；

4． 熟练掌握Visual Basic应用程序创建、编辑、保存和运行、调试的全过程；

5． 通过简单Visual Basic应用程序的创建准确掌握可视化编程和事件驱动编程的基本概念（对象、属性、方法和事件）和程序设计思想；

6． 熟练掌握可视化编程和事件驱动编程程序设计步骤和方法。


实验内容及要求

本实验将通过几个实验案例的练习，引导初次接触Visual Basic程序设计开发工具的学生逐步了解、熟悉Visual Basic的可视化集成开发环境，通过一些具有简单功能的窗体的创建，练习Visual Basic可视化集成开发环境中的各元素的使用，加深理解对象、属性、方法、事件和事件驱动等基本概念。并通过一些具体的Visual Basic小程序熟悉可视化编程和事件驱动编程程序设计步骤和方法，能够较为熟练地掌握Visual Basic应用程序的创建、编辑、构成、保存和运行、调试。

实验过程中重点完成以下工作：

1． Visual Basic系统的安装和选项设置，帮助文件MSDN的安装及使用；

2． Visual Basic可视化集成开发环境中菜单栏、工具栏、工具箱(Tool Box)、工程管理器窗口（Project Explorer）、属性窗口(Properties)、窗体设计器窗口（Form）、代码编辑器窗口（Code）、窗体布局窗口（Form Layout）和帮助系统等的使用；

3． 简单的Visual Basic应用程序的创建；

4． Visual Basic应用程序创建、编辑、保存；

5． Visual Basic应用程序的运行和调试；

6． Visual Basic可执行文件（.exe）的编译和运行；

7． 总结可视化编程和事件驱动编程程序设计步骤和方法。


实验1

实验1.1

选择“自定义安装”，将VB6.0系统安装于D：驱动器下的Visual Studio目录下，注意安装过程中VB6.0各内容选项的选择。并将联机帮助文件MSDN（Microsoft Developer Network Library）安装于相同目录下。

相关知识及提示

MSDN与Visual Basic 6.0不在同一张光盘。在安装完VB6.0后，安装程序会提示用户是否安装MSDN，选择“安装MSDN”并插入MSDN CD。

实验结果

实验成功的标志为Visual Basic可以正常启动及创建下述应用程序，并能在单击“帮助”菜单项时打开Visual Studio的帮助系统。


实验1

实验1.2

创建一“标准EXE”类型的VB应用程序，利用Visual Basic可视化集成开发环境各元素，创建“学生基本信息管理系统”的登录界面，运行结果如图1-1所示。要求界面中各对象属性按表1-1设置。

图1-1 系统登录界面

表1-1 实验1.2界面设置要求

默认对象名 | 属性设置
Form1 | 名称：frmLogin；标题：系统登录；背景图片：指定图片文件
Label1 | 显示内容：学生基本信息管理系统（V1.0）；字体、字号：隶书，小二；颜色：&H000040C0&；对齐方式：居中
Image1 | 显示图片：指定图片文件
Label2、Label3 | 显示内容：分别为帐号、密码；字体、字号：宋体，五号；颜色：&H00000080&
Text1 | 名称：txtUserID；显示内容：无
Text2 | 名称：txtPWD；显示内容：无
Command1、Command2 | 名称：分别为cmdOK、cmdCancel；显示文字：确认（O）、取消（C）

【相关知识及提示】 本实验是为了熟悉VB可视化集成开发环境中菜单栏、工具栏、工具箱、工程管理器窗口、属性窗口、窗体设计器窗口的使用，及对象属性的设置。重要知识点提示：

1） 首先在“工程资源管理器”窗口中选择“Form1”，并将其在“窗体”窗口中打开，利用“工具箱”中的标签（Label）、文本框（TextBox）、图像（Image）和命令按钮（CommandButton）控件在Form1中进行初步的位置、大小设置；

2） 然后在“属性”窗口中，对各对象属性值进行调整，使之满足上述要求。其中：

Name属性用于设置对象名称；

Caption属性用于设置窗体标题、标签显示内容、按钮上显示文字；

Picture属性用于设置窗体背景图片、图像显示图片；

Font属性用于设置对象显示的字体及字号；

ForeColor属性用于设置字体颜色；

Text属性用于设置文本框的显示内容；

3） Label1中的文字要以两行显示，通过调整Label1的宽度完成；

4） 按钮上快捷键的设置（即加下划线的字母），是在要定义为快捷键的字母前加“&”号实现。

【实验结果】

实验成功的标志为各属性设置符合表1-1的要求，且窗体界面同图1-1。


实验1

实验1.3

练习VB应用系统的运行，新窗体、模块等的添加，以及应用系统的保存和编译成可执行程序文件：

1） 运行该程序，观察程序运行效果，并在“帐号”、“密码”两文本框中分别输入登录帐号“ChangD”和密码“ChangD”，如图1-1所示；

2） 调整窗体设置，使其运行时自动在屏幕中部显示；

3） 在该工程中添加一窗体，名称设为frmAbout；

4） 在该工程中添加一模块，名称设为Common，并在该模块中添加如下代码：

Private Sub Main()

End Sub

5） 将所创建应用程序保存在自己的个人文件夹下，其中：工程文件以StManage.vbp、登录界面以frmLogin.frm、新添窗体以frmAbout.frm、模块以Common.bas文件名保存；

6） 将该程序编译为可执行程序文件，并在Windows资源管理器中执行该可执行文件，观察程序运行效果；

7） 将启动窗体分别设置为frmAbout、frmLogin和Sub Main，并将其分别运行，观察程序运行效果；

8） 将上述应用程序拷贝到软盘中。

【相关知识及提示】 本实验是为了进一步熟悉VB可视化集成开发环境中菜单栏、工具栏、工程管理器窗口、属性窗口、代码编辑器窗口、窗体布局窗口的使用，熟悉VB应用系统中不同类型文件的创建、编辑、保存和运行。重要知识点提示：

1） 若要调整窗口在屏幕上的显示位置，可以直接在“窗体布局”窗口中将其拖至合适的位置（如居中），也可通过设置窗体的Left和Top属性实现；

2） 应用系统保存时，各窗体、模块、工程等文件类型分别保存，如果窗体中使用了图片，在建立.frm窗体文件的同时，系统会自动建立一个.frx文件，用于记录窗体中的非文本信息。这些文件通过工程文件（.vbp）将其集成为一个系统，而不是以一个大文件形式保存。如图1-2所示，为实验1.3中应用程序保存后的磁盘文件内容。因此，若要将应用程序拷贝到其他机器或目录，不能简单地利用“工程另存为…”菜单项，也不能只将StManage.vbp拷贝到新路径下；

图1-2 VB应用程序的保存形式

3） 编译成可执行程序文件，通过“文件”菜单下“生成StManage.exe”命令项实现；

4） 启动窗体的设置在“工程属性”窗口中，通过“启动对象”设置。

【实验结果】

实验成功的标志为窗体界面同图1-1，且能正常输入数据。数据拷贝到软盘中后仍然能够正常运行。


实验1

实验1.4

在frmLogin的代码编辑窗口中分别加入如下代码，体验可视化程序设计中事件驱动的执行机制：

1） 测试CommandButton的Click事件驱动效果：添加如下代码，执行程序，用鼠标左键分别单击“确认”、“取消”钮和卡通图像，观察执行结果；

Private Sub cmdOK_Click()

Print "You clicked 'OK' button."

End Sub

Private Sub cmdCancel_Click()

Print "You clicked 'Cancel' button."

End Sub

2） 继续添加如下代码，重复上一步的运行，观察运行效果；

Private Sub ImgCartoon_Click()

Print "You clicked 'Cartoon' image."

End Sub

3） 运行该程序，然后单击窗口右上角的关闭钮（ [image] ）或单击VB“运行”菜单下的“结束”选项，终止程序的运行，观察程序执行情况。然后在添加下列代码，重复上述步骤，对比程序执行情况有何变化；

Private Sub Form_Unload(Cancel As Integer)

MsgBox "确认要关闭窗体？", vbYesNo, "警告"

End Sub

4） 继续添加如下代码，运行程序并将鼠标在卡通图片上移动，观察鼠标指针的变化；

Private Sub ImgCartoon_MouseMove(Button As Integer, _

Shift As Integer, X As Single, Y As Single)

ImgCartoon.MousePointer = vbHourglass

End Sub

5） 将步骤3）中代码分别作如下修改，然后重复执行步骤3），观察程序运行结果的变化：

l 将Form_Unload改为FormUnload；

l 将Form_Unload改为Form1_Unload；

l 将Form_Unload改为Form_Unload1；

l 将Form_Unload改为form_unload。

【相关知识及提示】 本实验是为了熟悉可视化程序设计中事件驱动的机制。重要知识点提示：

1） 可被自动触发的事件驱动子程序，子程序名必须是“对象名_事件名”，其中窗体对象使用form作为对象名，而不是窗体的名称；

2） 事件代码的输入，可直接双击要驱动的对象，或在代码编辑窗口的左上方的列表中选择该对象，然后在右上方的列表中选择驱动事件名，系统将自动将子程序的框架（包括参数）生成；

3） 步骤4）中的下划线“_”，是用于将一条VB语句分割成两行显示的分隔符。

【实验结果】

1） 图1-3（a）为步骤1）、2）顺序连续执行的效果；

2） 图1-3（b）为步骤3）执行的效果；

3） 步骤5）执行效果：窗体直接关闭，不会出现图1-3（b）警告对话框。

图1-3（a） 实验1.4运行效果1）、2） 图1-3（b） 实验1.4运行效果3）


实验1

实验1.5

在frmLogin的代码编辑窗口中，分别将下述代码做如下修改，每次修改完，将光标移到其他行，观察系统的变化。在进行新步骤前，先将代码恢复为原始代码。

原始代码：

Private Sub CmdCancel_Click()

Print "You clicked 'Cancel' button."

End Sub

修改步骤：

1） 将Private Sub CmdCancel_Click()最后的括号删除，即改为：

Private Sub CmdCancel_Click

2） 将End Sub 前面的End删除，即改为：

Sub

3） 将Print "You clicked 'Cancel' button." 前面的Print删除，即改为：

"You clicked 'Cancel' button."

4） 将Private Sub CmdCancel_Click()中所有字母都改为小写字母，然后运行系统并用鼠标单击“取消”按钮，观察运行结果。即上述代码改为：

private sub cmdcancel_click()

【相关知识】 本实验是为了练习利用VB编译时的错误提示对话框发现代码中的语法错误。

【实验结果及提示】

1） 修改步骤1）完成光标移到其他行后，系统自动加上“()”，恢复为原始代码。提示：过程中即使不使用参数，后面的括号“()”也是必须的，VB编译系统可以自动将一些格式错误按标准格式修改；

2） 修改步骤2）完成光标移到其他行后，系统自动弹出如图1-4所示对话框，提示用户语法错误，并将出错位置以红字标明。提示：VB编译系统可以自动检查部分语法格式的完整性，并对不完整的语法格式给出错误提示，并以特殊颜色标明（具体颜色的选择可由用户自己设置，缺省为红字）。编辑代码过程中可根据这些特殊颜色的代码快速地找到错误语句；

图1-4 系统提示的编译错误

3） 修改步骤3）完成光标移到其他行后，系统自动弹出如图1-5所示对话框，提示用户语法错误，并将出错位置以红字标明。提示：同上。此处缺少命令关键字；

图1-5 系统提示的编译错误

4） 修改步骤4）完成光标移到其他行后，代码自动改为：Private Sub cmdcancel_click()。运行结果与未修改前相同，即同图1-3（a）。提示：

l VB编译系统自动将命令保留字、内置函数、用户自定义的标识符等以其最初定义的格式显示，用户也可以根据此来判断输入标识符是否有误；

l VB语言中标识符不分大小写，因此运行结果与未修改前相同。


实验1

实验1.6

在frmLogin窗体设计过程中，请利用VB帮助系统查阅窗体的Picture、ScaleWidth和WindowState属性的用法。

【相关知识及提示】 本实验是为了熟练使用VB的联机帮助系统。属性使用的帮助信息通常可通过以下方式获得：

1） 在可视化开发环境的“属性”窗口中，将光标定位于某一属性，在“属性”窗口的下半部分会给出该属性的简单功能说明——“Picture：返回/设置控件中显示的图形”，如图1-6所示；

2） 在可视化开发环境的“属性”窗口中，将光标定位于某一属性，按下“F1”键，系统会打开MSDN帮助系统，并自动定位于该属性的帮助信息区；如图1-7所示；

3） 直接打开MSDN帮助系统，对该属性进行查找，如图1-8所示；。

图1-6 属性窗口

【实验结果】

图 1－7 使用F1的帮助

图1－8 帮助窗口


实验1

实验1.7

在frmLogin窗体的代码设计过程中，请利用VB帮助系统查阅：

1） 查阅CheckBox控件的使用说明；

2） 窗体的Show、Hide方法及其参数的使用；

3） 查阅窗体的KeyPress、Load、UnLoad事件及其参数的使用；

4） 查阅当前系统时间的获取函数；

5） 查阅WindowState属性使用中，描述各状态的VB常量。

【相关知识及提示】 本实验是为了熟练使用VB的联机帮助系统，掌握利用MSDN查阅VB中各函数、命令、对象、属性、方法、事件、VB常量等的使用。

【实验结果】


实验目的

本实验主要是熟悉Visual Basic程序设计开发工具的窗体和基本控件的使用，掌握Visual Basic应用系统界面的设计。通过实验学生应该：

1． 熟悉窗体各属性、方法和事件的用法；

2． 熟悉基本控件各属性、方法和事件的用法；

3． 熟练掌握运用窗体、基本控件的主要属性设置满足应用系统需求的界面；

4． 熟练运用窗体、基本控件的属性、方法、事件完成应用系统功能的代码编程；

5． 熟练掌握窗体界面及程序代码的设计。


实验内容及要求

本实验将通过几个实验案例，逐步完成“学生基本信息管理系统”中部分界面和功能。实验过程中重点完成以下工作：

1． 应用系统版本版权对话框的创建及优化；

2． 利用窗体属性的修改设置满足应用系统特殊需要的窗体，包括：版本版权对话框、“学生基本信息维护”窗体等不同类型的窗体界面；

3． 利用窗体的打开、隐藏和关闭操作，在应用系统中调用及关闭不同的窗体；

4． 利用窗体常用事件完成应用系统中的特殊需要，如窗体内容随窗体大小变化的调整、窗体关闭前的确认提示、窗体及控件的初始化设置等；

5． 利用基本控件属性的设置、窗体对象格式调整工具等创建及优化“学生基本信息维护”窗体界面，为用户提供界面友好、操作方便的输入界面；

6． 利用基本控件的方法、事件实现应用系统输入数据的合法性、有效性、完整性检查；

7． 应用系统菜单的创建和使用；

8． 利用Timer控件实现对学生计算机答卷的自动控制，包括试卷的显示、自动计时、试卷的到点自动锁定等；

9． 利用基本控件的方法、事件完成简单的学生选课界面。


实验2

实验2.1

创建如图2-1所示窗体，要求按下述步骤分步完成窗体各属性的设置，并将此窗体设置为启动窗体，在每一步设置完成后运行，观察各属性值不同设置的显示效果。

图2-1 系统描述信息

1） 窗体命名为frmAbout，标题设置为空字符串，并以文件名frmAbout.frm保存；

2） BorderStyle属性分别设置为None、Fixed Single、Fixed Dialog、Sizable、Fixed ToolWindow、Sizable ToolWindow，运行窗体观察边框的变化，用鼠标分别拖拉边框，看能否改变窗体大小；

3） 将MaxButton、MinButton值设置为False，运行窗体观察窗体显示效果；

4） 将Movable属性设置为False，运行窗体并用鼠标拖拉标题栏，观察效果；

5） 将ControlBox值设置为False，运行窗体观察窗体显示效果；

6） 将MaxButton、MinButton值重新设置为True，运行窗体观察窗体显示效果。

【相关知识及提示】 本实验是为了熟悉窗体各属性值变化所产生的效果。重要知识点提示：

1） 窗体标题不为空时，无法去掉窗体标题栏；

2） 只有ControlBox值为True时，MaxButton、MinButton才会起作用。

【实验结果】

实验成功的标志程序运行结果显示为图2-1所示界面。注意：该对话框没有标题栏和最大化、最小化、关闭等控制铵钮。

1） 步骤3）的显示结果为窗体右上角的最大化、最小化按钮不可用。如果同时将两个属性设置为False，则窗体上不显示这两个按钮；

2） 步骤4）将无法通过鼠标拖拉窗体标题栏来改变窗体的显示位置；

3） 步骤5）的结果为窗体上最大化、最小化和关闭控制铵钮不显示；

4） 步骤6）的结果同步骤5）。


实验2

实验2.2

在实验 1.2 （图1-1）和实验 2.1 （图2-1）基础上，将frmLogin设置为启动窗体，完成如下功能：

1） 运行系统时，将frmLogin在屏幕上居中显示；

2） 双击frmLogin窗体，以无模式方式打开窗体frmAbout，并将其在frmLogin的右下角位置显示；

3） 双击frmLogin上的ImgCartoon，将窗体frmAbout隐藏起来；

4） 步骤2）中打开窗体frmAbout时，以模式窗体方式打开，并试着用鼠标切换到frmLogin、VB集成开发环境及计算机桌面，观察与步骤2）中的不同。

【相关知识及提示】 本实验是为了熟悉窗体各属性的使用（主要练习在程序中动态修改属性值）及窗体的打开、隐藏和窗体常用事件的使用等操作。重要知识点提示：

1） 居中显示，可以在窗体布局窗口中做相对位置的调整，或通过窗体的StartUpPosition属性设置；

2） frmAbout的显示位置可通过frmLogin的左上角坐标及长、宽计算获得；

3） 窗体的隐藏可使用窗体的Hide方法和Visible属性实现；

4） 在窗体的Show方法后加参数vbModal将以模式窗体方式打开窗体。

【实验结果】

1） 步骤1）、2）、3）的显示结果同要求中描述；

2） 步骤4）执行结果为无法用鼠标切换到frmLogin，但可以切换到VB集成开发环境及计算机桌面。


实验2

实验2.3

在实验 2.2 中，添加如下功能：

1） 在窗体frmLogin中，完成：窗体大小变更时，系统名称“学生基本信息管理系统(V1.0)”（命名为lblTitle）自动在窗口中居中显示；

2） 利用窗体属性设置窗体打开时自动以最大化方式显示。

【相关知识及提示】 本实验是为了熟悉窗体常用属性和常用事件的使用。重要知识点提示：

1） 窗体大小变更时，激活Resize事件，在此事件中可以编写代码完成随窗体大小变更所要进行的操作；

2） 居中显示可通过窗体的宽度与标签的宽度自动测算标签显示位置；

3） 如果窗体的宽度小于标签宽度时，可将其靠最左边显示；

4） 窗体最大化显示可通过设计时或在代码中，利用“WindowState”属性设置。

【实验结果】

1） 不论窗体以原有尺寸、最大化或经鼠标拖拉，“学生基本信息管理系统(V1.0)”始终显示于窗体中部，如果窗体的宽度小于标签宽度时，靠最左边显示；

2） 窗体初次打开时，显示为最大化方式。


实验2

实验2.4

窗体的关闭及关闭前的提示。在frmLogin窗中添加功能：

1） 单击“取消”按钮，关闭该窗体；

2） 在关闭该窗体前，弹出一对话框“确认要退出？”，如图2-2所示。

图2-2 退出前确认

【相关知识及提示】 本实验是为了熟悉窗体关闭方法、UnLoad事件的使用，及利用窗体UnLoad事件实现窗体关闭前的处理工作。重要知识点提示：

1） 窗体中可使用Me变量指代当前窗体；

2） 注意：在“取消”按钮的Click事件中设置退出前的提示，则只能在单击该按钮时激活。而设置在窗体的UnLoad事件中，则可在任何关闭窗体的操作中都会激活该事件；

3） 窗体退出前的警告对话框，利用Msgbox函数实现，即：

MsgBox "确认要退出？", vbYesNo, "警告"

【实验结果】

1） 单击“取消”按钮，可以关闭本窗体，结束程序的运行；

2） 不论单击“取消”按钮还是窗体右上角的关闭按钮，都会给出图2-2所示对话框。

图2-3 学生基本信息维护


实验2

实验2.5

创建如图2-3所示“学生基本信息维护”窗体，要求：

图2-3 学生基本信息维护

1） 对窗体、各控件规范命名（窗体命名为frmStInfo）；

2） 设置窗体最小化显示时，以特殊图标显示，如图2-4所示；

3） 将“身份证号”域的最大输入长度设置为18位；

4） “备注域”设置为可以进行多行文本输入，并带有纵向滚动栏；

5） “民族”下拉列表设置为可在文本域输入、也可在列表中选择；“学院”、“专业”下拉列表设置为只能从列表中选择；

6） “添加”等按钮设置为可同时显示文字及图片方式。

图2-4 窗体最小化显示图标

【相关知识及提示】 本实验是为了熟悉基本控件属性的使用，并利用VB的“格式”菜单统一界面控件的布局。重要知识点提示：

1） 对象命名原则：对象类型 + 对象功能缩写，例：姓名输入域的命名—txtName；

2） 窗体Icon属性设置窗体最小化时的显示图标；

3） 下拉列表框的Style属性用于设置下拉列表的显示及输入方式；

4） CommandButton按钮的Style属性设置为Graphical，按钮上才能显示图片；

5） 利用“格式”菜单，可以快速设置窗体控件的自动对齐、自动调整间距、统一尺寸等界面布局格式。

【实验结果】

1） 如图2-3、2-4所示；

2） 功能按钮上（如“添加”按钮），可以同时显示小图标和文字。


实验2

实验2.6

对窗体frmStInfo进行初始化设置：

1） 在窗体初始化过程中，为各下拉列表框中列表赋值；

2） 编写学生基本信息初始化代码；

3） “专业”下拉列表框自动根据“所在学院”值调整，即“所在学院”选择为“计算机学院”，则专业相应调整为“计算机学院”下的相应专业名称，所在学院选择为“经济管理学院”，则专业相应调整为“经济管理学院”下的相应专业名称；

4） “入党时间”自动根据“是共产党员” 复选框调整，如果其值为False，则入党时间设置为灰色、不可选， 否则，入党时间设置为白色、可选；

5） “日期”下拉列表的初始化也要根据年、月的选择自动调整。

【相关知识及提示】 本实验是为了熟悉基本控件常用方法和事件的使用。重要知识点提示：

1） 通常窗体的初始化，在Form_Load事件中完成；

2） 学生基本信息的初始化，因要在窗体启动、添加记录等多种情况下使用，应该创建为单独的子程序，以便于代码的重复调用；

3） 基本信息的初始化，可做如下工作：学号、姓名、籍贯、入学时间、身份证、入党时间、备注等项值置为空值，民族、所在学院值取列表的第一项值，性别设置为男，是共产党员复选框设置为False；

4） 在对专业下拉列表框初始化时，注意要先清空下拉列表框的值，以避免遗留下不符合条件的值或造成重复值的出现；

5） “日期”下拉列表的初始化，是指日期的最大取值根据年份和月份的取值来设置，如：1月取值范围为1到31，润年2月取值范围为1到29，以此类推。

【实验结果】

1） 窗体打开时，“所在学院”、“民族”列表中已有可选值；

2） “所在学院”值变更后，“专业”列表值自动更新为新学院下的专业列表，且不能有其他学院的专业或重复的专业值；

3） “入党时间”自动随“是共产党员” 复选框的值调整输入状态，符合要求4）中的说明；

4） “日期”列表值的范围符合提示5）中的说明。


实验2

实验2.7

为窗体frmStInfo创建事件驱动代码（注：此实验中可只以print方法在相应事件中输出功能的描述，具体功能的实现在程序控制结构内容学习后完成）：

1） 数据输入的控制：限制身份证只能输入数值型数据和退格键，而不能输入其他字符；

2） 数据输入完后，对数据的有效性检验：检测身份证号是否为15位或18位，如果不是，则给出提示信息，并不允许光标离开；

3） 保存前数据的有效性、完整性检验：学号、姓名、身份证号、学院不允许为空。

【相关知识及提示】 本实验是为了熟悉基本控件常用方法和事件的使用。重要知识点提示：

1） 数据长度的检测使用函数Len；

2） 数据输入的控制使用键盘事件（KeyPress）控制；

3） 数据输入完的检验通常在LostFocus事件中检验；

4） 保存前的检验在数据写入存储介质（如数据库文件）前检验；

5） 使用对象的SetFocus方法，可以将光标定位到特定对象上，可用于在数据输入不合法情况下，直接将光标定位于需要修改或重新输入的数据域，而不需要用户再使用光标或鼠标来定位；

6） 不允许光标离开某一对象，通过使用对象的SetFocus方法将其重定位于该对象来实现。

【实验结果】

1） 在身份证输入域按下字母、数字键后，在窗体上要相应输出所按键；

2） 身份证输入完后，要在窗体上输出输入身份证的长度；

3） 保存记录时，在窗体上输出“姓名”的长度。


实验2

实验2.8

为窗体frmStInfo设置学生基本信息输入状态：

1） 设置学生基本信息的修改标识，当学生信息中任何值被修改，则将此值置为True，否则置为False，以便于窗口关闭前的保存提示；

2） 设置窗口关闭前的保存提示：如果当前记录已被修改，则给出实验2.4的保存提示（提示内容改为“当前记录尚未保存，确认要退出？”），否则不予任何提示直接关闭。

【相关知识及提示】 本实验是为了熟悉基本控件常用方法和事件的使用。重要知识点提示：

1） 学生基本信息的修改标识，可通过窗体的Tag标识设置；

2） 控件的任何一点修改都会激活控件的“Change”事件，可在此事件中修改“学生基本信息的修改标识”。

【实验结果】

1） 窗体上记录如果未做任何修改，则单击窗体的关闭按钮后直接关闭窗体；

2） 如果窗体上记录做了修改，如“专业”值重新选择或姓名等改动（包括原有值为空，用户输入“ChenXD”后又直接删除，也算记录做了修改），则给出保存提示对话框。


将窗体frmAbout的系统标题部分以浮雕效果显示

将窗体frmAbout的系统标题部分以浮雕效果显示，如图2-5所示。

图2-5 系统描述信息

【相关知识及提示】 浮雕效果可通过两种不同字体颜色（如黑、白）的标签相互错位实现。

【实验结果】 如图2-5所示。

。


实验2

实验2.10

为窗体frmStInfo创建菜单，菜单项包括表2-1所示内容（菜单参考图2-6）：

表2-1 窗体frmStInfo的菜单项

主菜单 | 文件（F） | 记录（R） | 帮助（H）
子菜单 | 打开（O） 关闭（C） ————— 退出（X） | 增加（A） 删除（D） 保存（S） ————— 筛选（F） | 帮助（H） ————— 关于…（A）

1） “打开”“关闭”命令用于打开/关闭一个图片文件，同时在窗体右上角的PictureBox中显示/清除该图片；

2） “记录”菜单下各菜单项与界面上相应功能按钮功能一致；

3） “关于…”命令用于以模式窗体方式打开frmAbout窗体。

图2-6 窗体frmStInfo的部分菜单项

【相关知识及提示】 本实验练习窗体菜单编辑器的使用，及菜单驱动事件的编程。重要知识点提示：

1） 菜单项间的分隔线，是将该项的标题设置为负号“-”来实现。分隔线也是一个特殊的菜单项，也必须为其单独命名；

2） 窗体调入内存及从内存中清除，使用LoadPicture函数，例：

Me.Picture = LoadPicture(“幸运星_标.jpg”)

Me.Picture = LoadPicture(“”)

3） 窗体以模式方式打开，是在Show方法后加参数vbModal。

【实验结果】

1） 菜单显示如图2-6所示；

2） 单击“打开”菜单项后，可将“幸运星_标.jpg”图片（或其他指定图片）显示于窗体右上角的PictureBox中；单击“关闭”菜单后，PictureBox显示空白；

3） frmAbout窗体打开后，如果不关闭它，光标无法定位到frmStInfo窗体。


实验2

实验2.11

为窗体frmStInfo创建弹出式菜单，包括：打开、关闭、颜色、字体、帮助几项。当在PicPhoto图片框上按下鼠标时，打开该菜单，如图2-7所示：

图2-7 PicPhoto图片框的快捷菜单

【相关知识及提示】 本实验练习弹出式菜单的定义和使用。重要知识点提示：

1） 弹出式菜单定义同窗体顶部菜单条的定义方式相同，如果不希望它在窗体顶部显示，则可通过菜单的Visible属性将其隐藏；

2） 菜单的Enabled属性用于设置菜单项是否可选，即对灰色不可选的设置或取消（如本实验中的“关闭”菜单项）；

3） 弹出式菜单的打开使用窗体的PopupMenu方法，在弹出式菜单中要显示的菜单项通过菜单名来调用。

【实验结果】 如图2-7所示。


实验2

实验2.12

创建窗体frmOnTest，用于学生考试计算机答题，要求：

1） 窗体打开时：在窗体的右上方显示学生学号、姓名，剩余考试时间显示为120分钟，试卷区空白，“开始考试”按钮可以使用，“交 卷”按钮不能使用，如图2-8所示；

2） 单击“开始考试”按钮后，“试卷”区调出并显示试卷（“试卷”区域设置为只能浏览，不能修改），系统开始计时，并每隔1分钟将剩余考试时间显示于界面（假设考试时间为120分钟）。同时将“开始考试”按钮设置为不能使用，“交 卷”按钮设置为可以使用，用户可以利用鼠标或键盘快捷键进行答题，如图2-9所示；

图2-8 计算机答题窗体（a）

图2-9 计算机答题窗体（b）

3） 当用户单击“交 卷”按钮时，提示用户“是否确认要结束考试？”，如果用户选择“是”，则将“试卷”区清空，将答题纸锁定（即设置为不可修改状态），“交 卷”按钮设置为不可使用，同时系统停止计时；如果用户选择“否”，则取消“交卷”操作继续答题。当考试剩余时间为0后，将“试卷”区清空，将答题纸锁定，“交 卷”按钮设置为不可使用，同时系统停止计时。如图2-10所示。

图2-10 计算机答题窗体（c）

【相关知识及提示】 本实验练习利用Timer控件实现系统的自动计时开始、自动计时结束及定期执行某一特定操作。重要知识点提示：

1） 学号、姓名从系统登录窗体frmLogin获取；

2） Timer控件的Enabled属性设置为False或Interval属性设置为0时，系统不计时；当Timer控件的Enabled属性设置为True且Interval属性不为0时，系统开始计时。这个特性用于控制系统计时的开始和结束；

3） Timer控件的Interval属性的计量单位为毫秒，在控制时间时注意不要弄错；

4） Interval属性取值介于0 ~ 64 767之间，所以最大的时间间隔为1分钟，超过这个时间间隔需要通过程序代码来控制；

5） CheckBox的快捷键的设置，可在显示提示部分（Caption），通过在作为快捷键的字母前加“&”符实现。

【实验结果】 符合实验2.12中所述，并如图2-8、2-9、2-10所示。


实验2

实验2.13

在图1-1所示界面中，单击“确认”按钮时，在窗体上输出字符器串“学生基本信息管理系统，为学生提供一个较为全面的管理类应用系统实践环境和学习、演练、规范的空间。”单击“取消”按钮时，将窗体中的字符清除。

【相关知识及提示】 本实验练习窗体Print及Cls方法的简单使用。

【实验结果】

1） 单击“确认”按钮时，窗体上从上到下输出上述文字，且按一次输出一行，每次输出都从行首开始；

2） 单击“取消”按钮时，上面单击“确认”按钮时输出的文字被清除，其他内容保持不变。


实验2

实验2.14

观察实验2.13的系统运行效果：

1） 利用“取消”按钮清除窗口时，标签、按钮等显示的内容是否有变化？

2） 先将窗体的Picture属性值清空，将窗体放大，上面输出的文字内容是否能全部显示？如何设置能使其在窗体放大时全部显示出来？

【相关知识及提示】 本实验练习窗体属性的使用。重要知识点提示：

1） 窗体的Cls方法只能清除Print方法输出到窗上的内容，不能清除标签、按钮等对象及这些对象上的内容；

2） AutoRedraw属性设置为True时，窗体大小变更时，会自动刷新界面上输出内容的显示；

3） Picture属性值不为空时，AutoRedraw属性不发生作用。

【实验结果】

1） 标签、按钮等显示的内容没有变化；

2） 当窗体较小时，单击“确认”按钮输出的文字内容部分超出窗体的宽度，不能全部显示，当窗体变大时，这些文字能随着窗体的变大显示出来。


实验2

实验2.15

建立如图2-11所示界面，要求text1可以输入字串并可以选取字串，label1显示“起始位置”；text2放入选取子字串的开始位置值；label3显示“长度”；label4放入选取子字串的长度值。按钮1设置“清除”按钮，按钮2设置为“移动”按钮。当按“清除”钮时，将所有控件的显示内容清除为空；当按“移动”钮时，把text1中选中的子字串放入到text2中。

【相关知识及提示】 本实验练习TextBox的SelLength、SelStart和SelText属性的使用，并利用其实现对输入域中部分内容的移动、复制或删除等操作。重要知识点提示：

1） 选取子串的起始位置、长度和选取的内容可利用TextBox的SelLength、SelStart和SelText属性获取；

2） 这几个属性是运行时才能使用的属性，在窗体设计时的“属性”窗口里没有，只能在程序代码中使用。

【实验结果】

1） 在上面的文本框中输入“C++、Visual Basic、管理信息系统”，并用鼠标选中“Visual Basic”，单击“移动”按钮时，显示结果如图2-11（b）；

2） 再单击“清除”按钮后，显示如图图2-11（a）。

图2-11 字符串的选择与移动（a） （b）


实验2

实验2.16

完成学生选课功能，如图2-12（a）所示：左边的列表框中显示全部可选课程，在学生选定课程后，单击右移钮（>）系统自动将所选课程转移到右边的列表框中；反之，在右侧列表中选定要删除的课程后，单击左移钮（<），系统自动将所选课程转移到左边列表框。

图2-12 列表值的选取 （a） （b）

【相关知识及提示】 本实验练习列表内容的添加及删除。重要知识点提示：

1） 列表值的删除，通常适宜由后往前删除，以避免由于列表各项索引值的自动调整导致遗漏；

2） 一次性将列表框中所有值删除，可使用Clear方法。

【实验结果】

1） 运行界面如图2-12（a）所示；

2） 选中图2-12（a）中的“Visual Basic”和“网络数据库”后，单击“>”按钮，运行结果如图2-12（b）所示；

3） 在右侧列表中选中“Visual Basic”和“网络数据库”后，单击“<”按钮，运行结果恢复到图2-12（a）所示。


实验目的

本实验主要是培养良好的Windows应用程序编程规范，理解及熟练应用Visual Basic程序设计开发工具的编程基础，能够在应用系统中准确使用变量、常量、数组、表达式等编写程序代码。通过实验学生应该：

1． 培养良好的Windows编程规范；

2． 准确理解变量、常量的使用，特别是变量、常量的作用范围；

3． 熟悉VB不同数据类型的使用；

4． 对比VB中变量使用与C语言中的区别（强制类型定义语句的使用）；

5． 熟悉数据类型间的相互转换；

6． 掌握数组的使用：定义、一维、多维；固定数组、动态数组；Variant型数组；

7． 熟悉VB运算符、表达式。


实验内容及要求

本实验将通过几个实验案例的练习，逐步掌握并能自觉按规范化格式书写Windows程序代码，创建易于理解、易于维护、易于扩充、易于重复使用的程序代码。能够准确地使用数组简化程序功能处理，并通过Visual Basic表达式的练习，掌握程序设计语言中表达式书写方式与生活中表达式书写的差异。

实验过程中重点完成以下工作：

1． 按照Windows编程规范将“学生基本信息管理系统”中已完成的功能作规范化处理，并在以后的程序设计中规范代码；

2． 根据应用系统中变量的不同作用范围，定义及使用变量；

3． 利用VB数据类型优化程序运行效率；

4． 利用数据类型间的相互转换完成系统中对不同类型数据的处理；

5． 利用数组简化应用系统程序代码；

6． 使用VB中的运算符、表达式完成应用系统中的特定运算功能。


这里是您的标题

实验3.1

在代码中使用强制类型定义，并对前面使用变量的代码补充变量定义（以后的所有实验中如无特殊声明，均为使用该语句的方式）。为实验2.6和实验2.7的程序代码添加注释。

实验结果

1） 窗体模块中使用Option Explicit语句；

2） 程序执行中不会报错（要求所有变量使用前必须定义）；

3） 复杂功能、特殊变量、全局变量、模块级局部变量后都有注释说明。


实验4

实验3.2

将前面各实验代码以缩进格式排列，并添加适当注释。对较长的语句以分行格式书写。

【相关知识及提示】 上述二实验的目的是规范程序代码的编写格式。重要知识点提示：

1） 对子程序的功能、所用参数、主要变量（特别是全局变量、模块级局部变量）要加以注释；

2） 对复杂算法或处理加以注释；

3） VB中长语句分行使用空格加下划线“ _”，注意：下划线前的空格不能省。

【实验结果】

1） 程序结构清晰，层次分明；

2） 代码的阅读不用左右拖动代码窗口的滚动条就能方便地阅读。


实验3

实验3.3

修改实验2.8，将学生基本信息的修改标识利用变量定义。

【相关知识及提示】 标识变量定义为模块级局部变量。

【实验结果】 同实验2.8。


实验3

实验3.4

实验2.6中，56个民族值存放于一个数组中，对“民族”下拉列表框的初始化从该数组中读取。

【实验结果】 同实验2.6。


实验3

实验3.5

在窗体frmStInfo中，单击“保存”钮后，将界面输入的学生基本信息数据存放于一个二维数组，其中第一维描述不同的学生，第二维存放每个学生的基本信息。

【相关知识及提示】 上述二实验练习数组的使用。重要知识点提示：

1） 存放具有不同类型数据的数组，要定义为Variant型；

2） 存放学生基本信息的数组，定义为动态数组，实际使用中根据具体学生数重新定义；

3） TextBox文本框和下拉列表框中接收的是String型数据，存入数组中时要进行必要的类型转换；

4） 二维数组中存放多条学生基本信息，可设置一模块级局部变量，每添加一条学生基本信息后，该标识变量累加计数一次并作为新记录的第一维下标值。

【实验结果】

1） 利用窗体frmStInfo输入表3-1的学生基本数据，并将其写入二维数组arrStInfo中；

2） 编写一测试代码：双击窗体时用Print方法在“立即”窗口中输出arrStInfo(1, 0)、arrStInfo(1, 1)、arrStInfo(1, 2)、arrStInfo(1, 3)、arrStInfo(1, 4)、arrStInfo(1, 5)、arrStInfo(1, 6)、arrStInfo(1, 7)、arrStInfo(1, 8)和arrStInfo(1, 9)，每个数组元素显示为一行；

3） 结果如图3-1所示。

表3-1 实验数据

姓名 | 性别 | 民族 | 藉贯 | 学院 | 专业 | 入学日期 | 身份证号 | 党员 | 入党时间
卢亮 | 男 | 汉族 | 河北 | 经管 | 信息管理 | 2000.9.1 | 002440250000000000 | FALSE |
马冀 | 男 | 回族 | 河北 | 经管 | 信息管理 | 2001.9.11 | 012440020000000000 | FALSE |
王佳琦 | 男 | 汉族 | 吉林 | 经管 | 信息管理 | 2003.1.1 | 012440030000000000 | FALSE |
于 凤艳 | 女 | 汉族 | 浙江 | 经管 | 信息管理 | 2001.9.11 | 012440040000000000 | FALSE |
叶亚芝 | 女 | 汉族 | 四川 | 经管 | 信息管理 | 2001.9.11 | 012440050000000000 | FALSE |
左小川 | 男 | 汉族 | 山东 | 经管 | 信息管理 | 2001.9.11 | 012440060000000000 | TRUE | 2002.6.11

图3-1 实验3.5测试结果


实验3

实验3.6

创建如图3-2所示“学生成绩管理”界面frmStScore用于输入学生成绩：

1） 学生记录从实验3.5中保存的学生中读取，每次单击“上一条”、“下一条”钮时，将前次操作所做修改保存，并自动将新记录的学生姓名及成绩显示在图示相应文本框中；

2） 姓名、总评成绩设置为只读，允许用户输入、修改平时成绩和考试成绩；

3） 对输入成绩值进行合法性检查，如果输入数据是非数值型数据，则显示错误提示信息并将光标定位于该输入域要求重新输入；

4） 平时成绩和考试成绩输入完后，自动计算出总评成绩，并在界面上显示，计算公式为：

其中：S、D、E分别指代总评成绩、平时成绩和考试成绩。

【相关知识及提示】 本实验练习数据类型的检验及转换，程序设计语言中表达式的书写。重要知识点提示：

1） 学生基本信息的存放，可先定义为全局型数组，以便于此处使用。将来学习数据库的访问后，直接从数据表中读取；

2） TextBox文本框中接收的是String型数据，存入数组时要通过Val()函数将该String型数据转换为数值型数据；

3） 将光标定位于指定输入域使用对象的SetFocus方法；

4） 注意表达式的书写方式。

图3-2 学生成绩管理

【实验结果】

1） 在图3-2所示“学生成绩管理”界面中输入平时成绩——95，考试成绩——84；

2） 光标离开“考试成绩”后，“总评成绩”自动计算并显示，如图3-3所示；

3） 单击“上一条”按钮，姓名显示为“王佳琦”，“平时成绩”、“考试成绩”和“总评成绩”显示为空。

图3-3 学生成绩管理


实验3

实验3.7

为了实现整个系统在引用π值时的一致性，在Common模块中，将其定义为一全局常量conPI，并赋值——3.1415926。

【实验结果】

1） 在窗体frmStScore和frmStInfo中，分别编写代码测试：双击窗体时，在“立即”窗口中显示conPI的值；

2） 两个测试的结果应该都为3.1415926。


实验3

实验3.8

编程求解如下表达式的值（界面可参照图3-4）：

图3-4 表达式求解

【相关知识及提示】 本实验练习程序设计语言中表达式的书写。重要知识点提示：

1） 程序代码中无法识别上标及下标，下标均以普通数字描述，如x1在程序代码中书写为x1；上标根据情况，若为指数形式，则转换为乘方形式，用“^”表示，x2书写为x^2；

2） 分数转换为除法，根号使用专门的函数Sqr()；

3） VB中三角函数中参数都使用的是弧度值，如果表达式中为角度值，需对其进行转换，转换公式为：

弧度值 = 角度值 * 3.1415926/180

【实验结果】

1） a、b、c分别输入81、4、4；

2） 单击“计算”按钮显示结果如图3-5，x1的值显示为1.7071。

图3-5 表达式求解


这里是您的标题

实验3.9

在图3-4所示窗体中，在“x1=”后的TextBox中输入一个数，在单击“计算”钮后，将“x1是否在[70，85]的区间”的结果在“x2=”后的TextBox中显示出来。

图3-4

【相关知识及提示】 本实验练习关系表达式与逻辑表达式的书写。重要知识点提示：

1） 程序设计语言中无法识别“≥”、“≤”和“≠”等特殊符号，这些符号在程序语言中的表示方法分别为：“>=”、“<=”和“<>”；

2） 程序设计语言中不能对一个数或变量双两个方向比较，若想表示某一变量在某个范围内，需通过逻辑表达式将两个关系表达式组合，如：

x >= 0 And x <= 60

3） TextBox中接收的数据是String型，在对其做数学运算前要先用Val()函数将其转换为数值型数据。

【实验结果】

1） X1输入81，显示结果为True；

2） X1输入50，显示结果为False；

3） X1输入91，显示结果为False。


实验3

实验3.10

在图3-4所示窗体中，在“a” 后的TextBox输入一个两位数，在单击“计算”钮后，将其十位数作为结果在“x1=” 后的TextBox中显示出来，将其个位数作为结果在“x2=” 后的TextBox中显示出来。

【相关知识及提示】 本实验练习算术运算符的使用。重要知识点提示：

1） 一个两位数与10整除的结果，为其十位数数字；

2） 一个两位数与10求余的结果，为其个位数数字。

【实验结果】 a输入81，x1显示结果为8，x2显示结果为1。

图3-4


实验目的

本实验主要是为了掌握结构化程序设计的三种基本控制结构，掌握利用这三种基本结构创建结构严谨流程清晰的应用程序代码。能够利用程序控制结构创建完成特定功能的子过程、函数。通过实验学生应该：

1． 掌握VB子过程、函数的定义、作用范围及使用；

2． 重点掌握其作用范围、参数的使用、函数返回值的使用、调用、及调用其他模块中的公用过程；

3． 熟练掌握MsgBox、InputBox两函数的使用；

4． 掌握流程控制语句的概念、分类及使用，能熟练地运用流程控制语句完成特定功能、算法程序代码的实现；

5． 熟练掌握嵌套结构、退出控制结构、退出子过程或函数语句的使用；

6． 能熟练地运用本章内容编写过程、调用过程。


实验内容及要求

本实验将通过几个实验案例的练习，掌握利用三种基本控制结构创建特定功能的子过程、函数的技巧，能够灵活地根据不同的条件控制程序执行的功能。

实验过程中重点完成以下工作：

1． 创建能完成独立功能的子过程和函数；

2． 利用函数返回值反馈程序处理结果；

3． 利用公用过程统一同一种功能处理，减小程序量，提高程序的可维护性；

4． 利用MsgBox、InputBox两函数进行特殊信息的显示及简单的数据输入；

5． 利用选择控制结构、循环控制结构简化系统中相近功能的处理；

6． 利用嵌套结构、退出控制结构、退出子过程或函数语句提高程序处理的灵活性。


实验4

实验4.1

统计frmStInfo窗体的身份证输入域中，各数字出现的次数，将统计结果在备注域中显示，要求该功能以独立的函数完成。

【相关知识及提示】 本实验练习循环语句的使用及如何读取一个字符串中各位字符的值。重要知识点提示：

1） 身份证号作为函数参数，统计结果作为函数返回值（String型）；

2） 用Mid()函数依次检测数据中的每个字符；

3） 各数字的统计可利用数值型数组存放，其中下标值与要统计的数字值相同；

4） 各数字的检测，可利用0-9各数字的ASCII码值减48正好等于该数字本身，做此转换后直接用于数组元素的值的累加；或利用类型转换函数，将截取的字符型数据转换为数值型数据，直接用于数组元素的值的累加。

【实验结果】

1） 输入身份证号“110108197201310011”后，光标离开“身份证号”输入域后，“备注”域显示统计结果如图4-1所示；

图4-1 数字的统计

2） 输入身份证号“110105198104270236”后，光标离开“身份证号”输入域后，“备注”域显示统计结果“0:4 1:5 2:2 3:1 4:1 5:1 6:1 7:1 8:1 9:1”。


实验4

实验4.2

为学生学号生成校验位，并对输入的带校验位的学生学号的正确性检验。假定学号校验位算法如下：

其中：

v表示校验位（位于学生学号的末位）；

n表示学号的长度；

Di表示学号的第i位数字值。

注：本实验仅用于练习利用数据的校验位完成对数据正确性的检验，实际系统中根据学号（或其他编码，如身份证号等）是否有校验位决定是否加此功能。

【相关知识及提示】 本实验练习函数及循环语句的使用。重要知识点提示：

1） 对各位数字的取值方法参考实验4.1；

2） 累加和利用循环实现；

3） 数据的数值位数，可利用Len()函数求得；

4） 如果为未加校验位的学号生成校验位，循环终值应该是学号的长度；如果对已有校验位的学号进行正确性检查，循环终值应该是学号的长度减1。

【实验结果】

1） 利用上述算法，生成学号“1999044”的校验位，结果为“6”；

2） 在“学号”值输入完毕后，按此算法利用校验位检查输入学号值是否正确。输入学号“19990441”后，光标离开“学号”输入域后的执行结果如图4-2所示；

图4-2 按校验位检验输入数据的正确性

3） 在图4-2中修改输入学号值为“19990446”后，光标离开“学号”输入域后，界面不产生任何提示信息。

1）


实验4

实验4.3

在实验3.6（图3-2）中，在“总评成绩”输入域单击鼠标右键时弹出对话框，将该值转换为“优、良、中、及格、不及格”五个等级的成绩，转移规则为：

【相关知识及提示】 本实验练习多分支结构的使用。重要知识点提示：

1） 需要先将“总评成绩”转换为数值型数据；

2） 多分支结构中，“Case 80 To 90”表示值的范围是从80到90，包含80和90；

3） 如果希望条件中为“90 ＞ Score ≥ 80”,可将90改为略小于90的一个数。

【实验结果】

1） 在如图所示的总评成绩中单击鼠标右键，显示结果如图4-3所示。

图4-3 “总评成绩”的转换


实验4

实验4.4

在frmStScore窗体（图3-1）中添加一按钮“排序”，单击此按钮，对实验3.6中前10位学生，按“总评成绩”从大到小排序，将结果输出到“立即”窗口。

【相关知识及提示】 使用双重循环结构（冒泡排序法）实现：

1） 先用第一位学生总评成绩与后面每一位学生的总评成绩比较，哪个学生成绩高，则将其与第一位学生的信息互换。这样比较一轮后，总评成绩最高的学生的信息被转移到第一位；

2） 接着再用第二位学生的成绩与后面每一位学生的总评成绩比较，做同样的置换，这样比较一轮后，总评成绩次高的学生的信息被转移到第二位；

3） 以此类推，直至总评成绩倒数第二高的学生的信息被转移到倒数第二的位置。


实验4

实验4.5

利用三种基本程序控制结构及函数、过程完善实验2.6、实验2.7、实验2.8、实验3.5、实验3.6中各事件功能，具体要求参见上述各实验。

【相关知识及提示】 本实验是练习对窗体、控件及程序控制结构等的综合编程，包括以下功能：

1） 窗体的初始化、下拉列表的初始化（从数组中读取，学习数据库技术后从数据表中读取）；

2） 学生基本信息的初始化赋值；

3） 数据输入控制：包括对无效输入字符的限制和数据输入完成后的合法性检验；

4） 数据输入过程中的数据动态调整：包括初始值或取值范围随另一项输入域值的变更而变更（如实验2.6），数据为另几项数据的计算结果（实验3.6）；

5） 数据保存前的完整性检查；

6） 窗体退出前的保存提示。

【实验结果】

1） 启动窗体frmStInfo后，界面初始化结果同实验2.6；

2） 在窗体frmStInfo 的“身份证号”输入域中只能输入数字和“退格键（BackSpace）”，如果输入字母或其他符号，输入域中不接收也不显示；

3） “身份证号”输入完光标离开时，如果输入身份证号长度不为15位或18位，则弹出对话框提示；

4） 在窗体frmStInfo中“姓名”域空着不输入，数据保存时要弹出对话框提示“姓名不能为空！”，并将光标定位在“姓名”输入域；

5） 如果窗体中有任何信息被修改而未做保存，则关闭窗体时弹出保存提示对话框，否则直接关闭窗体。


实验4

实验4.6

利用MsgBox函数完善实验2.8：

1） 在执行关闭操作时，如果当前学生基本信息保存，则正常关闭；否则给出退出前的保存提示，如图2-2所示；

2） 用户选择“是”，则不保存当前记录直接关闭窗体；用户选择“否”，则取消关闭窗体操作，返回到学生基本信息管理界面；

3） 【选做】 提示信息设为“退出前是否要保存当前记录？”，设置三个按钮“是”、“否”、“取消”。用户选择“是”，则保存当前记录并关闭窗体；用户选择“否”，则不保存当前记录直接关闭窗体；用户选择“取消”，则取消关闭窗体操作，返回到学生基本信息管理界面。

【相关知识及提示】 本实验练习MsgBox及其参数的使用，窗体关闭前的系统完整性保护。重要知识点提示：

1） 取消关闭窗体操作，返回到学生基本信息管理界面，利用窗体UnLoad事件中的Cancel参数实现；

2） 提示对话框中按钮的显示内容及数量，由MsgBox的Buttons参数控制；

3） 用户选择的按钮，由MsgBox的返回值确定（该返回值是Integer型）。

【实验结果】 同要求中的描述。


实验4

实验4.7

利用简单加密算法完善frmLogin窗体：

1） 修改“密码”输入域属性，使输入的所有字符显示为“*”号；

2） 限制密码只能输入26个英文字母（大小写视为不同字符）；

3） 加密算法：将输入字符转换为其后的第5个字符，如果转换后的字符超出字母的范围，则自动循环滚动。即AàF，aàf，YàD，zàe；

4） 单击“确定”钮后，将其与预设置好的经加密的密码验证，如果一致，则成功登录并打开frmStInfo窗体，否则，提示密码输入错误，要求重新输入。例如：设置加密后的密码值为“HmjsCI”（原始密码为“ChenXD”）。

【相关知识及提示】 本实验练习函数的使用、字符与其ASCII码值间的转换，简单的加密算法。重要知识点提示：

1） 由于"A" 到 "Z"及"a" 到 "z"的ASCII码值是连续的，所以可以直接使用字符的ASCII码值加5完成转换；

2） 对于超过字母范围的值，可利用转换后的ASCII码值与"Z"或"z"的ASCII码值比较判定；

3） 字符与ASCII码值间的相互转换函数：ASC()、CHR()。

【实验结果】

1） 密码输入后以“*”号显示，运行界面如图1-1所示；

2） 在密码域如果输入数字，则不接收输入及不会显示出来；

3） 输入密码“chenxd”时，系统弹对话框提示“密码输入错误！”，输入密码“ChenXD”时，直接打开frmStInfo窗体并关闭frmLogin窗体；

4） 代码中用于检验密码真伪性的标准密码使用“HmjsCI”，即：

If CheckUser(txtPwd.Text) = "HmjsCI" Then

FrmLogin.Show

Unload Me

Else

MsgBox “密码输入错误！”

End If


实验4

实验4.8

输入一元二次方程ax2 + bx + c = 0的系数a、b、c，求方程的根x1、x2。界面参考图3-4。

【相关知识及提示】 本实验练习表达式、选择结构的使用。重要知识点提示：

1） [image] 一元二次方程的两根计算公式：

2） 要根据值的不同情况（实根、重根、复根）采取不同处理方式，避免出现负数开平方。

【实验结果】

1） a、b、c分别输入1，1，1后，运行结果如图4-4（a）所示；

2） a、b、c分别输入1，2，1后，运行结果如图4-4（b）所示；

3） a、b、c分别输入1，0，-4后，运行结果为x1=2，x2=-2；

4） a、b、c分别输入1，0，4后，运行结果为x1=0+2i，x2=0-2i。

图4-4 一元二次方程求解 （a） （b）


实验4

实验4.9

输出如图4-5所示九九乘法表。

图4-5九九乘法表

【相关知识及提示】 本实验练习多重循环结构的嵌套使用。重要知识点提示：

1） 利用双重循环，其中外重循环用于各行的控制，内重循环用于每行中各列元素的构造；

2） 各列后的空格要根据列的宽度（取决于两数积的位数）确定，以保证下列保持对齐；

3） 每行的输出使用字符串变量构造好后一次性输出，即使用一条Print语句输出一行内容。在下一行构造前，对该字符串变量做初始化设置。

【实验结果】 如图4-5所示。


这里是您的标题

实验4.10

输出如图4-6所示杨辉三角形，其中行数通过InputBox()函数接收（8行以内）。

图4-6 杨辉三角形

【相关知识及提示】 本实验练习多重循环结构和选择结构的使用。重要知识点提示：

1） 利用二维数组实现，则每一行的第一元素和最后一个元素均为1，其余的值为上一行的同列元素与前一列元素的和，即：Factor(ii, jj) = Factor(ii - 1, jj - 1) + Factor(ii - 1, jj)；

2） 函数Space(n)用于返回n个空格，可用于控制每行前显示的空格数；

3） 各数值后的空格，可根据数值的位数确定（超过8行时的处理方法相同，只是由于出现三位数，更为复杂些。可以作为选做练习）；

4） 利用双重循环，其中外重循环用于各行的控制，内重循环用于每行中各列元素的构造。

【实验结果】 如图4-6所示。


实验4

实验4.11

编一函数计算三角函数Sin的近似值，算法如下：

1） 其中x为弧度值；

2） 当第n项的精度小于10-5时结束计算。

【相关知识及提示】 本实验练习函数的调用及数列的编程。重要知识点提示：

1） 多项式中的各项具有很强的规律性，可将其作为一个单独的函数，这样也便于对第n项精度的检测；

2） 累加和利用循环语句实现，当满足退出条件时，即“第n项的精度小于10-5时”，用Exit Do命令强行中止循环；

3） 可利用VB内置的三角函数Sin()的计算结果与该公式的计算结果比较，看看差异有多大。

【实验结果】 见表4-1。

表4-1 SIN的近似值与实际值的比较

弧度值 | 近似值 | 实际值
1.57 | 0.9999998 | 0.9999996829
0 | 0 | 0
0.785 | 0.7068252 | 0.70682519966
3.1415926 | 7.723509e-08 | 1.50995799098e-07
-1.57 | -0.9999998 | -0.9999996829


实验目的

本实验主要是为了熟练应用Visual Basic程序设计开发工具的ADO技术，建立与数据库的连接并对数据库数据进行存取操作。通过实验学生应该：

1． 使用VB数据窗体向导快速创建简单的数据库操作界面；

2． 掌握数据库绑定控件的使用，熟练掌握利用Ado控件对数据库操作；

3． 熟练掌握利用DE对数据库操作；

4． 掌握利用RecordSet对象对数据库进行存取访问；

5． 掌握SQL语句的使用和复杂SQL语句的构造；

6． 能熟练地运用ADO技术进行应用系统的编程。


实验内容及要求

本实验通过几个实验案例的练习，完成应用系统中对数据的存取访问和数据输入、输出的控制。运用ADO Data控件和数据环境为不同访问需求的界面创建与数据库的连接，并通过SQL语句、RecordSet对象等对输入、输出数据动态控制，提高系统操作的灵活性和可扩展性。

实验过程中重点完成以下工作：

1． 利用VB数据窗体向导为应用系统快速创建数据库操作界面；

2． 利用数据库绑定控件和Ado控件对数据库进行存取操作；

3． 为应用系统创建数据环境（Data Environment），利用OLE DB建立与数据库的连接；

4． 在应用系统中利用RecordSet对象对数据库进行存取访问，使用RecordSet对象对数据的输入、输出进行灵活地控制；

5． 利用SQL语句对数据库中记录进行有选择地组合、筛选。


实验5

实验5.1

创建一Access数据库Student.mdb，并创建几个数据表：操作员表（Tbl_User）、民族代码表（Tbl_Nation）、学生基本信息表（Tbl_Student）、学院专业表（Tbl_Dep）、学生成绩表（Tbl_Score）等，表结构参见表5-1、表5-2、表5-3、表5-4、表5-5。

表5-1 操作员表（Tbl_User）结构

字段名 | 数据类型 | 含义
UserID | String*10 | 用户帐号
UserPwd | String*10 | 用户密码
UserRight | Integer | 用户权限

表5-2 民族代码表（Tbl_Nation）结构

字段名 | 数据类型 | 含义
NationID | String*2 | 民族代码
S_Nation | String*20 | 民族

表5-3 学生基本信息表（Tbl_Student）结构

字段名 | 数据类型 | 含义 | 字段名 | 数据类型 | 含义
s_StNo | String*10 | 学号 | s_name | String*10 | 姓名
s_sex | String*2 | 性别 | s_nation | String*20 | 民族
s_native_place | String*50 | 藉贯 | s_department | String*10 | 学院
s_specialty | String*20 | 专业 | s_entertime | Date | 入学时间
s_party | Boolean | 是否党员 | s_partytime | Date | 入党时间
s_id | String*18 | 身份证号 | s_photo | 二进制 | 照片

表5-4 学院专业表（Tbl_Dep）结构

字段名 | 数据类型 | 含义
s_specialty | String*20 | 专业
s_department | String*10 | 学院

表5-5 学生成绩表（Tbl_Score）结构

字段名 | 数据类型 | 含义
s_id | String*18 | 身份证号
proj_name | String*20 | 课程名
s_DailyScore | Single | 平时成绩
s_ExamScore | Single | 考试成绩
s_SynScore | Single | 总评成绩

【选做】 本系统实验中主要目的在于掌握使用Visual Basic为应用系统编程，为减少编程过程中的复杂性，数据表的设计以方便为原则，未做规范化设计要求读者在熟练掌握数据库访问技术后，可以将数据库重新规范设计，如：

1） 将学院专业表分解为学院代码表、专业代码表，并为其设置规范编码，同时学生基本信息表中这些专有属性改用代码而非实际名称；

2） 增加其他一些与学生日常管理相关的表，如课程代码表、选课表等；

3） 数据库可选用SQL Server、Oracle等大型数据库。

【相关知识及提示】 该数据库及相应的表直接使用Access系统创建，也可使用VB内嵌的“可视化数据管理器”创建。


实验内容及要求

本实验通过几个实验案例的练习，完成应用系统中状态栏、工具栏的创建，利用公用对话框打开Windows标准的打开、另存为、颜色设置等对话框完成应用系统中相应的功能需求。利用其他控件优化系统界面。

实验过程中重点完成以下工作：

1． 运用公用对话框打开指定文件、保存文件、设置颜色和字体等；

2． 利用控件数组定义单选钮，并为其编写事件驱动代码；

3． 利用菜单控件数组动态调整菜单项的设置；

4． 为应用系统创建状态栏、工具栏，将为编写相应代码；

5． 利用进度指示器、滚动条、UpDown控件、SSTab控件等优化系统界面；

6． 运用鼠标事件绘制简单图形；

7． 运用键盘响应事件及相关参数完成对数据有效性输入的检验及控制。


实验5

实验5.2

为上述数据库Student.mdb建立逻辑数据库StDB。

【相关知识及提示】 建立ODBC数据源。重要知识点提示：

1） 运行管理工具文件夹中的ODBC数据源管理器（Windows98及以前版本直接作为控制面板的一个小程序）；

2） 在系统DSN选项卡下添加一新的ODBC数据源，数据源的驱动程序选择上面创建数据库所用的数据库管理系统（DBMS）——本实验中物理数据库使用Access创建，所以选择“Microsoft Access Driver (*.mdb)”；

3） 将其指向上面的物理数据库。

【实验结果】系统DSN中新增StDB。


实验5

实验5.3

创建一新窗体frmSchool，利用Ado控件实现对表记录的维护，界面参考图5-1：

1） 通过AdoData控件建立与StDB中表Tbl_Dep的连接；

2） 将文本框、Data Grid控件与表中字段绑定，使之可以直接利用Data Grid控件浏览表中记录，利用绑定的文本框对“学院专业表”（Tbl_Dep）信息进行添加、删除、修改等维护操作。

图5-1 学院专业维护

【相关知识及提示】 本实验练习AdoData控件、AdoDataGrid控件及控件与数据表的绑定，利用AdoData控件完成对表记录的维护。重要知识点提示：

1） 基本控件中只有Data控件，这是Visual Basic5.0版以前使用的控件，采用的是RDO访问技术。若使用AdoData控件和AdoDataGrid控件，要在“工具箱”窗口中单击鼠标右键，选择“部件”（或“工程”菜单下的“部件”选项），并在弹出的“部件”对话框中将“Microsoft ADO Data Control6.0 (OLE DB)”、“Microsoft Data Grid Control6.0 (OLE DB)”选中，将其添加到工具箱中；

2） 也可利用VB数据窗体向导创建上述窗体，通过各对象的属性重新设置调整其界面风格（如标签显示文本等）。

【实验结果】

1） 运行界面如图5-1所示；

2） 单击Data控件左右箭头时，窗体上部的文本框内容和网格中的记录值能随着变更；

3） 单击“添加”按钮，可以加入一条空白记录，用于输入新记录值；

4） 单击“更新”按钮，可以将当前记录保存到数据表中；

5） 单击“删除”按钮，可以给出删除提示信息，并在用户确认要删除后，将当前记录删除，并自动将记录指针移到下一条记录；

6） 单击“关闭”按钮，可以关闭当前窗体。


实验5

实验5.4

使用与实验5.3相同的方法，创建对“民族表”（Tbl_Nation）维护的窗体。

【相关知识及提示】 同实验5.3。

【实验结果】类似实验5.3。


实验5

实验5.5

为StManage工程创建Data Environment，实现利用Data Environment对表记录的维护：

1） 添加一Data Environment，将其命名为StManaDE；

2） 在StManaDE中添加一Connection，命名为StDBConn，将其连接到逻辑数据库StDB；

3） 在StDBConn中添加一Command1，将其与表Tbl_student连接。

【相关知识及提示】 本实验练习利用Data Environment连接数据库和数据表。重要知识点提示：

1） Connection、Command与逻辑数据库、表的连接，通过其各自的属性设置；

2） 设置Connection的连接属性时，“提供者”选择“Microsoft OLE DB for ODBC Provider”。


实验5

实验5.6

利用Data Environment——StManaDE和RecordSet对象完善窗体frmStInfo中窗体、学生基本信息的初始化：

1） 民族、所在学院数据从相应的代码表中读取；

2） 专业根据学院值的不同，从Tbl_Dep表中有选择地读取；

3） 窗体第一次打开时，若Tbl_student表中有记录，则将第一条记录信息显示，否则显示为空白记录。

【相关知识及提示】 本实验练习利用Data Environment和RecordSet对象操作数据库，练习SQL的使用，并练习利用数据库中数据初始化窗体。重要知识提示：

1） 使用Data Environment操作数据库，在使用前要为Data Environment——StManaDE创建实例变量，例如：Dim MisDE As New StManaDE，该实例变量通常定义为模块级的局部变量；

2） 本实验中表的创建未做规范化，在Tbl_Dep表中，学院存在着重复值，初始化“学院”下拉列表框时需要剔除重复项，利用SQL语句从表中选择记录可以方便地实现该要求：

SELECT DISTINCT S_Department FROM Tbl_student ;

3） “专业”下拉列表值根据“学院”值来确定，在初始化“专业”下拉列表框时，构造查询所用的SQL语句应使用带条件的选择语句：

" SELECT DISTINCT s_specialty FROM Tbl_student " _

& " WHERE S_Department = ‘" & cmbDPM.Text & "’ " ;

4） 将上述SQL语句作为RecordSet对象打开时的数据源；

5） Tbl_student表中是否有记录，可利用打开表的RecordSet对象的RecordCount属性检测，或是利用RecordSet对象的EOF、BOF属性检测。

【实验结果】

1） 窗体打开时，“民族”、“所在学院”下拉列表框中已赋好值，且与对应表中记录值相同；

2） 将Tbl_Dep表中学院值变更，如将“经管”改为“经济管理”，重新启动窗体时，“所在学院”下拉列表框中显示值为“经济管理”（不能修改程序）；

3） 窗体打开时，自动显示第一条记录，如果表中无记录，则显示为空白。


实验5

实验5.7

窗体frmStInfo中记录的添加与保存操作：

1） 单击“保存”钮后，在所有检验完成且数据合法、完整的情况下，将数据写入Tbl_student表中；否则，给出错误提示信息；

2） 单击“添加”钮后，若当前记录修改过，则先执行保存操作，保存成功后，在界面上添加一条空白记录；若保存不成功，则给出错误提示信息，要求用户重新修改当前记录，而不能进入新记录的添加；若当前记录未做过修改，则直接在界面上添加空白记录。

【相关知识及提示】 本实验练习利用Data Environment和RecordSet对象操作数据库，并练习往数据库中写入记录或新添加记录。重要知识提示：

1） 新添加记录还是修改记录，可以在保存时通过查询Tbl_student表中是否有相同关键字的记录存在，如果有，则认为是修改记录，直接用界面输入记录值替换表中已有相同关键字的记录；否则认为是新添加记录，在表中添加一条空白记录，并用界面输入记录值替换该空白记录；

2） 通过设置标识变量来记录执行的是新添加记录还是修改记录会更完善些，但同样在写入表中时要查询是否已有相同关键字的记录，以避免出现表中不同记录具有相同关键字值；

3） 添加新记录功能，只是在保存成功当前记录后，将界面清空，不能执行RecordSet对象的AddNew方法，否则可能会引起一些错误操作；

4） 数据写入表中使用RecordSet对象的Fields属性，以便于数据的转换和控制；

5） 这两项功能都执行同样的保存操作，因此“保存”功能应写成单独的函数，以便于代码的重用，提高代码的可维护性。

【实验结果】

1） 姓名空着不填，单击“保存”按钮后，系统弹出“姓名不能为空”提示信息对话框，并自动将光标定位在“姓名”输入域；

2） 所有输入域都合法输入后，单击“保存”按钮，可以成功将当前窗体上记录写入Tbl_student数据表；

3） 姓名空着不填，单击“添加”按钮后，系统弹出“姓名不能为空”提示信息对话框，窗体上仍然显示刚才显示的记录内容，并自动将光标定位在“姓名”输入域；

4） 所有输入域都合法输入后，单击“添加”按钮时，可以成功将当前窗体上记录写入Tbl_student数据表，并在窗体上显示空白记录。


实验5

实验5.8

窗体frmStInfo中记录的删除操作：

1） 将指定关键字的记录删除（通常为当前界面上显示的记录），并将下一条记录在界面上显示；

2） 如果已经到文件尾，则将上一条记录在界面上显示；

3） 如果表中已经没有记录，则显示一条空白记录；

4） 执行删除操作前要先给出提示信息，询问用户是否确实要删除指定记录。

【相关知识及提示】 本实验练习利用Data Environment和RecordSet对象操作数据库，并练习记录的删除和记录指针的移动。重要知识提示：

1） 执行删除操作前要先给出提示信息，询问用户是否确实要删除指定记录，以避免用户的误操作导致数据的丢失；

2） 删除操作是按照界面上的关键字值在Tbl_student表中查找是否有相同关键字的记录存在，如果有，则将此记录删除；否则给出“要删除的记录不存在！”的提示信息；

3） 在删除操作后一定要以下一条或上一条记录重新刷新界面，以避免用户误解为记录未被成功删除。在显示新记录前，要检测下一条记录或上一条记录是否存在，以避免因读取到文件尾或文件头产生数据存取错误。

【实验结果】

1） 单击“删除”按钮，系统弹出“确认要删除该记录？（Y/N）”提示信息对话框，如果用户选择“否”，则窗体上仍然显示刚才显示的记录内容；如果用户选择“是”，则将窗体上显示的记录删除，并显示下一条（或上一条）记录的值；

2） 删除最后一条记录时，系统也不会报错。


实验5

实验5.9

窗体frmStInfo中记录的重置操作：如果修改前是空白记录，则重置后显示为空白记录，否则重置后显示修改前的值的状态。

【相关知识及提示】 本实验练习利用Data Environment和RecordSet对象操作数据库，并练习记录修改前状态的恢复。重要知识提示：

1） 可记录下修改前记录的关键字值，需要执行重置操作时，按此关键字值直接从Tbl_student表中读取；如果修改前是空白记录，关键字值为空，则可直接将界面清空；

2） 重置操作完成后，记录修改标识位也要设置为“未修改”状态。

【实验结果】

1） 单击“添加”按钮，并将新添的空白记录修改部分输入域，如填入姓名值、所在学院、专业、入学时间等值，单击“重置”按钮后，界面应显示为空白记录，且刚才输入的记录信息未被保存到数据表中；

2） 输入一条记录内容，成功保存后，修改部分输入域，如修改姓名值、所在学院、等值，单击“重置”按钮后，界面应显示为修改前的值，即单击“保存”按钮时的值；

3） 单击“添加”按钮，并将新添的空白记录修改部分输入域，如填入姓名值、所在学院、专业、入学时间等值，单击窗体右上角的关闭按钮时，应弹出“数据尚未保存，确认要退出？”提示信息对话框；

4） 单击“添加”按钮，并将新添的空白记录修改部分输入域，如填入姓名值、所在学院、专业、入学时间等值，单击“重置”按钮后，单击窗体右上角的关闭按钮时，直接关闭窗体而不出现保存提示对话框。


实验5

实验5.10

创建用户管理窗体frmUser如图5-2所示：

1） 其中“用户密码”、“密码确认”显示方式设置为只能显示“*”号；

2） 单击“确认”钮后，首先检查“用户密码”与“密码确认”是否一致，若不一致则给予错误提示，要求用户重新输入；若一致，则将“用户密码”按实验4.7的加密算法加密后，将用户信息写入Tbl_User表；

3） 用户登录时，先从此表查找用户帐号及密码都正确后才允许进入系统。

图5-2 用户管理

【相关知识及提示】 本实验练习利用Data Environment存取数据表。重要知识点提示：

1） 显示方式设置为只能显示“*”号，通过TextBox的PasswordChar属性设置；

2） 加密的实现参照实验4.7；

3） 登录时验证密码前，须先将登录密码加密后，再与表中记录值对照；

4） 密码通常区分大小写，即字母“A”和“a”视为不同的值。


实验5

实验5。11

窗体frmStInfo中记录的筛选操作，创建如图5-3所示记录筛选窗体frmSelect实现：

1） 记录的组合查询功能：用户可以从“选择筛选条件”区自由组合查询条件，从Tbl_student表中筛选满足特定条件的记录集；

2） 特定记录的查找：用户可以按Tbl_student表的关键字或主要属性字段来精确或模糊地查找特定记录（集）。此处的精确查找是指给出字段的准确值进行查找，如，查找姓名为“陈学东”的记录，模糊查找是指查找字段值的一部分内容满足条件的记录，如，查找身份证号前六位是“110108”的记录；

3） 在窗体frmStInfo中单击“筛选”按钮后，打开此窗体frmSelect，按指定条件从表中筛选满足条件的记录集，并可从中选择指定记录，在单击“选择”按钮后将选定记录在frmStInfo窗体中显示，以便于用户编辑。

【选做】 在“选择查询项目”区允许用户对查询显示的项目进行特定设置，如，只显示“2001年入学的学生的姓名、学院、专业”信息。

图5-3 记录的筛选

【相关知识及提示】 本实验练习利用Data Environment和RecordSet对象、Data Grid控件操作数据库，练习复杂SQL语句的构造和使用，并练习按指定条件筛选及显示记录。重要知识点提示：

1） 经济、管理类应用系统中对查询的使用的要求较为普遍，而且比较复杂，往往要求用户可以相对自由地定义查询条件及方式，利用SQL语句动态地组合记录的读取条件方能满足这种要求；

2） SQL语句中选择字段、限定条件的构造，使用字符串变量实现；

3） 在SQL语句中指定字段的取值范围值时，如果是日期型、字符型数据，一定要加定界符，例如实验5.7中的提示2）中SQL语句的构造。

【实验结果】

1） 将“学院”、“入学年份”前的复选框选中，在学院后的下拉列表框中选择“经管”，在入学所份后的下拉列表框中选择“2001”，单击“查询”按钮后，窗体右方的网格中显示所有的“2001年入学的经管学院学生” 的记录，且只显示“2001年入学的经管学院学生”的记录；

2） 将“身份证号”前的复选框选中，在身份证号后的文本框中输入“012440198201032031”，单击“查询”按钮后，窗体右方的网格中只显示“身份证号为012440198201032031”的学生的记录；

3） 将“姓名”前的复选框选中，在姓名后的文本框中输入“李*”，单击“查询”按钮后，窗体右方的网格中显示“所有的姓名第一个字为李”的学生的记录。


实验5

实验5.12

利用窗体frmStScore（参见下图）向Tbl_Score中添加学生VB成绩，其中要求：

1） 学生记录从Tbl_student表中读取，每次单击“上一条”、“下一条”钮时，将学生成绩记录保存，并自动将新记录的学生姓名及成绩显示在窗体界面；

2） 姓名、总评成绩设置为只读，允许用户输入、修改平时成绩和考试成绩；

3） 对输入成绩值进行合法性检查，如果输入数据是非数值型数据，则显示错误提示信息并将光标定位于该输入域要求重新输入；

4） 平时成绩和考试成绩输入完后，自动计算出总评成绩，并在界面上显示，计算公式同实验3.6。

【相关知识及提示】本实验练习复杂SQL语句的构造和使用，练习如何使用SQL语句从两个数据表中读取记录。重要知识点提示：

1） 需要设置两个RecordSet对象（可以利用Ado Data控件，也可以利用Data Environment的Command对象创建），其中一个用于读取数据，另一个用于Tbl_Score表写入数据；

2） Tbl_Score表中学生的记录，可在frmScore窗体中的“成绩名”下拉列表框值变更时检测Tbl_Score表中是否有学生该门课程的成绩，如果没有，则自动往里追加；

3） 由于Tbl_Score表中只有学生身份证号（s_id）、课程名（ProjectName）和学生的成绩，学生姓名需要从Tbl_student表中读取，因此要建立这两表间的关联关系，连接的条件是两张表的学生身份证号相同，且Tbl_Score表中的课程名为指定课程名（如，VB），表之间的连接条件为：

Tbl_student.s_id = Tbl_Score.s_id

4） 学生身份证号、姓名来自Tbl_student表，课程名和三个成绩来自Tbl_Score表，在构造SQL语句时，要指明各字段所属表，方式是在字段名前加小数点“.”再加相应表名，即：

SELECT Tbl_Score.s_id, Tbl_Score.proj_name, Tbl_Score.s_DailyScore,

Tbl_Score.s_ExamScore, Tbl_Score.s_SynScore, Tbl_student.s_name,

Tbl_student.s_id

5） 若从上面两表构造的查询中读数，由于字段名s_id在两个表中都有，使用中必须加表名前缀，若字段名唯一，则可不必加表名前缀；

6） 用于Tbl_Score表写入数据的RecordSet对象，只连接Tbl_Score表，以便于控制。

【实验结果】

1） 单击“上一条”、“下一条”按钮时，自动将“上一条”、“下一条”记录的学生姓名及成绩显示在窗体界面；

2） 将平时成绩和考试成绩改动，光标离开被改动的输入域后，总评成绩可以自动重新计算并显示；

3） 将平时成绩改为“92A”后，单击“TAB”键，系统弹出“输入数据类型不符，请重新输入！”对话框，并将光标仍停留在平时成绩输入域；

4） 将窗体中显示记录的平时成绩改为92，单击“上一条”按钮，然后再单击“下一条”按钮，此时界面显示平时成绩应为92，且总评成绩也显示为修改后算出的总评成绩。


利用窗体frmStScore及实验5

实验5.13

利用窗体frmStScore及实验5.12的方法输入学生的C++、管理信息系统成绩，并设计如图5-4所示界面，统计并浏览显示每个学生综合成绩的最低分、最高分、平均分及总分。

图5-4 学生成绩统计

【相关知识及提示】本实验练习SQL语句使用，练习如何使用SQL语句对数据进行简单统计。重要知识点提示：

1） 学生成绩的最低分、最高分、平均分及总分，可以直接利用SQL语句中的合计函数对记录进行操作。为了统计每个学生综合成绩的最低分等，要对Tbl_score表内学生的记录按身份证号或姓名进行分组，由于此实验中要求显示学生姓名，可以将Tbl_score表与Tbl_student表联接后按学生姓名分组。分组使用Group By子句，即：

GROUP BY Tbl_student.s_name

2） 记录分组后，就可以利用SQL内置函数Min()、Max()、Avg()和Sum()等，对各组中的记录的最小值、最大值、平均值及合计值等进行计算，并直接将计算结果作为输出字段用于显示或在程序代码中访问；

3） 使用了函数或运算表达式的输出结果字段，需要为其定义一别名，以便在代码中访问，别名的定义使用AS子句，如：

Min(Tbl_Score.s_SynScore) AS 最低分

4） 如果希望显示记录按某个特定的值排序，可通过Order By子句实现，如，将显示结果按学生的总分排序：

ORDER BY Sum(Tbl_Score.s_SynScore)

5） 因此，上述成绩统计所使用的数据源可通过如下SQL语句设置：

SELECT Tbl_student.s_name AS 姓名, Min(Tbl_Score.s_SynScore)

AS 最低分, Max(Tbl_Score.s_SynScore) AS 最高分,

Avg(Tbl_Score.s_SynScore) AS 平均分,

Sum(Tbl_Score.s_SynScore) AS 总分

FROM Tbl_Score, Tbl_student

WHERE Tbl_Score.s_id = Tbl_student.s_id

GROUP BY Tbl_student.s_name

ORDER BY Sum(Tbl_Score.s_SynScore)

【实验结果】 执行结果如图5-4所示。


实验5

实验5.1 4

创建“课程代码表”（Tbl_Project）和“学生选课表”（Tbl_StProj），表结构参考表5-6，表5-7：

表5-6 课程代码表（Tbl_Project）结构

字段名 | 数据类型 | 含义
ProjID | String*10 | 课程编号
ProjName | String*10 | 课程名
TeachHour | Integer | 课时数
ExpHour | Integer | 机时数
ProjType | Integer | 课程性质

表5-7 学生选课表（Tbl_StProj）结构

字段名 | 数据类型 | 含义
s_id | String*18 | 身份证号
ProjID | String*10 | 课程编号
S_StuTerm | String*3 | 学习时间
s_DailyScore | Single | 平时成绩
s_ExamScore | Single | 考试成绩
s_SynScore | Single | 总评成绩

重新优化实验2.14和实验5.12、实验5.13，为系统设计“学生选课”窗体，将其追加至“学生选课表（Tbl_StProj）”，实验5.12、实验5.13的操作改为修改Tbl_StProj表。


实验5

实验5.1 5

参照实验5.11，创建学生成绩统计查询窗体，实现按学生学号、身份证号、姓名、课程名、成绩范围、学习时间等方式筛选学生成绩信息，将以二维网格形式显示。


实验目的

本实验主要是为了熟练应用Visual Basic程序设计开发工具中的公用对话框、状态栏、工具栏等创建Windows标准界面风格的用户界面，并能利用控件数组、菜单数组等简化程序设计。通过实验学生应该：

1． 熟练运用公用对话框完成应用系统中的一些定制功能；

2． 熟练掌握控件数组的使用：特别是Index参数的使用；

3． 掌握利用菜单控件数组动态调整菜单项的设置；

4． 熟练运用状态栏、工具栏等控件优化界面的设置；

5． 了解进度指示器、滚动条、UpDown控件、SSTab控件等的使用，能利用其优化系统界面；

6． 运用鼠标事件绘制简单图形；

7． 熟练运用键盘响应事件及相关参数完成对数据有效性输入的检验及控制。


实验6

实验6.1

在窗体frmStInfo的“打开”菜单，利用公用对话框选择要打开的图片文件（如图6-1所示），并将选中的图片文件在PictureBox（参见下图）中显示：

1） 选择要打开的文件的缺省路径为当前系统所在文件夹；

2） 可以打开的文件类型列表可以选择“位图文件（*.bmp）”、“JPEG文件（*.jpeg、*.jpg、*.jpe）”、“GIF文件（*.gif）”几种类型。

图6-1 打开文件对话框

【相关知识及提示】 本实验练习使用公用对话框完成文件的打开操作：

1） 公用对话框并不是Visual Basic的缺省控件，要使用它，须先将其添加到工具箱中，方法是：在“工具箱”窗口中单击鼠标右键，选择“部件”（或“工程”菜单下的“部件”选项），并在弹出的“部件”对话框中将“Microsoft Common Dialog Control6.0”选中；

2） 要打开的文件的缺省路径要通过公用对话框控件的InitDir属性设置；

3） 当前系统所在路径用App.Path获取；

4） 可以打开的文件类型利用公用对话框控件的Filter属性设置。


实验6

实验6.2

在窗体frmStInfo中，在PictureBox的快捷菜单中（如下图所示），选择“颜色”菜单项，利用公用对话框打开Windows颜色设置对话框，用户选择一种颜色后，将其作为PictureBox的背景色。


实验6

实验 6.3

在窗体frmStInfo中，在PictureBox的快捷菜单中（如下图所示），选择“字体”菜单项，利用公用对话框打开Windows字体设置对话框，将用户设置字体作为“姓名”输入域的显示字体。

【相关知识及提示】 上述实验练习利用公用对话框调用Windows系统的标准颜色设置、字体设置等功能，创建具有统一风格的用户界面。


实验6

实验6.4

将窗体 frmStInfo中的“性别”单选钮定义为控件数组，并为窗体添加事件代码：当选中“男”选项时，将PictureBox的背景色设置为绿色，当选中“女”选项时，将PictureBox的背景色设置为红色。并对学生基本信息初始化和数据写入Tbl_student表、从Tbl_student表读出数据显示于界面上的代码作相应的修改。

【相关知识及提示】 本实验练习控件数组的定义和引用。

1） 通过为控件的Index属性赋值0，可直接将控件定义为控件数组。若将几个控件定义为一个控件数组，这几个控件名必须相同，且Index属性不能为空；

2） 定义为控件数组的控件（即Index属性不为空），引用时不能只用控件名引用，必须加带下标的控件名，如optSex(0)，否则系统将会提示对象未定义；

3） 由于具有相同的对象名，定义为控件数组的所有控件激活相同的事件驱动代码，通过事件驱动代码中的Index参数区分特定的控件，如下例中的用法：

Private Sub OptSex_Click(Index As Integer)

Select Case Index

Case 0

MsgBox "您选中'男性'选项！"

Case 1

MsgBox "您选中'女性'选项！"

End Select

End Sub


实验6

实验6.5

在窗体frmStInfo的“文件”菜单下，利用菜单控件数组动态显示最近打开的图片文件名（最多显示4个），如图6-2所示：

图6-2 动态菜单的设置


实验6

实验6.6

为窗体frmStInfo添加工具栏，将“打开”、“添加”、“保存”、“删除”、“筛选”、“帮助”、“关闭”几个功能以图标形式显示在此工具栏，如图6-3所示，并将其与窗体代码中的相应功能链接，实现通过工具栏上按钮快速启动相应功能。

图6-3 学生基本信息维护

【相关知识及提示】 本实验练习利用工具栏和ImageList控件为窗体创建工具栏。

1） 工具栏、ImageList、状态栏、进度条等不是Visual Basic工具箱缺省控件，必须从“部件”对话框中选择“Microsoft Windows Common Control 6.0”，将上述控件加到工具箱；

2） 工具栏须和ImageList控件同时使用，才能创建窗体工具栏。


实验6

实验6.7

为窗体frmStInfo添加状态栏，并设置4个显示窗格，分别显示“当前窗体功能说明（输入学生基本信息）”、“大小写控制键（CAPS键）状态”、“数码控制键（NUM键）状态”和“当前系统时间”信息，如图6-3所示。

图6-3 学生基本信息维护

【相关知识及提示】 本实验练习利用状态栏的使用。

1） 只有状态栏的Style属性设置为sbrNormal，才能进行多窗格的设置，否则只能在单一窗格显示信息；

2） 状态栏各窗格信息的动态显示，通过状态栏上Panels集合元素的Text属性值设置，例如对状态栏第一个窗格显示内容的调整：

StatusBar1.Panels(1).Text = "只能输入15或18位数字！"


实验6

实验6.8

利用SSTab控件创建分项维护的“学生基本信息维护”窗体frmStInfoNew，设置三个选项卡：

1） “基本信息”：用于显示/编辑“学号”、“姓名”等项，如图6-4所示；

2） “学习资料”：用于显示/编辑“所在学院”、“专业”、“入学时间”等项，如图6-5所示；

3） “备注”：用于显示/编辑“备注”及其他信息。

图6-4 学生基本信息维护——“基本信息”选项卡

图6-5 学生基本信息维护——“学习资料”选项卡

【相关知识及提示】 本实验练习利用SSTab控件分类管理界面维护内容。

1） SSTab控件不是Visual Basic的缺省控件，须先将其添加到工具箱中，方法是：在“工具箱”窗口中单击鼠标右键，选择“部件”（或“工程”菜单下的“部件”选项），并在弹出的“部件”对话框中将“Microsoft Tabbed Dialog Control6.0”选中；

2） Tabs属性用于设置选项卡的数目；

3） SSTab控件中各对象数据的读取方式与窗体界面中读取方式一样，如：

If TxtName.Text = “” Then


实验6

实验6.9

利用UpDown控件替换窗体frmStInfoNew中“入学时间”各输入域的输入方式，如图6-5所示。其中：

图6-5 学生基本信息维护——“学习资料”选项卡

1） 年、月、日文本框值与相应的UpDown控件保持同步；

2） 初始值根据当前系统日期确定：日期设置为“9月1日”，如果当前系统日期未到9月，则年份设置为上一年，否则设置为当年；

3） 月份取值范围为1到12，日期取值范围根据年份与月份计算可取的最大值，如：1月取值范围为1到31，润年2月取值范围为1到29，以此类推。

【相关知识及提示】 本实验练习利用UpDown控件输入、调整数值型数据。UpDown控件不是Visual Basic的缺省控件，在“部件”对话框中将“Microsoft Windows Common Control –2 6.0”选中。


实验6

实验6.10

利用键盘事件对窗体frmStInfo中身份证号的输入控制：

1） 用户只有输入0到9的数字和“回格键（BackSpace）”；

2） 如果用户输入非法字符，系统自动不接收，即：用户输入“110108”后误敲字符“a”，系统不接收该字符“a”，输入域中一直显示“110108”，直到用户新输入合法字符，如图6-6（a）、6-6（b）所示。其中，图6-6（a）为用户顺序在键盘上敲击“1”、“1”、“0”、“1”、“0”、“8”、“a”、“F”、“*”、“,”时的显示结果；图6-6（b）为用户继续在键盘上敲击“1”、“(” 、“9”的显示结果。

图6-6（a） 输入控制 图6-6（b） 输入控制

【相关知识及提示】 本实验练习利用键盘事件控制用户输入。

1） 利用键盘的KeyPress事件控制，通过事件参数KeyAscii获取用户输入的键。注意：此参数是用户敲击键的ASCII码值；

2） 对于非法字符，可通过将参数KeyAscii值赋0，实现自动将其转换为空字符；

3） “回格键（BackSpace）”也是ASCII码键，须允许该键值输入，以保证用户可以在输入过程中随时修改错误；

4） 测试一下，在该输入域中，能否输入左右箭头（ß、à）和Delete等键。


实验6

实验6.11

使用实验6.10的方法对窗体frmLogin中“帐号”和“密码”进行输入控制，限制只能输入26个字母和10个数字。


实验6

实验6.12

在窗体frmStInfo中利用键盘事件实现：

1） 当光标停留在“姓名”输入域时，按下“F1”键，系统自动打开帮助窗体frmAbout；

2） 当光标停留在“姓名”输入域时，同时按下“CTRL”和“S”键，系统调用学生基本信息“保存”功能。

【相关知识及提示】 本实验练习利用键盘事件执行特殊操作。

1） 利用键盘KeyUp事件完成。注意：如果使用KeyDown事件，那么当用户同时按两个键时，如按下“CTRL”和“S”键，会由于用户动作的时间差造成两键不能被同时识别；

2） “Shift”、“Ctrl”、“Alt”三个键是否按下由事件的Shift参数检测，其他键由KeyCode参数检测。键盘上的上下档键具有相同的KeyCode值，即“&”与“7”，“A”与“a”的KeyCode键值相同；

3） 键盘事件是特定对象的事件，所以实现了上述功能需求代码后，如果光标停留在“姓名”输入域之外时，不会激活上述功能。


实验6

实验 6.13

利用鼠标事件实现实验2.11的功能，要求弹出式菜单在鼠标点击的位置显示，如图2-7所示。

图2-7 PicPhoto图片框的快捷菜单

【相关知识及提示】 本实验练习鼠标事件及其参数的使用。

1） 鼠标左右键的区分通过鼠标事件的Button参数设置；

2） 鼠标事件的X，Y参数传递的是鼠标在当前对象中的相对位置，而弹出式菜单的显示方法PopupMenu的显示位置参数是相对于窗体的坐标位置，需要通过鼠标在对象中的相对位置和对象在窗体中的位置计算，如：

Me.PopupMenu mnuPopup, , X + PicPhoto.Left + Frame1.Left, _

Y + PicPhoto.Top + Frame1.Top


实验6

实验6.14

在窗体frmSelect中，在单击“查询”钮开始查询前，将鼠标指针变为沙漏标，然后在查询结束时将沙漏标恢复为缺省形状。

【相关知识及提示】 本实验练习鼠标指针的定义及在运算时间较长的程序执行过程中以特殊形状的鼠标指针形状提示用户。


实验6

实验6.15

利用控件数组和滚动条（HScrollBar、VscrollBar）构建二维表显示数据，完成实验5.11所述功能（参见图5-3）。

图5-3

【相关知识及提示】 本实验练习控件数组和滚动条的使用。

1） 二维表中显示字段定义为控件数组，具体显示记录数根据查询结果动态创建或删除，使用Load和UnLoad方法；

2） 滚动条的显示长度、最大值、最大最小增时值，根据窗体大小的变更而调整。


实验6

实验6.16

利用控件数组设计具有加、减、乘、除运算功能的简单计算器，如图6-6所示，并为其编写能够完成相应运算功能的程序代码。

图6-6 简单计算器

【相关知识及提示】 本实验练习控件数组的使用。

1） 可以将数字键按其数值的顺序定义为一个控件数组的相应元素，以便于代码的识别和引用；

2） 运算符定义为另一个控件数组；

3） 注意小数点的输入：小数点在首位时，显示时前面要加0，即显示为“0.3”而不是“.3”；小数点在数值中不能重复出现，即要避免出现“0.3.3”的非法数值；

4） 区分负号与减号：通常前面已有运算符或前面既无运算符也无数值时，紧接着输入的“-”号视作负号，否则视作减号。


实验6

实验6.17

利用日历控件（MonthView）为学生管理系统创建“个人事务”窗体（如图6-6所示）及相应的数据表（Tbl_PrivPlan）：

1） 选中特定日期后，可以在“活动备忘”域输入该日活动安排，并将其存入Tbl_PrivPlan表；

2） 下次选中该日期后，可以从Tbl_PrivPlan表读取个人事务安排，在“活动备忘”域显示。

图6-6 个人事务安排

【相关知识及提示】 本实验练习利用日历控件（MonthView）快速创建特定功能的应用，该控件也在 “Microsoft Windows Common Control –2 6.0”选项的部件中。


实验6

实验6.18

利用鼠标事件模拟具有如图6-7所示效果的画笔：

1） 画笔线条由小圆圈组成；

2） 当鼠标左键按下时开始画线，将鼠标移动的轨迹边成曲线；

3） 当鼠标左键松开时结束画线。

图6-7 利用鼠标事件模拟特殊画笔

【相关知识及提示】 本实验练习鼠标事件的使用。

1） 利用一模块级局部变量记录鼠标按下或松开状态；

2） 为避免本次鼠标按下与上次鼠标松开的两点连成线段，需要在每次鼠标按下时重置画线的起点，方法是通过对象的CurrentX、CurrentY属性设置，即：

Me.CurrentX = x Me.CurrentY = y

3） 小圆圈型画笔线条，是在移动过程中的每一坐标点画一小圆（本例中使用的圆半径为50）。


实验目的

本实验主要是为了进一步熟悉Visual Basic其他一些控件的使用，掌握利用MDI窗体将应用系统中各窗体、模块、设计器、用户控件等集成，熟悉运用Visual Basic对文本文件的操作和绘制常用几何图形。通过对应用系统中各种类型错误的调试，掌握应用系统调试的方法和在应用系统中利用错误捕获方法和错误规避技巧完善系统，提高系统运行的可靠性。通过实验学生应该：

1． 熟练掌握MDI窗体的主要属性、方法和事件的用法及其与普通窗体的区别；

2． 能利用MDI窗体完成应用系统多重窗体、子系统的集成；

3． 掌握文件系统控件的使用；

4． 掌握文件的打开、关闭和读写操作；

5． 掌握图形控件和图形方法；

6． 掌握常用几何图形绘制；

7． 熟练掌握VB程序调试的手段及方法；

8． 熟练掌握及在应用系统中应用错误捕获方法及错误规避技巧；

9． 能够自己创建用户ActiveX控件。


实验内容及要求

本实验通过几个实验案例的练习，完成将前面各实验分步设计的应用系统模块集成在统一的MDI窗体中，通过MDI主窗体对各子系统、功能模块调用。利用文件系统控件创建用户自定义的磁盘文件查找界面，并能将数据库中某张表的记录内容通过磁盘文件进行导入和导出。对应用系统中的统计结果等运用图形控件和图形方法绘制成直方图、曲线图等图表形式。运用Visual Basic系统调试工具、错误捕获方法和错误规避技巧完善系统，提高系统运行的可靠性。

实验过程中重点完成以下工作：

1． 利用MDI窗体将前面各实验分步设计的应用系统模块集成在统一的MDI窗体中，通过MDI主窗体对各子系统、功能模块调用；

2． 利用文件系统控件为应用程序创建磁盘文件查找界面，通过分级查找工具快速查找某一文件；

3． 将学生基本信息通过文件操作导出到文本文件，从文本文件向学生基本信息表中导入数据；

4． 运用图形控件和图形方法绘制学生成绩统计直方图；

5． 运用图形控件和图形方法绘制常用几何图形；

6． 运用Visual Basic系统调试工具、错误捕获方法和错误规避技巧调试集成的应用系统，将在应用程序中加入必要的错误捕获代码，降低意外错误的发生；

7． 创建用户自定义的ActiveX控件设计特定格式的时钟，并将其用于应用系统中。


实验7

实验7.1

创建如图7-1所示MDI窗体，命名为MDIStManage，作为“学生信息管理系统”主界面，并为其创建菜单：

主菜单： 代码维护 学生信息 在线考试 窗口 帮助

子菜单： 学院专业 信息输入 在线考试 层叠 关于…

课程代码 信息查询 ———— 水平平铺

民族代码 ———— 成绩录入 垂直平铺

操 作 员 学生选课 成绩统计

————

个人事务

————

退出系统

图7-1 学生信息管理系统主界面

【相关知识及提示】 本实验练习MDI窗体的定义和使用，以及MDI窗体菜单的创建。

1） 一个应用系统中只能定义一个MDI窗体；

2） MDI窗体的菜单用于打开不同的子系统或功能模块，在打开子窗体，将被子窗体的菜单所代替；如果子窗体没有菜单，则MDI窗体仍然显示自己的菜单。


实验7

实验7.2

为MDIStManage窗体各菜单项编写代码调用相应的子系统或功能模块：

代码维护子系统：

1） “学院专业”用于打开frmSchool窗体，进行学院专业代码的维护；

2） “课程代码”用于打开frmProj窗体，进行课程代码的维护；

3） “民族代码”用于打开frmNation窗体，进行民族代码的维护；

4） “操 作 员”用于打开frmUser窗体，进行用户帐号、用户口令和用户权限的设置与维护；

5） “个人事务”用于打开frmPerson窗体，用于管理个人备忘录；

6） “退出系统”用于关闭所有打开文件，包括数据库文件，退出“学生信息管理系统”；

学生信息管理子系统：

1） “信息输入”用于打开frmStInfo窗体，进行学生基本信息的维护；

2） “信息查询”用于打开frmSelect窗体，按用户组合条件或模糊查询条件筛选学生基本信息记录；

选课及在线考试子系统：

1） “学生选课”用于打开frmSelProj窗体，进行学生选课；

2） “在线考试”用于打开frmOnTest窗体，学生参加计算机答题方式的考试；

学生成绩管理子系统：

1） “成绩录入”用于打开frmScore窗体，录入学生平时成绩及考试成绩；

2） “成绩统计”用于打开frmScoreStatic窗体，对学生成绩进行统计分析；

其他辅助功能：

1） “层叠”将MDI窗体中的各子窗体以层叠方式排列；

2） “水平平铺”将MDI窗体中的各子窗体以水平平铺方式排列；

3） “垂直平铺”将MDI窗体中的各子窗体以垂直平铺方式排列；

4） “关于…”打开frmAbout对话框，显示系统版本版权信息及系统的简单说明。

【相关知识及提示】 本实验练习MDI窗体的使用，并利用MDI窗体将各功能模块、子系统集成为一个应用系统。

1） 如果要将普通窗体或对话框在MDI窗体中打开，需要将其MDIChild属性设置为True（缺省值为Flase）；

2） 窗体的“层叠”、“水平平铺”、“垂直平铺”等排列方式，利用MDI窗体的Arrange方法加相应参数实现。


实验7

实验7.3

将窗体frmLogin设置为启动窗体。如果用户登录不成功（用户帐号或用户密码不正确），则不允许进入该应用系统；如果用户登录成功，则根据用户权限动态调整MDI窗体的菜单。例如，用户“ChenXD”以学生身份登录，只具有“在线考试”子系统的使用权限，则MDI窗体启动时只显示该菜单项和辅助功能项，而将其他子系统菜单隐藏，如图7-2所示。

图7-2 学生信息管理系统主界面——部分使用权限

【相关知识及提示】 本实验练习菜单的动态调整及利用用户权限限制用户允许操作的功能。

1） 作为完善的系统，在每个子系统或大的功能模块调用时都应该验证用户是否有权限使用相应功能，因此用户帐号及权限在登录后适宜定义为全局变量；

2） 菜单的隐藏，利用菜单的Visible属性设置。


实验7

实验7.4

创建窗体frmOpen用于用户从不同的磁盘目录下选择文件（如图7-3所示），为窗体frmStInfo的“打开”菜单（参考实验2.10、实验2.11）编写代码，实现打开指定的图片文件：

1） 使用驱动器列表控件（DriverListBox）、文件夹列表控件（DirListBox）和文件列表控件（FileListBox）；

2） 将用户选定的文件作为PictureBox——PicPhoto对象的图片显示。

图7-3 文件打开窗体

【相关知识及提示】 本实验练习驱动器列表控件（DriverListBox）、文件夹列表控件（DirListBox）和文件列表控件（FileListBox）的使用，及如何将图片文件调入内存。

1） 驱动器列表值发生变更时，要同步调整文件夹列表的路径值（Path属性）；

2） 文件夹列表值发生变更时，要同步调整文件列表的路径值（Path属性）；

3） 文件夹列表中显示文件的类型，由文件夹列表的Pattern属性用“打开类型”下拉列表框用户选择类型值设置。


实验7

实验7.5

将民族Tbl_Nation表中记录，写入一个磁盘文件StScore.txt，要求：

1） 将其创建为一个公用函数，如果写成功返回值1，否则返回值0；

2） 存放的文件名以“保存为…”公用对话框设置；

3） 数据以等长格式（即同一字段具有相同的存储长度）、不加分隔符方式存放。

【相关知识及提示】 本实验练习将数据写入磁盘文件，以及公用对话框的使用。

1） 公用函数通常存放于Visual Basic模块文件（.Bas）中；

2） 要打开的数据源文件的SQL语句和将要写入的磁盘文件的文件名，在公用函数中作为参数出现，以提高函数的可重用性；

3） 数据写入完毕后，要关闭文件。


实验7

实验7.6

磁盘文件StScore.txt中以等长格式（即同一字段具有相同的存储长度）存放着“民族”代码数据，编写程序将其读入民族Tbl_Nation表中，要求：

1） 将其创建为一个公用函数，如果写成功返回值1，否则返回值0；

2） 读取的文件名使用“打开”公用对话框选择。


实验7

实验7.7

创建如图7-4所示窗体：

1） 利用一AdoData控件实现与数据表Tbl_Score的连接，在表记录指针移动时自动将当前学生的身份证号显示于AdoData控件上（即，图中的“012440030000000000”），同时在图形显示域上方显示当前记录的课程名（即，图中的“VB”）；

2） 用Line方法绘制坐标系，并将纵轴由50到100平均分割成5份；

3） 横轴显示“平时”、“考试”、“总评”三项成绩，以不同填充样式的直方图显示。

图7-4 学生成绩直方图

【相关知识及提示】 本实验练习使用图形控件和图形方法绘制坐标及规则图形，并将其用于描述特定的数据。

1） 直方图中三种样式的数据描述图形，可以预先在窗体设计时定义。也可将其定义为控件数组，在程序运行中动态创建并对其样式进行设置；

2） 坐标系的定义，使用对象的Scale方法；

3） 坐标轴及坐标轴上的坐标刻度使用对象的Line方法绘制；

4） 使用Scale方法后，Line方法中使用的坐标值要随之调整为相对于新定义坐标原点的坐标值，如：

坐标系定义为：Scale (-100, 100) - (100, -100)

横轴画线为：Line (-70, -70) - (80, -70)


实验7

实验7.8

在代码编辑过程中利用代码编辑窗口中的不同颜色和错误提示对话框，发现并修改语法错误，如图7-5所示（If…Then语句不完整）。

图7-5 代码编辑时的错误


实验7

实验7.9

在代码调试过程中，利用编译程序段时的错误提示对话框，发现并修改语法错误。如，将frmStInfo窗体中“姓名”输入域定义为控件数组TxtName(0)，运行该程序，提示错误信息如图7-6所示。

图7-6 代码编译时的错误

【相关知识及提示】 上述两实验练习使用代码编辑及代码编译时的错误提示对话框调试程序语法错误。

1） 此例中由于“姓名”输入域定义为控件数组TxtName(0)，而控件数组的事件驱动代码中，参数Index不可省，故出现上述错误；

2） 出现此错误，可检查是否将控件不小心定义为控件数组；

3） 改正错误，只须将对象定义与代码中统一：或者定义为控件数组，且在代码中按控件数组引用，或者将对象定义为普通对象（如果该控件数中只有一个元素，则没必要定义为控件数组，应该属于一种误操作，直接将Index属性清空即可）；

4） 注意：如果不希望对象定义为控件数组，Index属性一定要设置为空，而不能设置为0。


实验7

实验7.10

将实验7.9中txtName_Change事件中加入参数，修改为：Private Sub txtName_Change(Index As Integer)。运行该程序，提示错误信息如图7-6所示。

图7-7 代码编译时的错误

【相关知识及提示】 本实验练习使用代码编译时的错误提示对话框调试程序语法错误。

1） 此例与上例相同，是由于对象定义为控件数组，但在程序代码引用中按普通对象引用，即未加下标；

2） 此类错误较为常见，但由于对象名看上去并没有错误，所以在调试时较难发现错误，通常可以检查是否在对象定义时定义为控件数组；

3） 改正方法同实验7.9。


实验7

实验7.11

在frmStInfo窗体的“身份证号”输入控制代码中，需要允许“回格键（BackSpace）”键的输入。请利用调试窗口检测“回格键（BackSpace）”的ASCII码键值。

【相关知识及提示】 本实验练习利用断点的设置和VB调试窗口发现代码的逻辑错误。

1） 可以在“身份证号”输入控制代码中中设置断点；

2） 断点的设置，可以直接在代码编辑窗口中，用鼠标单击要设置为断点的语句左边的灰色栏；

3） 从“视图”菜单下打开“本地”窗口；

4） 运行frmStInfo窗体并在“身份证号”输入域键入“回格键（BackSpace）”键；

5） 此时“本地”窗口中返回的“表达式——KeyPress”的值，即为“回格键（BackSpace）” 的ASCII码键值，如图7-8所示。

图7-8 调试窗口——“本地”窗口的使用


实验7

实验7.12

在frmStInfo窗体的“身份证号” KeyPress事件中，输入如下输入控制代码：

Private Sub TxtId_KeyPress(KeyAscii As Integer)

If (KeyAscii < "0") Or (KeyAscii > "9") Then

KeyAscii = 0

End If

End Sub

1） 运行程序，看能否实现在“身份证号”输入域中只允许输入0到9的数字？

2） 利用调试窗口检查代码错在哪里，应如何修改？

【相关知识及提示】 本实验练习利用VB调试窗口查看代码执行的中间结果，检查代码的逻辑错误。

1） 在下列语句上设置断点，如图7-9所示：

If (KeyAscii < "0") Or (KeyAscii > "9") Then

2） 从“视图”菜单下打开“立即”窗口；

3） 运行frmStInfo窗体并在“身份证号”输入域键入0，当程序语句执行过程停留在设置断点的语句时，在“立即”窗口中先后输入：

? KeyAscii

? Chr(KeyAscii)

4） “立即”窗口显示结果，如图7-9中前4行所示；

5） 继续运行并在“身份证号”输入域键入9，当程序语句执行过程停留在设置断点的语句时，在“立即”窗口中先后输入：

? KeyAscii

? Chr(KeyAscii)

6） “立即”窗口显示结果，如图7-9中5到8行所示；

7） 逐语句执行程序，当程序语句执行过程停留在End If语句时，在“立即”窗口中输入：

? Chr(KeyAscii)

8） “立即”窗口显示结果，如图7-9中9到10行所示；

9） 可继续输入字母及其他非ASCII码键（如左右箭头等），逐语句执行，同上述几步验证参数KeyAscii值的变更情况。

图7-9调试窗口——“立即”窗口的使用


实验7

实验7.13

“学生基本信息表——Tbl_student”中，“姓名”字段s_name不允许为空。利用frmStInfo窗体输入学生基本信息时，如果“姓名”域没有输入值，则在记录保存时会提示如图7-10所示错误信息对话框。用户在此情况下只能退出程序的运行。请利用错误规避技术将其转换为用户容易理解的错误信息提示，并能允许用户返回到原输入界面重新补充“姓名”值的输入。

图7-11系统缺省的程序运行错误提示对话框

【相关知识及提示】 本实验练习利用VB错误捕获技术将系统提示的错误信息按特定格式转换。

1） 利用“On Error GoTo 语句标号”语句，可以在发生错误的时候自动转到标号为“语句标号”的代码段，在此代码段可以对错误提示信息显示格式进行重新设置，如，自定义的错误处理代码如下：

ErrHandle:

MsgBox "加载错误" & vbCrLf & "错误号：" & Err.Number _

& vbCrLf & "错误描述：" & Err.Description, _

vbInformation, "错误"

2） 则出现实验7.13所述错误时，系统显示如图7-11所示错误提示对话框，且单击“确定”钮后，仍然返回原输入界面；

3） Err对象的Number属性用于捕获“错误号”，Err对象的Description属性用于捕获“错误描述”。VbCrLf是VB中描述回车换行符的常量；

4） 在使用了“On Error GoTo 语句标号”语句的子程序执行完成后（不论是正常终止或经1）中错误处理后的终止），均需将其使用“On Error GoTo 0”语句恢复到VB系统的错误处理系统。

图7-11自定义的程序运行错误提示对话框


实验7

实验7.14

针对实验7.13可能发生的错误，利用错误规避技术完善程序代码，避免程序运行中出现此类错误。

【相关知识及提示】 在保存前对数据的完整性进行检查，即检查不允许为空的字段，如果这些字段值为空，则在写入表前先提示用户输入这些项目，如图7-12所示。

图7-12自定义的错误提示对话框


实验7

实验7.15

创建用户自定义ActivX控件：

1） 用于以“h：mm：ss”的格式显示当前系统时钟，如图7-13左下角的时钟；

2） 该控件允许用户自定义大小和前景色；

3） 将自定义的时钟控件用于frmAbout窗体中显示系统时间，如图7-13所示。

图7-13 用户自定义时钟

【相关知识及提示】 本实验练习用户自定义ActivX控件的创建及使用。

1） 用户自定义控件属性的定义和获取，通过Property过程定义；

2） Ambient对象的属性变更时，会激活AmbientChanged事件，且该事件传递的参数是变化的属性名。利用这个特点，可以控制用户自定义时钟的前景色；

3） 利用Timer控件控制时钟显示内容及变化频率；

4） 将自定义控件创建为.OCX控件文件，需将工程类型定义为“ActivX控件”，启动窗体设置为“None”。


实验7

实验7.16

创建如图7-13所示窗体，绘制-2π~2π之间的正弦曲线，其中坐标系原点位于窗体中央：

图7-13 正弦曲线

【相关知识及提示】 本实验练习使用图形方法绘制坐标，并将其用于绘制常用几何图形。

1） 用Scale方法定义坐标系，将窗体中心定义为坐标原点以便于坐标系中值的转换；

2） 用Line方法绘制坐标轴及刻度值，X轴的刻度两端点坐标值为：（ii, 0）和（ii, y1），其中y1为刻度的高度值，ii为刻度的水平坐标值（可用循环语句变换ii使之完成从-8到8刻度的转换；Y轴的刻度两端点坐标值为：（0, ii）和（x1, ii），其中x1为刻度的宽度值，ii为刻度的垂直坐标值；

3） 图中的字符（刻度值及X、Y轴名称）的显示，可利用窗体的CurrentX、CurrentY属性重定位光标，然后利用Print方法输出；

4） 正弦函数值在VB中使用Sin（）函数计算，其参数为弧度值；

5） 正弦曲线的绘制是将X的值从[-2π~2π]按一定的间隔取值，计算出正弦函数值，并将X值和计算结果值在坐标系中画出，将这些坐标点连成曲线即得到正弦曲线；

6） X取值间隔足够小时，曲线将显示为光滑曲线（如X取值间隔设置为0.01）。


实验7

实验7.17

绘制如图7-14所示图形：将以窗体中心为圆心、窗体高度的一半为直径的圆周（以下称“基准圆”）等分为10份，并且以这10个等点为圆心，窗体高度的一半为直径绘制圆（以下称“绘制圆”）。

图7-14 艺术图形的绘制

【相关知识及提示】 本实验练习使用图形方法绘制圆，及如何通过圆心的变换调整圆的显示。

1） 用于定位这10个绘制圆的基准圆的圆心及半径利用窗体的ScaleHeight、ScaleWidth属性确定；

2） 这10个绘制圆圆的圆心坐标的确定：可将基准圆的角度等分成10份，用这些角度的正、余弦函数值计算出绘制圆圆心相对于基准圆圆心的相对坐标，再分别加上基准圆圆心的坐标；

3） VB中正、余弦函数的参数使用的是弧度值，所以等分基准圆角度时直接等分其弧度值——2π；

4） 绘制圆圆心坐标：

x1 = dlbR * Cos (dblAngel) + x0

y1 = dlbR * Sin (dblAngel) + y0

其中：x0, y0为基准圆圆心坐标，dblR为基准圆半径，dblAngel为等分基准圆后，角度值从0~2π的各弧度值。

5） 使用Circle方法绘制。


实验7

实验7.18

绘制如图7-15所示图形：

1） 以窗体中心为圆心、半径以窗体高度的一半的1/10为级差递增的10个同心圆；

2） 由从圆心到最大圆周上的射线将这些圆等分为n份，其中n通过过程的参数传递。

图7-15 椭圆的绘制

【相关知识及提示】 本实验练习使用图形方法绘制圆，及圆周上点的坐标的计算。

1） 圆周上点的坐标，可先计算出其在以圆心为原点的坐标系中的弧度；

2） 用这个弧度的正、余弦函数值计算出该点相对于圆心的坐标；

3） 用算出的坐标分别加上圆心的坐标即可，具体算法同上例4）。


实验目的

本实验主要是为了初步Visual Basic中面向对象程序设计的方法，理解面向对象程序设计的基本思想。掌握如何使用Visual Basic创建类和使用自已创建的类。通过实验学生应该：

1． 理解对象的封装和数据隐藏；

2． 掌握Visual Basic中类的创建；

3． 给类添加属性、方法和事件；

4． 掌握利用自己创建的类定义对象及使用对象。


实验内容及要求

本实验通过几个实验案例的练习，完成用户自定义类的创建和使用。实验过程中重点完成以下工作：

1． 创建自定义的类，用于计算某一笔贷款的分期付款明细；

2． 利用自己创建的类定义对象，并将其用于实际应用程序中。


实验8

实验8.1

在frmAbout窗体中，使用With …… End With语句简化下列对Label1标签属性的设置的代码段：

Label1.BorderStyle = 1

Label1.BackStyle = 1

Label1.ForeColor = 黑

Label1.Left = 480

Label1.Top = 600

【相关知识及提示】 本实验练习使用With …… End With语句在使用一个对象的同个属性或方法时，简化对象名的引用。

1） 在With …… End With语句中，省略对象名的可以是对象的属性或方法；

2） 省略对象名后，属性或方法前的小数点“.”不能省；

3） 在With …… End With语句中，属性或方法前的对象名也可不省略。


实验8

实验8.2

创建一个类模块Loan.cls，用于计算给定贷款年限、本金和贷款利率的一笔贷款的分期付款明细表：

1） 为其创建属性Years、Months接收和显示用户设定的贷款期限，其中，在类模块中自动完成Years和Months间的相互转换；

2） 为其创建属性Principal和AnnualInterestRate，用于接收用户输入的本金和贷款个利率；

3） 为其创建属性Payment，用于输出月还款额；

4） 为其创建属性Balance，用于输出各月还款后的剩余还款额。

【相关知识及提示】 本实验练习Visual Basic中类模块的定义，及如何在类模块中为类创建不同类型的属性。

1） 利用Property Get过程可以定义属性，并获取属性的当前内容，并且在读取属性值时可以激活此过程；

2） 利用Property Let过程可以定义属性，并往属性中写入值，并且在写入属性值时激活此过程；

3） Years和Months间的相互转换可在读取或写入属性值时完成；

4） 只用于接收和存储用户输入值的属性，可以直接通过将其定义为全局变量，实现在类内、外都能同时访问；

5） 定义只用于输出的属性，可只用Property Get过程定义属性，而不使用PropertyLet过程定义；

6） 月还款额的计算公式为：

其中：R为月均还款额；P为贷款本金；I为贷款月利率；N为按月计算的贷款期限。


实验8

实验8.3

为类模块Loan.cls创建方法amortize，用于按用户设置属性Years、Months、Principal和AnnualInterestRate计算分期付款明细表，并将其存放于Balance属性，供用户读取。

【相关知识及提示】 本实验练习Visual Basic中类模块的方法的创建。

1） 类中方法的创建，是将其定义为公用过程；

2） 分期付款后的剩余还款额，是一个集合属性，用数组定义；

3） 剩余还款额计算公式为：

其中：B（i）为第i个月的剩余还款额，第0个月的剩余还款额为本金；I为贷款月利率R为月均还款额；R为月均还款额。


实验8

实验8.4

创建一窗体，利用上面定义的类模块Loan.cls输出本金为15万元、年利率为4.05%、还款期为2年的贷款的月还款额、每月还款后的余额明细表，如图8-1所示。

图8-1 等额还款明细表


实验目的

本实验通过几个实验实例的练习，掌握利用几个常用的Visual Basic Internet控件——WebBrowser、InternetTransfer、Winsock开发基于Internet的应用程序，实现与其他计算机中运行程序间的协作与通信。

实验过程中重点完成以下工作：

1．利用WebBrowser控件模拟Microsoft Internet Exporer创建简单的网页浏览器，通过URL（统一资源定位器）实现网页浏览、URL导航和文件下载等功能；

2．利用InternetTransfer控件实现文件的上传和下载；

3．利用Winsock控件连接客户机与服务器，建立两台计算机之间的通信。


实验内容及要求

实验过程中重点完成以下工作：

1．利用WebBrowser控件模拟Microsoft Internet Exporer创建简单的网页浏览器，通过URL（统一资源定位器）实现网页浏览、URL导航和文件下载等功能；

2．利用InternetTransfer控件实现文件的上传和下载；

3．利用Winsock控件连接客户机与服务器，建立两台计算机之间的通信。


实验8

实验9.1 利用WebBrowser控件创建Web浏览器

使用VB创建Web浏览器，模拟Internet Explorer的简单功能，如图9－1所示。

图9－1 使用VB创建Web浏览器

【相关知识及提示】

1） 使用WebBrowser控件实现浏览器功能；

2） 网站页面的访问及打开，利用控件的Navigate方法，即：

brwWebBrowser.Navigate cboAddress.Text

3） 后退 、前进、刷新、默认主页、搜索、停止等功能，直接使用控件的相应方法实现。

Select Case Button.Key

Case "Back" ' 后退按钮

brwWebBrowser.GoBack

Case "Forward" ' 前进按钮

brwWebBrowser.GoForward

Case "Refresh" ' 刷新按钮

brwWebBrowser.Refresh

Case "Home" ' 系统默认主页按钮

brwWebBrowser.GoHome

Case "Search" ' 搜索按钮

brwWebBrowser.GoSearch

Case "Stop" ' 停止按钮

timTimer.Enabled = False

brwWebBrowser.Stop

Me.Caption = brwWebBrowser.LocationName

End Select


实验8

实验9.2 利用Winsock控件创建简单聊天程序

使用VB创建简单的聊天程序，实现两台计算机间的通信，如图9－2所示。

图9－2 简单的聊天程序

【相关知识及提示】

1） 利用Winsock控件实现两台计算机间的通信与连接；

2） 利远程主机IP、端口的设置和本地端口的绑定利用Winsock控件的相应属性，参考代码如下：

With Winsock1

.RemoteHost = Trim(txtRemoteIP.Text) ' 设置远程主机IP

.RemotePort = Trim(txtRemotePort.Text) ' 设置远程主机端口

If .LocalPort = Empty Then

.LocalPort = Trim(txtLocalPort.Text) ' 设置本地机端口

Frame2.Caption = .LocalIP

.Bind .LocalPort

End If

End With

3） 信息的发送利用Winsock控件的SendData属性：

Winsock1.SendData New_Line

4） 信息的接收利用Winsock控件的GetData属性：

Winsock1.GetData New_Text


实验8

实验9.3 利用Internet Transfer控件传输文件

使用VB创建简单的文件传输程序，从指定目录下载文件，如图9－3所示。

图9－3 简单的文件传输程序

【相关知识及提示】

1） 利用Internet Transfer（Inet）控件实现两台计算机间文件的传输；

2） 为连接按钮添加代码，实现与FPT服务器的连接。

Private Sub cmdConnect_Click() ' cmdConnect——连接FTP按钮名

Dim strUrl As String

Dim strfile As String

On Error GoTo errhandle:

strUrl = cboURL.Text ' cboURL——FTP服务器地址下拉列表框名

strFile = txtRemote.Text ' txtRemote——FTP服务器上要下载的文件名

Inet1.Execute strUrl, "dir " + strFile ' Inet1——Inet控件名

lblPath.Caption = strUrl + strFile

Exit Sub

Errhandle:

MsgBox Err.Description

End Sub

3） 从FTP服务器下载文件到本地机磁盘目录。

Inet1.Execute strUrl, "get " + txtRemote.Text + " " + sLFile


版权说明

《软件开发工具》教学实验模拟系统

由项目开发人员共同完成,

版权所有,特此声明!

项目成员名单

陈学东 常 丹

刘世峰 苟娟琼

王 宇　石声波

朱大伟 林世福

秦 涛

制作日期:2005年4月