版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
题库管理系统摘要汇编语言试题库管理系统是信息管理系统,其开发的功能主要包括:通过计算机管理题库档案,过强大的查询和索检高效的索检出数据,提高办事效率。使用MICROSOFT公司的ACCESS作为后台数据库,设计数据库,使用MICROSOFT公司的VISUALC++6.0开发工具,利用其提供的各种面向对象的开发工具,使用ADO控件连接数据库,开发出产品。关键字:题库管理系统,VISUALC++6.0,数据库。AbstractAdatabasemanagementsystemistheinformationmanagementsystem,thefunctionthatitdevelopmainlyincludes:Passadatabaseofthecalculatormanagementfile,leadthestrongsearchandthechecksefficientlyofcheckingadata,raisetohandleaffairstheefficiency.TheACCESSthatusesthecompanyofMICROSOFTisthebackstagedatabase,thedesigndatabase,usetheVISUALC++6.0developmenttoolofthecompanyofMICROSOFT,makeuseofvariousdevelopmenttoolthatfacestotheobjectofwhatitprovide,usetheADOtocontrolaconjunctiondatabase,developtoproducethearticle.Keywords:Databasemanagementsystem,VISUALC++6.0,Database.目录摘要 ……1Abstract *•,1目录 2TOC\o"1-5"\h\z一、刖a 4\o"CurrentDocument"二、开发工具和相关知识简介 4\o"CurrentDocument"2.1Vc++基础 5\o"CurrentDocument"2.2SQL语言简介 5\o"CurrentDocument"三、编译原理试题库系统的需求分析 6\o"CurrentDocument"系统的开发背景 6\o"CurrentDocument"系统的可行性研究 7\o"CurrentDocument"开发过程框图 7\o"CurrentDocument"系统功能分析 85系统总体流程图 9\o"CurrentDocument"四、系统总体设计 101系统功能模块框图 10\o"CurrentDocument"4.2数据库设计 11\o"CurrentDocument"2.1数据库需求分析 11\o"CurrentDocument"2.2数据库结构设计 12\o"CurrentDocument"五、编译原理试题库系统具体实现 14\o"CurrentDocument"1系统登录 21\o"CurrentDocument"试题库系统主界面 24\o"CurrentDocument"试题管理对话框 29\o"CurrentDocument"3.1填空题管理 29\o"CurrentDocument"3.2选择题管理 37\o"CurrentDocument"用户管理对话框 47\o"CurrentDocument"5.5成绩管理页面 55\o"CurrentDocument"5.6考试页面 58\o"CurrentDocument"5.7生成试卷对话框 76\o"CurrentDocument"六、软件测试 81结束语81致谢81\o"CurrentDocument"主要参考文献 82一、前言我们已经进入了一个信息化的时代,计算机在我们的生活中有着不可取代的地位。人们可以利用计算机进行各种活动,以减少人的大量的劳动。信息时代也带来了教学的改革,现在越来越多的学校使用电子教学手段,不仅可以减少大量的繁杂的劳动,而且可以大大提高教学质量。这种背景下,试题库管理系统被提到了,也就是试题的集成,试卷生成,和无纸考试。该系统试题库管理是对提交到数据库中的,大量试题信息进行管理。管理员可以浏览到整个数据库中的试题信息,还可以按照所需的各种条件进行查询,同时具有对查询到的信息数目的统计功能,并可对这些试题进行修改和删除。另外,还可以对用户提交的试卷进行管理,可以查看成绩,可以删除。还能够添加用户,可以更改用户信息,删除信息。该系统界面直观,操作方便,具有很强的实用性。本次设计的软件部分,涉及到的相关知识有:vc++6.0软件设计,odbc数据库连接机技术,以及SQL语言。本论文共部分:二、开发工具和相关知识简介本系统主要是以vc++6.0为开发工具,Access2003作为数据库。2.1Vc++基础VisualC++作为•种程序设计语言,它同时也是一个集成开发工具,提供了软件代码自动生成和可视化的资源编辑功能。在使用VisualC++开发应用程序的过程中,系统为我们生成了大量的各种类型的文件。首先介绍,扩展名为.dsw的文件类型,这种文件在vc中是级别最高的,称为workspace文件。在vc中,应用程序是以project的形式存在的,project文件的扩展名为.dsp,在.dsw文件中可以包含多个.dsp的文件,由workspace文件对他们统一的管理。与dsw类型的文件相配合的一个重要的文件是.opt文件,这个文件保存的是和workspace中用到的有关本机的配置文件,所以不能在不同的计算机上共享。当我们打开一个workspace文件时,如果系统找不到需要的opt文件,就会自动的创建一个与之配合的,包含本地的计算机的信息的opt文件。以clw为扩展名的文件,是用来存放应用程序中用到的类和资源的信息。这些信息是vc中的classwizard工具管理和使用类的信息来源。对应每一个应用程序,有一个readme.txt文件,这个文件中列出了,应用程序中用到的,所有文件的信息,打开查看,就能对应用程序的结构有一个基本的认识。在应用程序中大量应用的是以.h和.cpp为扩展名的文件,以.h的是叫头文件,.cpp的叫实现文件,一般来说,.h和.cpp文件是一一对应的,在.h的文件中是对应的类的定义,.cpp是主要的成员函数的实现代码。在应用程序中经常要用到一些位图、菜单之类的资源。Vc中以.rc为扩展名的文件叫资源文件,其中包含应用程序中用到的所有资源。2.2SQL语言简介SQL是StructedQueryLanguage(结构化查询语言)的英文缩略语,也有人称之为StandartQueryLanguage(标准化查询语言)。SQL语言已经成为国际标准语言。各数据库厂商纷纷推出各自支持SQL的软件以及SQL接口,它是关系数据库无可争议的主流语言。SQL语言之所以被广泛接受和认可,是因为他是一个综合的,通用的,功能强大并且简单易学的语言。它集成了数据定义语言(DateDefintionLanguage,DDL),数据操纵语言(DateManipulationLanguage,DML),数据控制语言(DateControlLanguage)于一身,具有强劲的数据查询(DateQuery)功能。其语言风格统一,简洁凝练且独立完整,并且有良好的可扩充性。SQL既可以独立使用,即独立地在计算机上与数据交互,也可以内含在其他高级语言(如C,BASIC等)中统•编程使用。SQL的核心命令只有9个动词语句,其中属于数据定义的有3个:create,drop和alter。属于数据操纵的有3个:insert,updatefDdelete属于数据查询的有1个:select。属于数据控制的有2个:grant和revote。SQL语言不区分大小写,但对数据,表名和字段名最好统一。三、编译原理试题库系统的需求分析系统的开发背景在当前的信息环境下,随着社会的进步和技术的发展,知识正在发挥着越来越大的作用。企业、机关、学校等各单位想在激烈的竞争环境中立于不败之地,就必须认识到提高竞争力,安徽工业大学也不例外。为了适应以后发展的要求,减轻教师的负担,让老师从繁重的出试卷、改试卷,及管理试卷的劳动中解放出来,让老师全身投入到教学工作中,从而提高教学质量和教学效率。在这种环境下,提出了对试题库系统的需求。系统的可行性研究现在的硬件、软件,及数据库技术已经完全可以支持这样的一个系统的所有需求的实现。在这里,我们选用普通的pc机,编程工具使用vc++6.0,数据库由Access2OO3支持。完全可以满足用户的需求。本系统开发的费用比较低,在交付使用之后,其实用性、方便性,会赢得广大教师的认同。所得的效益完全超过软件的开发费用,此后也就会带来相应的经济效益。本系统具有美观、友好的人机交互界面,采用了问答式与多功能菜单相结合的用户参与方式,对各种输入信息进行提示和帮助。其中大部分的界面都是按照用户的要求定制的,用户操作简便易行。开发过程框图
系统功能分析本系统需要完成的功能主要有:教师登录、考生登录用户管理(记录的新建、修改、删除和定位)题库管理与维护(记录的新建、修改、删除和定位)从题库中自动选择定数量的试题(选择和填空题),生成考盘(随机产生题号,使各考生的题目顺序不--样)作为本次考试的学生考试库答题(选择和填空题),如果中途退出,可再次进入答题环境答题结束退出时,系统可自动评分,评分后不能再进入答题环境,评分时还向用提供答题的相关信息:每类题的得分,出错的试题等管理员身份可以查看用户的考试信息,得分等,能进行维护,可以删除用户的卷信息(已提交试卷)考试结束用户可以查询自己的考试成绩,包括以往的考试(已提交的成绩)四、系统总体设计系统功能模块框图
数据库设计数据库在一个信息管理系统中占有非常重要的地位,数据库设计的好坏将直接对应用系统的效率以及实现的效果产生影响。合理的数据库设计可以提高数据存储的效率,保证数据的完整和一致。同时,合理的数据库结构也将有利于程序的实现。设计数据库系统时应该首先充分了解用户各方面的需求,包括现有的以及将来可能增加的需求。数据库需求分析用户的需求具体体现在各种信息的提供、保存、更新和查询统计,这就要求数据库结构能充分满足各种信息的输出和输入。收集基本数据、数据结构以及数据处理的流程,组成一份详尽的数据字典,为后面的详细设计打下基础针对本系统要求,设计如下的数据项和数据结构:用户信息表:包括的数据项有:用户ID,用户名,用户密码,用户权限。课程章节信息表:包括的数据项有:章节ID,章节名。填空题信息表:包括的字段有:填空题ID,填空题目,填空题答案,所属章节,本题分值。选择题信息表:包括字段:选择题ID,选择题题目,选择题选项A,选择题选项B,选择题选项C,选择题选项D,选择题选项E,选择题选项F,选择题答案,所属章节,分值。试卷信息表:包括字段:试卷项ID,试卷名,试题号,试题类型,考生ID,考生答案。成绩信息表:字段:成绩编号(ID),考生ID,试卷名,考试成绩,交卷标识。数据库结构设计试题库管理系统数据库中各个表格的设计结果如下面的儿个表格所示。每个表格表示在数据库中的一个表。1.用户信息表:user_stu字段名数据类型字段大小主键stuid文本50是stuname文本8否stupwd文本20否user_admi数字长整型否表4.2.2.12.章节表:zhang_tab字段名数据类型字段大小主键zhangid数字长整型否
zhangname 文本 20 是表4.2.2.23.填空题信息表:tiank_tab字段名数据类型字段大小主键tiankid自动编号长整型是tiankbody文本255否tiankdaan文本100看zhangid文本20否tiankfen数字长整型春表4.2.234.选择题信息表:xuanz_tab字段名数据类型字段大小主键Xuanzid自动编号长整型是Xuanzbody文本255否Xuanza文本50否Xuanzb文本50否Xuanzc文本50否Xuanzd文本50否Xuanze文本50否Xuanzf文本50否Zhangid文本20否Xuanzfen数字长整型否Xuanzdaan文本50否表4.2.2.45.试卷信息表:shij_tab字段名数据类型字段大小主键Shijid自动编号长整型是Shitid数字长整型否Shijname文本100否Stuid50否Shitidaan255否Shititype文本50否表4.2.2.56.成绩信息表:chengj_tab字段名数据类型字段大小主键Chengjid自动编号长整型是StuidZ本50否Shijname文本100否Shijfen数字长整型否Handup文本10否表4.2.2.6五、编译原理试题库系统具体实现本系统是用VC6.0生成的单文档结构的应用程序,首先由向导生成一个单文档的应用程序,然后在程序中添加相应的对话框和,在对话框上添加不同的控件来实现不同的功能,产生实现对应功能的外观界面。VC++6.0是面向对象的程序设计语言,每一个功能可以做为一个对象来看待,把特定的功能放在一个对象里实现,有助于简化系统设计。还可以使系统更安全和便于实现。这里,我就把系统的各个功能放到了不同的类里面去实现,还要完成与用户的交互,所以把功能模块用对话框类的派生类来实现,具体由对话框来完成交互,类里的成员函数来完成后台的数据处理。为了与数据库交换数据,要用到MFC数据库访问类,本程序是使用的ODBC来连接数据库。数据库访问是封装的MFC数据库访问类,设顶数据源和本系统用到的封装类如下:在Access2003中,按照上节数据库的设计表,建立数据库,命名为shitiku.mdbo然后打开本机的控制面板,管理工具,数据源(ODBC),如下图:
<1ODBC数据源管理盎用户DSN|系统DSN|文件DSN|驱动程序I跟踪|连接池|关于|用户数据源QI):名称驱动酢添加①)...dBASEFilesExcelFilesMSAccessDatabaseshitiku名称驱动酢添加①)...dBASEFilesExcelFilesMSAccessDatabaseshitikuMicrosoftdBaseDriver(*.MicrosoftExcelDriver(*.MicrosoftAccessDriver(*MicrosoftAccessDriver(*lx.CJ\J,bb£sdd比1mmODBC用户数据源存储了如何与指定数据提供程序连接的信息.用户数据源只对当前用户可见,而且只能用于当前机器上.ODBC用户数据源存储了如何与指定数据提供程序连接的信息.用户数据源只对当前用户可见,而且只能用于当前机器上.确定取消确定取消反用IA帮助注册好ODBC数据源后,就可以在程序中使用ODBC连接数据库,可以动态的更新查询数据库。运行VC++6.0新建工程,命名为TESTING,在第一步选择单文档,其他保持默认值。这样就生成了一个工程,用于本系统的建立。在程序中使用了MFC的数据库类进行了封装,以用于本系统的统一数据库的操作,具体实现代码如下:文件1//generaldef.h#ifndefGEN_DEFINE_HttdefineGEN_DEFINE_H#include"OdbcDB.h"externCOdbcDBg_odbcDB;externCStringUserid;externBOOLHavEx;#endif文件2//GeneralDef.cppttinclude"stdafx.h〃ttincludez,GeneralDef.h〃COdbcDBg_odbcDB;CStringUserid;BOOLHavEx;文件3//OdbcDB.h#ifndefODBC_DB_H#defineODBC_DB_Httinclude<afxdb.h>#include<vector>〃利用vector数组结构构造一维字符串数组typedef::std::vector<CString>CStrs;〃利用vector数组结构构造二维字符串数组typedef::std::vector<CStrs>CDStrs;classCOdbcDB{public:COdbcDB();virtual"COdbcDBO;public:〃数据库连接HRESULTConnect(CStringstrDBSource,CStringstrDBUser,CStringstrDBPwd);〃数据库关闭voidDisconnect();〃判断数据库是否处于打开状态BOOLIsOpenO;〃执行SQL语句HRESULTExecuteSQL(LPCSTRIpszSQL);〃根据SQL语句查询数据库,获取的记录集保存在二维字符串数组中voidExecuteQuery(LPCTSTRIpszSQL,CDStrs&Fields);〃根据SQL语句查询数据库,获取一个字段值voidExecuteQueryValue(LPCTSTRIpszSQL,CString&value);protected:〃数据库对象CDatabasem_db;BOOLm_IsDBOpen;〃数据库是否打开CString m_strDBSource; 〃数据库源CString m_strDBUser; 〃数据库用户名CString m_strDBPwd; 〃数据库用户密码};#endif文件4//OdbcDB.cpp#include"stdafx.h"include“odbcDB.h"#defineDB_NOT_OPEN0x2001〃数据库打开错误#defineDB_NO_RECORD0x2002〃没有数据#defineDB_SAVE_EPG_ERR0x2003〃保存Epg失败#defineDB_SET_BIGBLOK_ERR0x2004〃设置大数据错误#defineDB_NOT_NORMAL0x2005〃数据库打开错误#defineMEMORY_EXCEPTION0x2006//Memory异常#defineMS_OTHER_EXCEPTION0x2007〃其他异常COdbcDB::COdbcDB()(m_strDBSource=_T(,n,);m_strDBUser=_T(,M,);m_strDBPwd=_T("");m_IsDBOpen=FALSE;}COdbcDB:>COdbcDB()BOOLCOdbcDB::lsOpen()(returnm_IsDBOpen;)HRESULTCOdbcDB::ExecuteSQL(LPCSTRIpszSQL)(ASSERT(lpszSQL);TRY(〃执行SQL语句m_db.ExecuteSQL(lpszSQL);}〃异常处理CATCH(CDBException,pEx)returnpEx->m_nRetCode;)AND_CATCH(CException,pEx){returnMS_OTHER_EXCEPTION;}END_CATCHreturnS_OK;}HRESULTCOdbcDB::Connect(CStringstrDBSource,CStringstrDBUser,CStringstrDBPwd)(//InitDBparam,incasereconnectm_IsDBOpen=FALSE;m_db.Close();m_strDBSource=strDBSource;m_strDBUser=strDBUser;m_strDBPwd=strDBPwd;〃构造连接字符串CStringstrDBOpen=_T(巧;strDBOpen.Format("DSN=%s;UID=%s;PWD=%s",strDBSource,strDBUser,strDBPwd);TRY{//连接数据库m_db.OpenEx(strDBOpen,CDatabase::noOdbcDialog);}〃异常处理CATCH(CDBException,ex)(m_IsDBOpen=FALSE;returnDB_NOT_OPEN;)AND_CATCH(CMemoryException,pEx)(pEx->ReportError();m_IsDBOpen=FALSE;returnMEMORY_EXCEPTION;)AND_CATCH(CException,e)(m_IsDBOpen=FALSE;returnMS_OTHER_EXCEPTION;END_CATCHm_IsDBOpen=TRUE;returnS_OK;)voidCOdbcDB::DisConnect()(mJsDBOpen=FALSE;m_db.Close();}voidCOdbcDB::ExecuteQueryValue(LPCTSTRlpszSQL,CString&value)(if(!m_db.IsOpen()){return;}TRY{CRecordsetrs(&m_db);〃打开记录集.rs.Open(CRecordset::dynaset,IpszSQL);if(!rs.IsEOF()){rs.GetFieldValue((short)0,value);)rs.Close();}〃异常处理CATCH(CDBException,ex)(AfxMessageBox(ex->m_strError);AfxMessageBox(ex->m_strStateNativeOrigin);)AND_CATCH(CMemoryException,pEx)(pEx->ReportError();AfxMessageBox("memoryexception");)AND_CATCH(CException,e)(TCHARszError[100];e->GetErrorMessage(szError,100);AfxMessageBox(szError);)END_CATCHvoidCOdbcDB::ExecuteQuery(LPCTSTRlpszSQL,CDStrs&Fields)(if(!m_db.IsOpen()){return;}TRY{CRecordsetrs(&m_db);〃打开所有的信息记录.rs.Open(CRecordset::dynaset,IpszSQL);while(!rs.IsEOF()){CStrsstrs;CStringtemp;〃获取一条记录中的所有字段值保存到字符串数组strs中for(shorti=0;i<rs.m_nResultCols;i++){rs.GetFieldValue((short)i,temp);strs.push_back(temp);}〃保存一条记录到二维字符串数组中Fields.push_back(strs);〃转到下一条纪录rs.MoveNext();)rs.Close();}〃异常处理CATCH(CDBException,ex)(AfxMessageBox(ex->m_strError);AfxMessageBox(ex->m_strStateNativeOrigin);)AND_CATCH(CMemoryException,pEx)(pEx->ReportError();AfxMessageBox("memoryexception");)AND_CATCH(CException,e)(TCHARszError[100];e->GetErrorMessage(szError,100);AfxMessageBox(szError);)END_CATCH以上是用于数据库操作的封装类,只要在本系统的工程中引入上面四个文件
generaldef.h,GeneralDef.cpp,OdbcDB.h,OdbcDB.cpp,然后在系统的stdafx.h文件中加上#include"GeneralDef.h〃就可以在本工程中的所有类中使用对象g_odbcDB进行数据库操作了。1系统登录系统登录,是系统安全的关口,可以限制没有操作权限的用户对系统的重要信息的更改,所以在登录窗口中要对用户的合法性进行检查,还要对用户的权限进行确定。所以要在用户输入用户名和密码后,查询数据库来确认用户合法性,和赋予用户对应的权限,关于用户的权限和用户信息都放在表:userstu:字段名数据类型字段大小主键stuid文本50是stuname文本8否stupwd文本20否user_admi数字长整型否用户登录界面要简洁明了,其中的图片是要从外部引入,效果如下:对应的对话框要接受用户名和密码,然后查询数据库表,来进行确认,并读取usejadmi字段来设定用户的权限。如果,没有通过确认,则提示用户:用户名或密码有错。本对话框为了更容易操作,在登录对话框的初始化中把用户表中的用户名读取出来,放到用户名栏(接受用户名的控件是一个可以下拉的组合框);对应对话框的的控件绑定的变量如下:IFCClassVizardMessageMapsMemberVariablesAutomation|ActiveXEvents|Project:Classname:testing二CLoginDIgD:\...Vesting\LoginDlg.h,D:\...Vesting\LoginDlg.cppControlIDs:Type MemberIlDCCOMBOCStrinq mstrllserIDC_COMBOIDC二EDITIDC-EDITCComboBox m_ctrlUserCString mstrPwdCEdit mstrlPwd给对话框的登录按钮添加消息响应函数:OnOk();为对话框添加初始化函数:OnlnitDialogO;Memberfunctions:VDoDataExchangeWOnCancel ON_IDCANCEL:BN_CLICKEDOnlnitDialogON_WM_INITDIALOGWOnOK ON_IDOK:BN_CLICKEDDescription:Senttoadialogboxbeforethedialogboxisdisplayed实现代码如下:BOOLCLoginDlg::OnInitDialog()(CDialog::OnInitDialog();CDStrsm_name;CStringstrSQL;UpdateData(TRUE);//strSQL.Format(""select*frompasswordwhereuser='%s'ANDpasswd=,%s'〃,m_strUser,m_strPass);strSQL="selectstuidfromuser_stu〃;g_odbcDB.ExecuteQuery(strSQL,m_name);for(inti=0;i<m_name.sizeO;i++){CStrsstrs=m_name[i];m_ctrlUser.AddString(strs[0]);//returnTRUEunlessyousetthefocustoacontrol//EXCEPTION:OCXPropertyPagesshouldreturnFALSE)//TODO:AddextrainitializationherereturnTRUE;//returnTRUEunlessyousetthefocustoacontrol//EXCEPTION:OCXPropertyPagesshouldreturnFALSEvoidCLoginDlg::0n0K()(//TODO:AddextravalidationhereCDStrsvalue;CStringstrSQL;CTestingApp*ptheApp=(CTestingApp*)AfxGetAppO;UpdateData(TRUE);〃检查用户名是否输入if(m_strUser.IsEmpty())(AfxMessageBox(”请输入用户名!〃);m_ctrlUser.SetFocus();return;)if(m_strPwd.IsEmpty())(AfxMessageBox(“请输入密码!〃);m_strlPwd.SetFocus();return;)〃从用户表中检查用户名密码是否正确ANDstrSQL.Format(z,select*fromuser_stuwherestuid=,stupwd='%s'",m_strUser,m_strPwd);ANDg_odbcDB.ExecuteQuery(strSQL,value);if(value,size()==0)(〃密码错误处理MessageBox(〃密码错误,请重新输入“);m_strPwd="〃;m_strlPwd.SetFocus();UpdateData(FALSE);)else(〃分配用户权限if(value[0][3]=="z0,z)
ptheApp->m_bIsAdmin=FALSE;elseptheApp->m_bIsAdmin=TRUE;Userid=m_strUser;CStrsstrs;CDStrsstrShijName;strSQL.Format(zzselectshijnamefromchengj_tabwherestuid=,%s,andhandup=,no'",Userid);godbcDB.ExecuteQuery(strSQL,strShijName);if(strShijName.size()!=0)(HavEx=TRUE;)else(HavEx=FALSE;)CDialog::0n0K();试题库系统主界面用户登录后,要出现一个主界面,用户的所有操作都在这里实现。主界面包括了菜单的设计,和工具栏的设计:菜单如下:系统管理试题管理试卷管理成绩管理系统管理试题管理试卷管理成绩管理系统管理试题管理试卷管理成绩管理系统管理试题管理试卷管理成绩管理用尸言埋更改用户系统管理试题管理试卷管理成绩营理系统管理试题管理试卷管理成绩管理用尸言埋更改用户系统管理试题管理试卷管理成绩营理系统管理试题管理试卷管理成绩管理近岸题音理埴空题管理退出系统匚一 "■二二……1成绩官•成绩官•埋在菜单的设计中,给每一个菜单设定一个不同的ID,但是工具栏的设计中要用到菜单的ID,对应特定的菜单的工具按钮,是为了实现菜单功能的一个快捷途径。所以工具栏按钮的ID都对应一个菜单项。西劭■⑥虫理为心智工具栏设计:要使用数据库中的表中的信息,要在程序运行前的初始化中连接数据库,所以要在主程序的初始化函数BOOLCTestingApp::InitlnstanceO中添加如下语句:CStringa,b,c;a="shitiku”;g_odbcDB.Connect(a,b,c);AfxEnableControlContainer();要控制系统安全,必须使登录界面早于主界面运行,所以要在主程序初始化函数中上面的语句后添加如下代码:CLoginDlgloginDlg;ifdoginDlg.DoModal()!=IDOK)(returnFALSE;)并且在主程序的CTstingApp.cpp文件开始处添加#include"LoginDlg.h",声明对CLoginDlg的对象的使用。要处理用户对菜单和工具条按钮的操作信息,要在主框架类CMainFrame的CPP文件中添加对应按钮和菜单的COMMAND消息响应函数:并且要在主程序中添加一个变量BOOLm_bIsAdmin用来标识管理员用户,在非管理员和管理员不能同时使用的功能,要给对应的菜单添加UPDATECOMMACDUI类型的消息响应函数,并且在菜单的pCmdUI-〉Enable();函数中用主函数CTstingApp中的变量mbisAdmin作为pCmdUI->Enable();的参数,就能限制非管理员用户使用对应的菜单。关于添加菜单响应函数,如下图:1FCClassVizardMessageMapsMemberVariables|Automation|ActiveXEventsClassInfo|Project:Classname:Addtesting▼|CMainFramedD:\...\testing\MainFrm.h,D^...\testing\MainFrm.q)pAdiObjectIDs:Messages:DeleIDFILEPRINT■COMMANDIDFILESAVEUPDATECOMMANDUIEIDNEXTPANEID_PREV_PANEBlIDSYSBMANAG■IID_SYS_CHENGJ|IDSYS_CHOOSEMemberfunctions:皿OnSysChooseON_ID_SYS_CHOOSE:COMMAND■细WOnSysExamON_ID_SYS_EXAM:COMMANDWOnSysQuitON_ID_SYS_QUIT:COMMANDsiWOnSysReloadON_ID_SYS_RELOAD:COMMANDWOnSysTmanag0N_ID_SYS_TMANAG:COMMANDDescription:Handleacommand(frommenu,acceLcmdbutton)确定函数具体实现如下:voidCMainFrame::OnSysQuit(){//TODO:Addyourcommandhandlercodehereif(AfxMessageBox(,z您确定要退出系统吗?”,MB_OKCANCEL)==IDCANCEL)(return;)CFrameWnd::0nClose();voidCMainFrame::OnSysReload()(//TODO:AddyourcommandhandlercodehereCLoginDlgDig;Dig.DoModal();voidCMainFrame::OnSysUser()//TODO:AddyourcommandhandlercodehereCUserDlgUserDlg;UserDlg.DoModal();)voidCMainFrame::OnUpdateSysUser(CCmdUI*pCmdUI){//TODO:AddyourcommandupdateUIhandlercodehereCTestingApp*ptheApp=(CTestingApp*)AfxGetAppO;pCmdUI->Enab1e(ptheApp->m_bIsAdmin);)voidCMainFrame::OnSysTmanag()(//TODO:AddyourcommandhandlercodehereCTmanagDlgTmanagDlg;TmanagDlg.DoModal();voidCMainFrame::0nClose(){//TODO:Addyourmessagehandlercodehereand/orcalldefaultif(AfxMessageBox(,z您确定要退出系统吗?〃,MB_OKCANCEL)==IDCANCEL)(return;)CFrameWnd::0nClose();)voidCMainFrame::OnUpdateSysTmanag(CCmdUI*pCmdUI)(//TODO:AddyourcommandupdateUIhandlercodehereCTestingApp*ptheApp=(CTestingApp*)AfxGetAppO;pCmdUI->Enab1e(ptheApp->m_bIsAdmin);)voidCMainFrame::OnSysBmanag(){//TODO:AddyourcommandhandlercodehereCBManagD1gBmanagD1g;BmanagDlg.DoModal();voidCMainFrame::OnUpdateSysBmanag(CCmdUI*pCmdUI)(//TODO:AddyourcommandupdateUIhandlercodehereCTestingApp*ptheApp=(CTestingApp*)AfxGetAppO;pCmdUI->Enable(ptheApp->m_bIsAdmin);}voidCMainFrame::OnSysChoose()(//TODO:AddyourcommandhandlercodehereCChooseDlgChooseDlg;ChooseDlg.DoModal();)voidCMainFrame::OnSysExam()(//TODO:AddyourcommandhandlercodehereCExamDlgExamDlg;ExamDlg.DoModal();)voidCMainFrame::OnUpdateSysChoose(CCmdUI*pCmdUI)(//TODO:AddyourcommandupdateUIhandlercodeherepCmdUI->Enable(!HavEx);)voidCMainFrame::OnUpdateSysExam(CCmdUI*pCmdUI)(//TODO:AddyourcommandupdateUIhandlercodeherepCmdUI->Enable(HavEx);)voidCMainFrame::OnSysChengj()(//TODO:AddyourcommandhandlercodehereCChengJMChengjDlg;ChengjDlg.DoModal();voidCMainFrame::OnUpdateSysChengj(CCmdUI*pCmdUI)(//TODO:AddyourcommandupdateUIhandlercodehereCTestingApp*ptheApp=(CTestingApp*)AfxGetAppO;pCmdUI->Enable(ptheApp->m_bIsAdmin);)主框架类的包含文件如下:(需要手动输入,放在MainFrm.cpp文件开始处)#include"ChooseDlg.h〃ttinclude"BManagDlg.h〃#include"LoginDlg.h〃#include"UserDlg.h〃#include"TmanagDlg.h"#include"ExamDlg.h〃#include"chengjm.h"试题管理对话框在这两个对话框中可以进行试题的添加、修改、删除操作,另外还有查询试题功能,可以很方便用户的试题管理。用户在进行试题管理,还要能动态看到更改的结果,要在对话框的内部给出操作代码,只有这样才能给用户一个尽量友好的界面。在进行数据库操作时要小心数据库字段名的拼写;还要注意,用于数据库操作的SQL语句的格式,在VC++6.0中SQL语句的格式化中,字符串要用单引号,还有条件格式也不尽相同。试题管理模块,是管理员用户对试题进行维护的•个模块,可提供试题的添加、删除、修改。这里也要用数据库管理类,本程序的公有变量g_0dbeDB的成员函数可以提供对数据库表的添加、删除、修改操作。这里要给对话框上的控件添加变量。选择和填空不完全一样,下面分别说明:填空题管理对话框界面效果如下图:
给控件绑定变量,如下图所示:ControlIDs:TypeMemberIDCBUTTONUPDATEIDC_COMBO_BCStringm_strZhangidIDC_COMBO_BCComboBoxmctrZhangidIDCEDITCOUNTintmintCountIDCEDITFENintmintFenIDC_EDIT1CStringm_strBBodyIDC_EDIT1CEditm_ctrBBodyIDCEDIT2CStringmstrBAnswerIDCEDIT2CEditmctrBAnswerIDCLISTBIDCListCtrlmListBidIDCANCEL竺给控件绑定变量要注意变量的类型,不要搞错了,在绑定好类型后只要用对话框类的UPDATEDATA();函数就可以把控件的值传给对应的变量,UPDATEDATA(FALSE);就可以把变量的值传给控件。这就是与用户交互的手段之一,然后就可以由得到的信息对数据库进行操作了。为了能按用户的操作完成响应的功能,要在对话框中来完成,给新建、修改、删除添加处理函数。还要给对话框添加初始化函数来完成一些必须的初始化工作:MessageMaps|MemberVariables|Automation|ActiveXEvents|ClassInfo|Project: Classname: A[testing [cBManagDIgD:\..Atesting\BManagDlg.h,D:\...\testing\BManagDlg.cpp ObjectiDs: Messages: DiID_SYS_CHOOSEid[sys[examID_SYS_QUITID_SYS_RELOADID_SYS_TMANAGIDSYSUSERBNCLICKEDBN_DOUBLECLICKEDIDC_BUTTON_CL EMemberfunctions:皿OnButtonCI ON_IDC_BUTTON_CL:BN_CLICKEDVWOnButtonDelet ONJDC_BUTTON_DELET:BN_CLICKEDWOnButtonUpdate ONJDC_BUTTON_UPDATE:BN_CLICKEDWOnClickListBid ONJDC_LIST_BID:NM_CLICKWOnlnitDialog ON_WM_INITDIALOG用来响应用户的操作,完成添加删除等功能。具体的函数代码如下:voidCBManagDIg::OnButtonCl()(//TODO:Addyourcontrolnotificationhandlercodeherem_strBBody=,,n;m_strBAnswerm_intFen=0;m_strZhangid="”;m__strUser=,M,;UpdateData(FALSE);)voidCBManagDIg::OnButtonDelet()//TODO:AddyourcontrolnotificationhandlercodehereCStringoutprint;UpdateData(TRUE);inti=m_ListBid.GetSelectionMark();m_strUser=m_ListBid.GetItemText(i,O);〃判断是否指定用户if(m_strUseu=""){MessageBox("请选择一个试题!”);return;)outprint.Format(n您确定要删除 %s试题%s???,,,m_strZhangid,m_strUser);if(AfxMessageBox(outprint,MB_OKCANCEL)==IDCANCEL){return;)CStringstrSQL;strSQL.Format(ndeletefromtiank_tabwheretiankid=%du,atoi(m_strUser));〃删除该用户g_odbcDB.ExecuteSQL(strSQL);〃刷新用户列表RefreshData();m_strBBody=,M,;m__strBAnswer=M";m_intFen=0;UpdateData(FALSE);}voidCBManagDlg::OnButtonUpdate()(//TODO:AddyourcontrolnotificationhandlercodehereUpdateData(TRUE);CStringstrSQL;if(m_strUser=="H)MessageBox("请选择一个试题!”);return;if(m_intFen<1Hm_intFen>10){MessageBox("请设置合适的试题分值(1〜10)!!");return;)if(m_strBBody==""){MessageBox("请填写试题内容!!");m_ctrBBody.SetFocus();return;)if(m_strBAnswer==""){MessageBox("请填写试题内容!!");m_ctrBAnswer.SetFocus();return;}if(m_strZhangid=="全部试题”)(MessageBox("请选择试题所在章节!!”);return;)CStringoutprint;outprint.Format(n您确定要修改 %s试题%s???n,m_strZhangid,m_strUser);if(AfxMessageBox(outprint,MB_OKCANCEL)==IDCANCEL)(return;}strSQL.Format(Hupdatetiank_tabsettiankbody=,%s,,tiankdaan=,%sH,",zhangid=*%s1,tiankfen=%dwheretiankid=%d",m_strBBody,m_strBAnswer,m_strZhangid,m_intFen,atoi(m_strUser));TRACE(strSQL);g_odbcDB.ExecuteSQL(strSQL);RefreshData();)voidCBManagDlg::OnSelchangeComboB()(//TODO:AddyourcontrolnotificationhandlercodehereUpdateData();RefreshData();}voidCBManagDlg::OnClickListBid(NMHDR*pNMHDR,LRESULT*pResult)(//TODO:AddyourcontrolnotificationhandlercodehereCDStrsuser_tab;CStringstrSQL;UpdateData(TRUE);〃从数据库中获取选择用户名的资料inti=m_ListBid.GetSelectionMark();m_strUser=m_ListBid.GetItemText(i,O);if(m-strUser!=,M,)(strSQL.Format("select*fromtiank_tabwheretiankid=%dn,atoi(m_strUser));g_odbcDB.ExecuteQuery(strSQL,user_tab);〃显示用户资料if(user_t<ib.size==O){return;)CStrsstrs=user_tab[O];m_strBBody=strs[l];m_strBAnswer=strs[2];m_strZhangid=strs[3];m_intFen=atoi(strs[4]);UpdateData(FALSE);*pResult=0;}voidCBManagDlg::OnOK()(//TODO:AddextravalidationhereUpdateData();if(m_strBBody==,M,llm_strBAnswer==n")(MessageBox("请填写试题内容和答案!!”);m_ctrBBody.SetFocus();return;)if(m_strZhangid=="全部试题"){MessageBox("请选择试题所在章节!!");return;}if(m_intFen<lHm_intFen>10){MessageBox("请设置合适的试题分值(1~10)!!");return;}if(AfxMessageBox("您确定要添力口试题?”,MB_OKCANCEL)==IDCANCEL)return;}CStringstrSQL;strSQL.Format("Insertintotiank_tab(tiankbody,tiankdaanH”,zhangid,tiankfen)”“values(",H%sV%sV%s\%d),;m__strBBody,m_strBAnswer,m_strZhangid,m_intFen);TRACE(strSQL);g_odbcDB.ExecuteSQL(strSQL);RefreshData();)BOOLCBManagDlg::OnInitDialog()(CDialog::OnInitDialog();m_strZhangid="全部试题”;m_ListBid.InsertColumn(OJ填空题号");m_ListBid.SetExtendedStyle(LVS_EX_FULLROWSELECTILVS_EX_GRIDLINES);m_ListBid.SetColumnWidth(0,120);CDStrsstuid;CStringstrSQL;〃打开记录集strSQL.Format("selectzhangid,zhangnamefromzhang_taborderbyzhangid");g_odbcDB.ExecuteQuery(strSQL,stuid);m_ctrZhangid.InsertString(O,m_strZhangid);for(inti=O;i<stuid.size();i++)(CStrsstrs=stuid[i];m_ctrZhangid.InsertString(i+1,strs[l]);)RefreshData();//TODO:AddextrainitializationherereturnTRUE;//returnTRUEunlessyousetthefocustoacontrol//EXCEPTION:OCXPropertyPagesshouldreturnFALSE)voidCBManagDlg::RefreshData()(m_ListBid.SetFocus();〃清空用户列表m_ListBid.DeleteAHItems();m_ListBid.SetRedraw(FALSE);CDStrsstuid;CStringstrSQL;strSQL.Format(Mselecttiankidfromtiank_tabwherezhangid=%s,orderbytiankidn,m_strZhangid);if(m_strZhangid=="全部试题”)(strSQL.Format('*selecttiankidfromtiank_taborderbytiankid'*);)g_odbcDB.ExecuteQuery(strSQL,stuid);for(inti=O;i<stuid.size();i++){CStrsstrs=stuid[i];m_ListBid.InsertItem(i,strs[O]);)m_intCount=i;UpdateData(FALSE);m_ListBid.SetRedraw(TRUE);}这里要说明一下,在上面的函数中有一个是voidCBManagDlg::RefreshData();它不是消息响应函数,它的作用就是更新对话框控件数据,可以减少代码量,所有的操作都要对数据库进行更新,更新后的结果要及时的反馈给用户,所以这个函数的作用就是把更改的结果在对话框中显示出来。在下面的选择题管理中同样有这个函数,不过函数的实现代码不同,但是功能是类似的。5.3.2选择题管理选择题管理的对话框外观如下,利用它可以很好管理试题信息:
给控件绑定变量,如下图所示:MessageMapsMemberVariablesAutomationActiveXEventsClassInfo|Project: Classname:AddAddDektesting 二]|CTmanagDlg ▼D:\...\testing\TmanagDlg.kD:\...\testing\TmanagDlg.cppControlIDs: Type MemberIDCCOMBO CComboBoxmCtrComZUpdzIDC_EDIT_COUNT int mJntCountIDCZeDITZfEN int mjntFenIDC_EDIT1 CString m_strXBodyIDC2EDITI CEdit mZctrXBodyIDC_EDIT2 CString m_strAnsAIDC_EDIT3 CString m_strAnsBIDC_EDIT5 CString m_strAnsCIDC_EDIT6 CString m_strAnsDIDC__EDIT7 CString m_strAnsEIDC_EDIT8 CString m__strAnsF ▼ID_SYS_RELOADID_SYS_TMANAGIDSYSUSER4IDCBUTT0N1IDC_BUTTON2IDC-BUTTON3ObjectiDs:BNDOUBLECLICKEDBNCLICKEDObjectiDs:BNDOUBLECLICKEDBNCLICKEDMessageMapsMemberVariablesAutomationActiveXEventsClassInfoProject: Classname: Md(testing 二| {CTmanagDIg 二]D:\...\testing\TmanagDlg.kD:\...\testing\TmanagDlg.cpp DeltMessages:具体的函数代码如下:BOOLCTmanagDIg::OnInitDiaIog()(CDialog::OnInitDialog();//TODO:Addextrainitializationherem_strZhangid="全部试题”;m_ctrListTid.!nsertColumn(0,"选择题号)m_ctrListTid.SetExtendedStyle(LVS_EX_FULLROWSELECTILVS_EX_GRIDLINES);m_ctrListTid.SetColumnWidth(0,120);CDStrsstuid;CStringstrSQL;〃打开记录集strSQL.Format("selectzhangid,zhangnamefromzhang_taborderbyzhangid");g_odbcDB.ExecuteQuery(strSQL,stuid);m_CtrComZ.InsertString(0,m_strZhangid);for(inti=0;i<stuid.size();i4-+)(CStrsstrs=stuid[i];m_CtrComZ.InsertString(i+1,strs[1]);)RefreshData();returnTRUE;//returnTRUEunlessyousetthefocustoacontrol//EXCEPTION:OCXPropertyPagesshouldreturnFALSEvoidCTmanagDlg::OnClickListTid(NMHDR*pNMHDR,LRESUET*pResult)(//TODO:AddyourcontrolnotificationhandlercodehereCDStrsuser_tab;CStringstrSQL;UpdateData(TRUE);〃从数据库中获取选择试题的资料inti=m_ctrListTid.GetSe!ectionMark();m_strUser=m_ctrListTid.GetItemText(i,O);if(m_strUser!=nn){strSQL.Format(nselect*fromxuanz_tabwherexuanzid=%dM,atoi(m_strUser));g_odbcDB.ExecuteQuery(strSQL,user_tab);〃显示试题资料if(user_tab.size==O)(return;}CStrsstrs=user_tab[O];m_strXBody=strs[l];m_strAnsA=strs[2];m_strAnsB=strs[3];m__strAnsC=strs[4];m_strAnsD=strs[5];m_strAnsE=strs[6];m_strAnsF=strs[7];m_intFen=atoi(strs[9]);m_strZhangid=strs[8];m_strAnswer=strs[10];CharToInt();}UpdateData(FALSE);*pResult=0;}voidCTmanagDlg::RefreshData()(m_ctrListTid.SetFocus();〃清空试题列表m_ctrListTid.DeleteAHItems();m_ctrListTid.SetRedraw(FALSE);CDStrsstuid;CStringstrSQL;strSQL.Format(nselectxuanzidfromxuanz_tabwherezhangid='%s'orderbyxuanzid'\m_strZhangid);if(m_strZhangid=="全部试题”){strSQL.Format(nselectxuanzidfromxuanz_taborderbyxuanzid11);)g_odbcDB.ExecuteQuery(strSQL,stuid);for(inti=O;i<stuid.size();i++)(CStrsstrs=stuid[i];m_ctrListTid.InsertItem(i,strs[O]);}m_intCount=i;UpdateData(FALSE);m_ctrListTid.SetRedraw(TRUE);)voidCTmanagDlg::OnButton3()(//TODO:Addyourcontrolnotificationhandlercodehere//TODO:AddyourcontrolnotificationhandlercodehereUpdateData(TRUE);CStringoutprint;outprint.Format(H您确定要删除 %s试题%s???n,m_strZhangid,m_strUser);inti=m_ctrListTid.GetSelectionMark();m_strUser=m_ctrListTid.GetItemText(i,O);〃判断是否指定试题if(m_strUsei^=""){MessageBox("请选择一个试题!");return;)if(AfxMessageBox(outprint,MB_OKCANCEL)==IDCANCEL){return;)CStringstrSQL;strSQL.Format("deletefromxuanz_tabwherexuanzid=%d",atoi(m_strUser));〃删除该试题g_odbcDB.ExecuteSQL(strSQL);〃刷新试题列表RefreshData();m_strXBody="n;m__strAnsA=,M,;m_strAnsB=,M';m_strAnsC=,,n;m_strAnsD=,,n;m_strAnsE=un;m_strAnsF="H;m_intFen=0;UpdateData(FALSE);}voidCTmanagDlg::OnButtonQuXiao()(//TODO:Addyourcontrolnotificationhandlercodeherem_strXBody=,M,;m_strAnsA=,n,;mstrAnsB="”;m_strAnsC=tM,;m_strAnsD="H';m_strAnsE="n;m
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 【课件】部编语文三上14 不会叫的狗【国家级】一
- 学校安全网格化管理培训
- 《隋唐社会生活》课件
- AI服务器BOM表解密报告
- 会计专业认知与职业规划
- 适老智能家居技术路线设计
- 《线性规划研究生》课件
- 压缩空气的安全培训
- 性格的形成和发展微电影分库周欣然
- 社区工作价值观社会工作专业教学案例宝典
- GB/T 14480.3-2008无损检测涡流检测设备第3部分:系统性能和检验
- GB/T 12755-2008建筑用压型钢板
- GB/T 12611-1990金属零(部)件镀覆前质量控制技术要求
- 钢框架结构优秀毕业设计计算书
- 第四讲马克思主义的唯物辩证法课件
- 尿崩症护理查房
- 二年级语文上册 第八单元 集体备课+教材分析
- 2022秋国开农村社会学形考任务3试题及答案
- 《劳动关系协调员》教学计划及教学大纲
- 中国历史文化名城-南京课件
- 城市桥梁安全性评估规程DB50-T 273-2021
评论
0/150
提交评论