VB.NET一个考试系统的实例
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
VB考试系统
系统目标及流程设计
◆系统目标
根据现有考试的基本流程,实现考试管理的电子化、无纸化,减少人为因素的干扰,减轻教师及学生的负担。
◆系统功能
1、掌握本考试范围内所有用户的基本情况,包括编号、姓名、登录口令等。
2、基于考试系统的基本功能管理,本系统可以提供给教师类用户、学生类用户使用。
不同的用户类型所能完成的功能不同。
教师类用户可以创建试题、删除过期试题、进行题库维护、创建试卷等;学生类用户主要是参与考试,完成试卷。
3、适时的试题题库更新,试题题型包括填空题、单选题2种类型。
试题库的更新由教师类用户完成。
学生类用户不允许对试题进行更新。
4、试卷可由本系统自动生成,也可以由教师从题库中选择试题创建。
试卷创建完成后,允许教师打印试卷样稿。
◆系统设计:
根据本系统的需求,结合实际考试管理情况,本系统应该具有以下功能模块:
1、用户管理
本系统的用户将分为2类:教师类用户和学生类用户。
学生类的用户是指当前系统中所有的学生,其用户名为学生的姓名,该类用户能够参与答题并浏览考试结果,但是不能浏览他人考试结果,也不能对自身和他人的信息进行管理。
教师类用户主要对试卷进行管理,包括创建试卷、修改试卷、评阅试卷等。
本系统用户管理通过登录人员类进行管理。
2、试卷类
本系统将定义试卷类对象以方便管理。
试卷类中将记录试卷创建者的教师编号、试卷中2种题型(填空题、单选题)的题目数、试卷是否创建、试卷是否回答、试卷是否评阅、试卷得分等,同时也提供了创建、回答、评阅试卷的方法。
3、试卷创建、浏览及修改
试卷创建分为教师命题以及系统自动命题两种方式,自动命题方式由登录的教师指定各种题型的题目数后,系统自动由相应的题库中随机抽取试题,生成试卷。
教师命题的方式提供教师类用户浏览题库的功能以及从题库中选取试题的功能。
试卷修改功能也是为教师类提供的,教师类用户可以对系统创建的以及教师命题创建的试卷进行修改
4、题库管理
此部分功能是为教师类用户提供的。
主要是提供对试题库添加新的试题、删除旧题、修改原题目等功能。
5、答题模块
答题模块功能对学生类用户开放。
学生类用户对创建的试卷中的题目进行回答。
6、试卷评阅模块
此部分功能向教师类用户开放。
针对试卷中的2种题型,主要分为系统自动评阅和教师评阅两类,系统自动评阅单选题这种客观性题型,教师类用户可以参与评阅填空题这种主观性题型。
◆系统流程:
根据一般考试流程,结合上述的各功能模块及其特点,本系统的基本流程如图LC-1所
示。
图LC-1系统流程
窗体界面设计
一、Splash 窗体(frmSplash )
运行本系统,首先出现的是Splash 窗体,用于显示系统名称、版本信息、开发平台等信息。
按以下步骤设计该窗体:
创建一个新工程,命名为“TEST .VBP ”。
在工程中添加窗体,命名为frmSplash 。
向Splash 窗体上添加控件,如图W-1所示,并设置其属性如表SZ-1所示。
图W-1
表SZ-1 frmSplash 窗体及相关控件属性设置
二、系统主窗体(MDIfrmMain)
Splash窗体出现后,等待一会或单击Splash窗体,将显示系统主窗体,在系统主窗体中将实现用户登录、试卷生成、参加考试、获取成绩等一系列的功能,主窗体界面如图W-2所示。
按以下步骤设计该窗体:
在工程中添加MDI窗体,命名为MDIfrmMain,按表SZ-2所示设置系统主窗体的属性。
本窗体的菜单设计我们在第九章实战编程部分给予了详述,不再重复。
图W-2
表SZ-2 MDIfrmMain窗体属性设置
三、登录窗体(frmLogin)
单击“人员”菜单中的“人员登录”菜单项,将弹出登录窗体。
本系统的用户分为两类:教师用户类型、学生用户类型。
两类用户都使用同一个登录窗体进行登录,根据使用者身份的不同,用户可以在组合框中选择所要登录的用户的类型,并输入相应的用户名和密码。
各用户登录界面分别如图W-3、图W-4所示。
按以下步骤设计该窗体:
在工程中添加窗体,命名为frmLogin。
向frmLogin窗体上添加控件,如图W-3所示,并设置其属性如表SZ-3所示。
图W-3 以教师身份登录 图W-4 以学生身份登录
表SZ-3登录窗体控件及属性设置
四、生成试卷窗体(frmCreat )
教师用户登录后,单击“生成试卷”菜单项,将弹出生成试卷窗体,并根据用户选择创建本次考试的试卷。
创建试卷的方式有两种,一种由系统自动创建试卷,一种是由教师手动创建试卷。
因此,生成试卷窗体应提供OptionButton 控件,以使教师类用户进行选择。
如果是选择系统自动创建试题,还应说明各种题型的题目数,可通过文本输入框来实现,并且可通过UpDown 控件改善文本框的输入。
按以下步骤设计该窗体:
111
111
在工程中添加窗体,命名为frmCreat。
向frmCreat窗体上添加控件,如图W-5所示,并设置其属性如表SZ-4所示。
图W-5
表SZ-4生成试卷窗体控件及属性设置
注:UPDOWN控件用于调节文本框的输入值,其BUDDYCONTROL属性表示将其绑定的控件名称。
UPDOWN控件的添加方法是:在工具栏空白处单击右键,选择“部件”,在弹出的菜单中选择“MICROSOFT WINDOWS COMMON CONTROL-2 6.0”
五、修改试卷窗体(frmModifyPaper)
如果教师类用户选择了“教师命题”的方式创建试卷或者创建试卷后单击了“修改试卷”菜单项,都将弹出试卷修改窗体。
在该窗体中,允许教师向已有的试卷中加入题目或从试卷中删去题目。
在试卷修改窗体中,左边部分显示题库信息,右边部分则显示本次测试的试卷信息。
教师用户可以选择需要的试题类型,并从题库中找到题目后,单击标注为“==>>”的按钮,即可实现向试卷中加入一道题目。
如果想要删除试卷中的某道题,则先选中该题目后,单击标注为“<<==”的按钮即可。
按以下步骤设计该窗体:
在工程中添加窗体,命名为frmModifyPaper。
向frmModifyPaper窗体上添加控件,如图W-6所示,并设置其属性如表SZ-5所示。
图W-6
表SZ-5修改试卷窗体控件及属性设置
六、报表窗体(frmReport )
当教师类用户创建试卷之后,就可以对试卷进行浏览,一方面可以预览已经生成的试卷,另一方面也可以打印本次创建的试卷样稿。
当用户单击打印按钮时,试卷样稿被打印输出。
按以下步骤设计该窗体:
在工程中添加窗体,命名为frmReport 。
向frmReport 窗体上添加控件,如图W-7所示,并设置其属性如表SZ-6所示。
图W-7
表SZ-6 报表窗体控件及属性设置
七、题库管理窗体(frmTestLib)
教师类用户可以对试题库进行维护和更新。
单击“题库管理”菜单项,可打开题库管理窗体,在该窗体中,可以向各题库中加入新的试题,也可以删除原题库中的旧题,还可以修改原题信息。
按以下步骤设计该窗体:
在工程中添加窗体,命名为frmTestLib。
向frmTestLib窗体上添加控件,如图W-8所示,然后再在FRAMEMAIN框架中添加一个DATAGRID控件,使其充满FRAMEMAIN框架,如图W-9所示。
这样,当DATAGRID控件显示时,就遮盖了FRAMEMAIN框架;当DATAGRID控件不显示时,则能看到图W-8中FRAMEMAIN框架内的各个控件。
本窗体中包含的控件属性设置如表SZ-7所示。
图W-8 图W-9
表SZ-7 题库管理窗体控件及属性设置
八、答题窗体(frmAnwser)
当试卷创建后,学生类用户就可以参加考试了。
考试过程是在答题窗体中进行的,学生类用户单击“开始测试”菜单项,即可弹出答题窗体。
按以下步骤设计该窗体:
在工程中添加窗体,命名为frmAnwser。
向frmAnwser窗体上添加控件,如图W-10所示,然后再添加一个名为txtAnswer的文本框控件,使其与FrameAnswer框架重叠,如图W-11所示。
这样,当txtAnswer控件显示时,就遮盖了FrameAnswer框架;当txtAnswer 控件不显示时,则能看到图SZ-11中FrameAnswer框架内的各个控件。
本窗体中包含的控件属性设置如表SZ-8所示。
图W-10 图W-11
表SZ-8 答题窗体控件及属性设置
九、试卷评阅窗体(frmCheck)
当学生用户提交了已经完成的试卷之后,系统将自动对试卷的客观题部分进行评判。
主观题部分则是由教师类用户来进行评阅,并给出相应的分值。
当教师类用户单击“评判试卷”菜单项时,系统弹出试卷评阅窗体。
按以下步骤设计该窗体:
在工程中添加窗体,命名为frmCheck。
向frmCheck窗体上添加控件,如图W-12所示。
本窗体中包含的控件属性设置如表SZ-9所示。
表SZ-9 试卷评阅窗体控件及属性设置
图W-12
十、结果查询窗体(frmResult)
在教师类用户对考生的试卷做出评阅以后,考生或教师就可以查询本次考试成绩了。
单击“教师”菜单下的“查询结果”菜单项,或者单击“学生”菜单下的“信息查询”项,都可以弹出结果查询窗体。
按以下步骤设计该窗体:
在工程中添加窗体,命名为frmResult。
向frmResult窗体上添加控件,如图W-13所示。
本窗体中包含的控件属性设置如表SZ-10所示。
图W-13
表SZ-10 结果查询窗体控件及属性设置
菜单设计
在系统主窗体中将实现用户登录、试卷生成、参加考试、获取成绩等一系列的功能,功能的实现通过菜单。
按以下步骤设计窗体菜单:
在工程中添加MDI窗体,命名为MDIfrmMain。
按表MENU-1设置主窗体菜单。
设置完成后,主窗体界面如图M-1所示。
表MENU-1设置主窗体菜单
图M-1
在“人员”菜单中,主要包括“人员登录”、“注销登录”以及“退出系统”3项。
在没有任何用户登录之前,“注销登录”项为灰色,不可使用。
如图M-2所示。
单击“人员登录”后,若以教师身份登录,则菜单显示如图M-3所示;若以学生身份登录,则菜单显示如图
M-4所示。
如果用户单击“退出系统”菜单项,将终止本系统的此次运行。
图M-2 图M-3 图M-4 图M-5 在“帮助”菜单中,主要包括“使用手册”与“关于”两项,如图M-5所示。
如果用户单击“关于”菜单项,将弹出Splash窗体,显示本系统的版本信息等。
数据库设计
一、数据库表设计
本系统使用Access2000作为数据库管理系统(DBMS)。
在Access中,新建一个数据库,将其命名为Test.mdb,将新建的数据库放置在应用程序的目录中,以备使用。
Test.mdb数据库中包含的数据表及其相应功能如表DB-1所示。
下面对该数据库中的各个数据表进行简单的说明:
表DB-1 TEST数据库包含的数据表及其功能
1、学生信息表(Student)的设计
学生类用户为使用本系统的主要对象之一。
学生信息表存放学生类用户的基本信息,包括以下部分:学生学号(StudentID)、学生姓名(StudentName)、登录口令(StudentPassword)以及学生考试成绩(Score)。
在已创建的Access数据库Test.mdb中创建一个表,表名为“Student”,向表中添加以上各字段。
其中,SmdentlD(学号)字段为该表的主关键字(PrimaryKey,PK),惟一标识了一个学生用户记录的信息。
学生信息数据表结构如表DB-2所示。
表DB-2 学生表(Student)
2、教师信息表(Teacher)的设计
教师信息表用于存放教师类用户的基本信息,包括教师编号、教师姓名、登录系统口令共3项基本信息,分别对应于教师信息数据表(Teacher)中的TeacherID、TeacherName 和TeacherPassword字段。
其中,TeacherID为教师信息数据表的主关键字,如表DB-3所
示。
表DB-3 教师表(Teacher)
3、填空题题库信息表(Filling)的设计
填空题是本考试系统能够支持的考试题型的一种。
根据填空题的特点,填空题题库信息表至少应该具有题目、参考答案、题目分值等几个字段,另外在题库中要标识每一道题目还需要题目编号字段。
因此,填空题题库信息表的结构如表DB-4所示。
表DB-4 填空题题库信息表(Filling)
4、单选题题库信息表(SingleSel)的设计
单选题类型的题目除问题本身外,应该具有4个可选项,因此,在判断题题库信息表中应该包含相应的4个字段。
另外,还应该包括一个字段用以表示答案是哪一个选项。
单选题题库信息表结构如表DB-5所示。
表DB-5 单选题题库信息表(SingleSel)
6、试卷信息表(QuestionPaper)的设计
每次考试之前,由教师类用户创建本次考试的试卷。
相应的试卷信息将被保存在试卷信息表中。
当学生类用户参加考试时,完成的试题答案也将被保存到试卷信息表中,以备评阅。
在试卷信息表中还保存了试卷评阅结果,即每道题是否回答正确。
试卷信息表的结构如表DB-6所示。
表DB-6试卷信息表(QuestionPaper)
二、使用ADO对象模型建立应用程序与数据库的连接
要在本系统中使用Test.vbp数据库,首先应该建立应用程序与数据库的连接。
本系统采用ADO对象模型的方式建立数据连接。
1、向工程中添加对ADO对象模型的引用
单击“工程”菜单下的“引用”菜单项,选择“Microsoft ActiveX Data Objects 2.0 Library”项,单击“确定”按钮。
如图DB-1所示。
图DB-1
2、使用“数据环境设计器”进行数据环境设置
“数据环境(DataEnvironment)”用于向应用程序提供数据库中的所有数据信息,并向应用程序提供对数据库的添加、删除等操作,是一种非常方便实用的工具。
在VB项目中使用“数据环境”,可以减轻程序员的压力,使代码更为简洁。
本系统需要在“数据环境设计器”中添加对Test.mdb数据库中各信息表的访问。
(1)添加对“数据环境设计器”的引用
单击“工程”菜单下的“引用”菜单项,在弹出的窗体中选择“Microsoft Data Environment Instance 1.0”项,并确认,如图DB-1所示。
(2)在项目中添加数据环境
单击“工程”菜单下的“添加Data Environment”项,系统将添加一个数据环境,在属性窗体中将添加的数据环境命名为DataEnv。
在添加数据环境后,VB编译器会自动添加一个连接(Connection)对象,在属性窗体中将其命名为DataConn。
如图DB-2所示。
图DB-2
鼠标右键单击DataConn连接对象,在弹出的菜单中选择“Property”菜单项,将弹出属性设置窗体,该窗体用于设置连接对象DataConn的各项属性,使其连接到所需的Test.mdb 数据库。
●首先设置“提供程序”选项卡。
“提供程序”用于表示该数据库应该采用何种进行引擎连接。
由于本系统的数据库为Access 2000,因此在“提供程序”选项卡中选择“Microsoft Jet
4.0 0LE DB Provider”,如图DB-3所示。
●单击“下一步”按钮进入“连接”选项卡进行设置。
在该选项卡中填入数据库名称、登录用户名称及密码等项后,单击“测试连接”按钮,如果连接成功,将弹出消息框说明“测试连接成功”,否则说明“测试连接失败”,如图DB-4所示。
图DB-3 图DB-4
●数据库连接之后,还应该设置数据库的访问权限。
选中“高级”选项卡,设置访问权限,选中“ReadWrite”选项,设置数据库访问权限为可读写,如图DB-5所示。
图DB-5
(3) 编写数据连接的初始化代码
当系统运行时,可通过数据环境的初始化来完成连接对象的属性设置。
数据环境Data Environment具有一个InitiaLize事件,即初始化。
编写下面这段代码在数据环境初始化时,设置连接对象DataConn的连接字符串属性(ConnectionString)。
Private Sub DataEnvironment_Initialize()
Dim strConn As String
strConn = "Provider=Microsoft.Jet.OLE DB.4.0;Password=;Data Source="
Rem App对象表示应用程序,App.Path则表示应用程序运行路径名
strConn = strConn & App.Path & "\Test.mdb" & ";Persist Security Info=True" DataConn.ConnectionString = strConn
End Sub
(4)创建数据命令对象
建立数据连接对象DataConn与数据库Test.mdb的连接后,就需要使用数据库中的信息了。
一般情况下,需要建立数据命令对象来执行查询语句并获取数据,获取到的数据存放在数据集对象中。
在数据环境设计器中,右键单击连接对象DataConn,在弹出的菜单中选择“Add Command”菜单项,即向数据环境中添加了一个命令对象。
添加的命令对象应该是依赖于数据连接对象DataConn的。
添加的命令对象的名字,默认情况下通常是Command1,选中该命令对象,单击鼠标右键,在弹出的菜单中选择“Properties”菜单项,将弹出命令对象的属性设置窗体,如图DB-6所示。
图DB-6
在该话框中的“General”选项卡中主要设置命令对象的名称、所依赖的连接对象、获取数据的来源等。
其中获取数据的来源主要包括数据对象和SQL查询语句两类。
如果选取数据对象作为数据来源的话,可以选择的数据对象主要包括数据库表、视图、存储过程等;如果选择SQL查询语句作为数据来源的话,则需要输入SQL查询语句。
在命令对象属性窗体中,依次设置“Command Name”为StuTable,“Connection”为DataConn,在“Source Of Data”中选择“DataBase Object”,并设置为Table,然后设置“Obiect”为 Student。
这样,在数据环境DataEnv中创建的命令对象StuTable主要用于读取数据库表“Student”的所有信息,并自动在数据环境DataEnv中创建一个名为rsStuTable的数据集对象,用于存放从student表中读取的所有信息。
在命令对象的属性设置窗体中,选择“Advanced”选项卡,设置其中的“Lock”选项值为3-Optimistic,其他的选项接受默认值。
修改“Lock”选项的目的是为了使rsStuTable 数据集可以读取也可以更新。
“Advanced”选项卡设置如图DB-7所示。
按照以上方法创建5个命令对象,分别设置其属性如表DB-7所示。
表DB-7 在数据环境中添加的命令对象及其属性设置
图DB-7
以上5个命令对象创建后,我们再建立一个命令对象,使其以SQL语句的方式对数据信息表进行操作,用于清除QuestionPaper信息表的所有内容。
操作如下:向数据环境中添加一个命令对象,在命令对象的属性设置窗体的“General”选项卡中,设置其属性“Name”为DelQuestion,“Connection”为DataConn,“Source Of Data”为SQL Statement,并且填入相应的SQL语句:Delete * from QuestionPaper
命令对象添加后的数据环境设置如图DB-8所示。
在数据环境DataEnv中有一个数据连接对象DataConn,有6个命令对象依赖于连接对象DataConn,其中5个命令对象的数据来源是相应的数据信息表,另一个命令对象则是以SQL语句的方式对数据信息表进行操作。
图DB-8
主模块与类的设计
一、添加主模块
在工程的“工程资源管理器”窗口单击鼠标右键,在弹出的菜单中选择“添加” “添加模块”,添加一个模块,命名为:MainModual。
用于各种自定义类型的定义以及声明公有变量。
在MainModual模块中添加代码如下:
Rem 本系统用户分两类(学生与教师),定义为枚举类型
Public Enum LogType
student
teacher
End Enum
Rem 本系统题型有两类(填空题与单选题),定义为枚举类型
Public Enum QuestionType
OnErr = -1
Blacks = 1
singlesel = 3
End Enum
Rem “登陆人员类”建好后,定义一个LoginUser类的实例对象TestUser
Public TestUser As New LoginUser
Rem “试卷类”建好后,定义一个QestionPaper类的实例对象QPaper
Public QPaper As New QestionPaper
Rem 在主过程MAIN中初始化TestUser和QPaper对象
Sub Main()
TestUser.LogFail = True
QPaper.Answered = False
QPaper.Created = False
erName = ""
erPassword = ""
TestUser.LogFail = True
frmSplash.Show vbModal
MDIfrmMain.Show
End Sub
以上代码完成后,执行菜单“工程” “工程属性”,将启动对象设置为Sub Main。
二、添加类
类是一个将用户定义的数据类型和过程组合在一起而构成的具有特定结构的封装体。
它不仅定义了数据,也定义了对这些数据实施操作的方法,同时也定义了能够响应的事件。
从程序员角度看,类是定义对象外观特征和行为的模板,而对象只是类的一个实例。
如:在MainModual模块中我们使用语句:Public TestUser As New LoginUser,定义了一个LoginUser类的实例对象TestUser,其前提是我们已创建好了LoginUser类。
因编程需要,本系统需要编写两个类模块:1、登陆人员类(LoginUser) 2、试卷类(QestionPaper)。
在定义类的属性时,一般先定义一个相应的私有变量,用于存放属性的值。
当需要为类属性赋值时,可以定义LET方法;当需要读取类属性的值时,则定义GET方法。
定义LET方法的格式:
PUBLIC PROPERTY LET 属性名(相同数据类型的参数表示要设置的属性值)相应的私有变量=参数值
END PROPERTY
定义GET方法的格式:
PUBLIC PROPERTY GET 属性名() AS 属性类型
属性名=相应的私有变量
END PROPERTY
1、登陆人员类(LoginUser)
在项目中添加一个类模块(LoginUser.cls),类名为LoginUser,该类中记录了登录人员的一般信息。
LoginUser类的属性及其用途如表L-1所示。
表L-1 LoginUser类的属性及其用途
Private mvarUserName As String
Private mvarLogTime As Date
Private mvarUserPassword As String
Private mvarUserType As LogType
Private mvarLogFail As Boolean
Rem 定义UserType属性的赋值方法
Public Property Let UserType(ByVal vData As LogType)
mvarUserType = vData
End Property
Rem 定义UserType属性的读取方法
Public Property Get UserType() As LogType
UserType = mvarUserType
End Property
Rem 定义UserPassword属性的赋值方法
Public Property Let UserPassword(ByVal vData As String)
mvarUserPassword = vData
End Property
Rem 定义UserPassword属性的读取方法
Public Property Get UserPassword() As String
UserPassword = mvarUserPassword
End Property
Rem 定义LogTime属性的赋值方法
Public Property Let LogTime(ByVal vData As Date)
mvarLogTime = vData
End Property
Rem 定义LogTime属性的读取方法
Public Property Get LogTime() As Date
LogTime = mvarLogTime
End Property
Rem 定义UserName属性的赋值方法
Public Property Let UserName(ByVal vData As String)
mvarUserName = vData
End Property
Rem 定义UserName属性的读取方法
Public Property Get UserName() As String
UserName = mvarUserName
End Property
Rem 定义LogFail属性的赋值方法
Public Property Let LogFail(ByVal vData As Boolean)
mvarLogFail = vData
End Property
Rem 定义LogFail属性的读取方法
Public Property Get LogFail() As Boolean
LogFail = mvarLogFail
End Property
以下代码定义LoginUser类的方法
LoginUser类的方法用于验证用户的登录信息是否与数据库中的用户信息一致。
如果一致,则认为用户登录正确,可以使用本系统,则LoginUser类对象的LogFail属性值为False;否则,认为用户登录失败,LoginUser类对象的LogFail属性为True。
Public Function Log(ByVal uName As String, ByVal uPass As String, ByVal uType As LogType) As Boolean
Dim SQLstring As String
If uName = "" Then '若用户名为空,则登录失败
LogFail = True
Log = LogFail
Exit Function
End If
If uPass = "" Then '若口令为空,则登录失败
LogFail = True
Log = LogFail
Exit Function
End If
If uType <> student And uType <> teacher Then '若用户类型不是学生或教师,则登录失败
LogFail = True
Log = LogFail
Exit Function
End If
Select Case uType
Rem 用户类型为学生,验证由命令对象StuTable创建的数据集rsStuTable
Case student
DataEnv.rsStuTable.Open
DataEnv.rsStuTable.Filter = "studentName = '" & uName & "' And
studentPassword = '" & uPass & "'"
If DataEnv.rsStuTable.RecordCount > 0 Then
LogFail = False
End If
DataEnv.rsStuTable.Filter = ""
DataEnv.rsStuTable.Close
Rem 用户类型为教师,验证由命令对象TchTable创建的数据集rsTchTable
Case teacher
DataEnv.rsTchTable.Open
DataEnv.rsTchTable.Filter = "TeacherName = '" & uName & "' And
TeacherPassword = '" & uPass & "'"
If DataEnv.rsTchTable.RecordCount > 0 Then
LogFail = False
End If
DataEnv.rsTchTable.Filter = ""
DataEnv.rsTchTable.Close
End Select
UserName = uName
UserPassword = uPass
UserType = uType
End Function
2、试卷类(QestionPaper)
在项目中添加一个类模块(QestionPaper.cls),类名为QestionPaper。
QestionPaper 类的对象实例将提供对创建试卷、修改试卷、答题、自动评阅等主要功能的支持。
QestionPaper类的属性及其用途如表L-2所示。
Option Explicit
Private mvarFillingNum As Long
Private mvarRightWrongNum As Long
Private mvarSingleSelNum As Long
Private mvarMultiSelNum As Long
Private mvarEssayQNum As Long
Private mvarCreated As Boolean
Private mvarAnswered As Boolean
Private mvarChecked As Boolean
Rem 定义属性表示填空题数
Public Property Let FillingNum(ByVal vData As Integer) mvarFillingNum = vData
End Property
Public Property Get FillingNum() As Integer
FillingNum = mvarFillingNum
End Property
Rem 定义属性表示单选题数
Public Property Let SingleSelNum(ByVal vData As Integer) mvarSingleSelNum = vData
End Property
Public Property Get SingleSelNum() As Integer
SingleSelNum = mvarSingleSelNum
End Property
Rem 定义属性表示是否回答
Public Property Let Answered(ByVal vData As Boolean)
mvarAnswered = vData
End Property
Public Property Get Answered() As Boolean
Answered = mvarAnswered
End Property
Rem 定义属性表示是否创建
Public Property Let Created(ByVal vData As Boolean)
mvarCreated = vData
End Property
Public Property Get Created() As Boolean
Created = mvarCreated
End Property
Rem 定义属性表示是否评阅
Public Property Let Checked(ByVal vData As Boolean)
mvarChecked = vData
End Property
Public Property Get Checked() As Boolean
Checked = mvarChecked
End Property
Rem 从试题信息表中选取题目类型为1(填空题)的记录,计算其"COMMENCE"字段的和Public Property Get SubjectiveScore () As Single
On Error Resume Next
Dim SubScore As Single
SubScore = 0
DataEnv.rsQstPaper.Open
DataEnv.rsQstPaper.Filter = "QuestionType = 1" '设置数据集过滤器
While Not DataEnv.rsQstPaper.EOF '遍历数据集
REM 求"COMMENCE"字段的和
SubScore = SubScore + DataEnv.rsQstPaper.Fields("Commence")
DataEnv.rsQstPaper.MoveNext
Wend
DataEnv.rsQstPaper.Filter = "" '数据集过滤器清空
DataEnv.rsQstPaper.Close '关闭数据集
SubjectiveScore = SubScore
End Property
Rem 从试题信息表中选取题目类型为3(单选题)的记录,计算其"COMMENCE"字段的和Public Property Get ObjectiveScore() As Single
On Error Resume Next
Dim objScore As Single
objScore = 0
DataEnv.rsQstPaper.Open
DataEnv.rsQstPaper.Filter = "QuestionType = 3" '设置数据集过滤器
While Not DataEnv.rsQstPaper.EOF
Rem 求"COMMENCE"字段的和
objScore = objScore + DataEnv.rsQstPaper.Fields("Commence")
DataEnv.rsQstPaper.MoveNext
Wend
DataEnv.rsQstPaper.Filter = "" '数据集过滤器清空
DataEnv.rsQstPaper.Close
ObjectiveScore = objScore '关闭数据集
End Property
Rem 从试题信息表中选取题目类型为1(填空题)的记录,计算其"Score"字段的和Public Property Get SScore() As Single
On Error Resume Next
Dim SubScore As Single
SubScore = 0
DataEnv.rsQstPaper.Open
DataEnv.rsQstPaper.Filter = "QuestionType = 1 or QuestionType = 5"
While Not DataEnv.rsQstPaper.EOF
SubScore = SubScore + DataEnv.rsQstPaper.Fields("Score")
DataEnv.rsQstPaper.MoveNext
Wend
DataEnv.rsQstPaper.Filter = ""
DataEnv.rsQstPaper.Close
SScore = SubScore
End Property
Rem 从试题信息表中选取题目类型为3(单选题)的记录,计算其"Score"字段的和
Public Property Get OScore() As Single
On Error Resume Next
Dim objScore As Single
objScore = 0
DataEnv.rsQstPaper.Open
DataEnv.rsQstPaper.Filter = "QuestionType = 3"
While Not DataEnv.rsQstPaper.EOF
objScore = objScore + DataEnv.rsQstPaper.Fields("Score")
DataEnv.rsQstPaper.MoveNext
Wend
DataEnv.rsQstPaper.Filter = ""
DataEnv.rsQstPaper.Close
OScore = objScore
End Property
Rem 从试题信息表中获取rsQstPaper数据集的记录数目
Public Property Get QuestionNum() As Long
DataEnv.rsQstPaper.Open
QuestionNum = DataEnv.rsQstPaper.RecordCount
DataEnv.rsQstPaper.Close
End Property
Rem 获取最后一条记录的试卷号,其中GetQSerial ()为自定义的类方法,详见后面代码Public Property Get LastQSerial() As Long
LastQSerial = GetQSerial(QuestionNum)
End Property
Rem 获取第一条记录的试卷号
Public Property Get FirstQSerial() As Long
FirstQSerial = GetQSerial(1)
End Property。