ImageVerifierCode 换一换
格式:DOCX , 页数:28 ,大小:285.93KB ,
资源ID:8009900      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/8009900.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(Delphi 下IntraWeb网络考试系统开发综合实例.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

Delphi 下IntraWeb网络考试系统开发综合实例.docx

1、Delphi 下IntraWeb网络考试系统开发综合实例Delphi 2006下IntraWeb网络考试系统开发综合实例第一天:制定数据库结构(test.mdb)表一:Stuser(记录学生用户资料)字段名字段类型长度备注realname文本12真实姓名Userid文本12用户编号(各学校统一)有索引,唯一Userpass文本10用户密码userClass文本6班级(如200501指2005年入学6班)Seri文本2学生的学号status文本用户状态Sexid文本2性别school文本4学校代码序号自动编号提高建议:可以加个积分字段,把学生每次练习和测试或其它活动的成绩累积起来,以此在首页上排

2、名,这样的话更能促使学生自觉地进行练习与测试。表二:Teuser(记录教师及管理员资料)字段名字段类型长度备注Username文本12用户帐号,有索引,唯一realname文本用户的真实姓名Userpass文本10用户密码school文本20所在学校Subject文本12任教科目userphone文本15联系电话Sexid文本2性别序号自动编号表三:Papername(记录试卷名称、科目及具体题目的数量及分值)字段名字段类型长度备注序号自动编号papername文本30试卷名bywho文本12输入者inputtime文本12输入时间Subject文本10试卷所属科目status文本4试卷状态(

3、练习、删除、考试、统考)isrepeat是否是否能重复进行测试Singleti数字字节单选题数量Singlescore数字字节分值Multi数字字节多选题数量Mulscore数字字节分值Fillti数字字节填空题数量Fillscore数字字节分值judgeti数字字节判断题数量judgescore数字字节分值canrandom是否试题是否能随机顺序出卷在这里出卷的时候就可以设置好基本的参数,如是否可以随机顺序,因为有的题目必须按一定顺序出,就不能用随机组卷的方法来考试。统考由管理员或教师设定,删除只能由管理员作最后处理,教师可以删除自己出的卷,但只是假删除,完全删除要由管理员执行。表四:Sys

4、set(设置与记录考试试卷的主要参数)字段名字段类型长度备注Paperid长整数30试卷编号Trainstatus是否练习开关状态Teststatus是否测试开关状态Mustlog是否是否必须是注册用户checkpm是否考试完毕后是否能查看排名可以多套试卷同时存在,每套试卷有独立的参数控制,为减少数据库重复及节约数据空间,试卷名用编号而不用文本,不然的话字节长度比个字节长度要大得太多了!表五:Tiku(具体试卷题目)字段名字段类型长度备注Contentmemo题干Type文本4题型Key1文本200选择1Key2文本200选择2Key3文本200选择3Key4文本200选择4Key5文本200

5、选择5Turekey文本200正确答案paperid长整数papername表里的自动编号程序中可以是对四种题型进行试卷编制,但在此范例程序中只对选择题(单选和多选)进行示范。表六:Result(用户测试及练习的成绩)字段名字段类型长度备注编号自动编号Username文本10用户名Userid文本12用户编号(唯一)paperstatus文本4试卷类型Testtime文本16测试开始时间usetime文本5测试所用时间Percent文本4正确率Paperid长整数试卷编号(唯一)Userip数字整型测试机tinum数字整型总题量numright数字整型正确数量Point数字整型成绩2007-2

6、-2第二天:登陆窗口的制作与代码实现环境:Delphi for win32 + IntraWeb8.0File-New-Other-Intraweb Application Wizard,出现如下窗口(新建程序.jpg),(参数.jpg)确定,进入Delphi界面,可以看到有四个文件选项(还有一个是Delphi的欢迎窗口,如图),我们在这一阶段要做的就是用Unit1来做登陆界面,而UsersessionUnit是IW程序中线程控制的关键单位,我们的所有数据库链接都放在上面,所有session由IW自动管理,我们只要把表面的工作做好就行了。到IW standard中拖出一个TIWregion控件

7、,作用是像在中的表格,用来定位,这是我比较喜欢的做法,再拖入TIWLabel 、TIWEdit和 TIWButton控件各两个,还可以放入一个标签来做网站名,最后效果如图:(图)注意:密码输入的文本框要把密码提示(PasswordPrompt)打开,不然谁愿意明码输入自己的密码?类型那一个下拉控件是为了使学生和教师在同一个窗口实现登陆的,记得在Items属性中加入学生用户和教师用户两行属性值。运行的效果图如下:(登陆效果图)接下来,我们来用代码实现从数据库中验证用户并完成登录:我们从dbGo工具栏中把TADOconnection(按自己习惯改名,我把它改成con1)和TADOQuery(改名为

8、qry1)两个控件拖到UserSession单元中,选择con,编辑Database-ConnectionString,点击编辑数据库的连接字符串,建议大家先把第一天做好的数据库文件放到应用程序所在的目录下。(两数据连接图)看出这两张图中所演示的连接路径有什么不同没有?左边的是绝对路径,而右边的用的是相对路径,右边的才是我们要的结果!为了布署方便,我们把数据库文件和应用程序文件放在同一目录下。所以上面的路径由“.datatest.mdb”就变成了“test.mdb”。回到Unit1单元的界面,点击:File-Use Unit,选择Usersession,因为我们要在这个单元调用Usersess

9、ionUnit的数据控件,所以要在程序中引用该单元文件。再拖入一个TADOQuery控件,设置Qry1的Connection为IWusersession-con1,到这里,我们就做好了程序与数据库的连接了。如果调试时出现以上错误,说明在ServerController单元中还有一个重要的参数没有设置,选择ServerController单元,在设计模式下到Properties属性栏中,找到ComInitialization,选择为MultiThreaded。再运行测试就不会有这个错误提示了。代码实现:登陆按钮的代码:procedure TIWForm1.IWButton1Click(Sende

10、r: TObject);var un:integer; /设置一个整数变量,用来记录查询的记录数,而不是反复做同一查询和统计。begin /判断用户信息的有效性if (iwedit1.Text=) or (iwedit2.Text=) then /如果用户名或密码有一个是空的话触发动作begin webapplication.ShowMessage(请输入完整的帐号或密码!); /显赫警告信息 exit; /退出操作,不进行下一步动作end;qry1.Close; / 关闭查询qry1.SQL.Clear; /将查询语句全部清空if iwcombobox1.ItemIndex1 then /通

11、过类型下拉框的值判断是学生用记还是教师用户登录begin /选择学生用户时查询suser表qry1.SQL.Add(select * from suser where userid=+quotedstr(iwedit1.text)+ and userpass=+quotedstr(iwedit2.Text);endelsebegin /选择教师用户时查询user表qry1.SQL.Add(select * from tuser where username=+quotedstr(iwedit1.text)+ and userpass=+quotedstr(iwedit2.Text);end;q

12、ry1.Connection.Connected:=true; /激活数据库连接控件qry1.Open; /执行查询un:=qry1.RecordCount; /统计查询到的记录数量,并把数值赋于变量/ if qry1.RecordCountbeginif un=0 then begin webapplication.ShowMessage(没有此用户);/如果没有记录说明没有此用户,并给出提示。end else webapplication.ShowMessage(用户存在!);/记录不为,说明用户的信息正确可以进入下一操作Tfrmselect.create(webapplication).

13、show ; /构建选择窗口并显示此窗口end;说明:如何显示下一窗口?Tfrmselect.create(webapplication).show ;这一句是在中显示另一个窗口的语法格式,关键是Tfrmselect怎么定的,这就要根据你下一个想显示的窗口是什么名称了。现在先为明天的工作作个前期准备:点击File - New Other New Form Application Form OK,这样就建立了一个新的Form。把此窗口的名称改为容易记的名字,如Frmselect(这就是上面的显示下一窗口要用的名称!),保存文件,文件名也用个容易记的,如select ,后缀名不用理它,给软件自动加

14、上。确定现在是在Unit1页面上,然后点击:File Use Unit 选择刚才保存的文件Select.dfm。,运行测试,当用户信息正确后就能够进入到下一个窗口了。 2007-2-3第三天:选择试卷窗口的设计与代码实现今天的任务量比较大,涉及到usersession的运用、SQL查询、数据显示、窗口跳转、今天要实现的是把用户登录后从数据库检索出来的信息放入到Session中,在选择窗口中显示用户的真实姓名以增加程序的人性化,然后用户可以在此窗口中检索各科的练习卷或考试卷并进入相关测试。这里与数据库的交互操作很多,是整个程序中最重要的部分之一。界面效果如下,有的控件是在下一次工作时再起作用的:

15、第一部分:Session准备与应用因为线程存储的数据都是在服务器端,所以是安全的,那用户如何把需要的东西放进Session呢?这就要用到UsersessionUint这个单元,例如我在这个单元的代码前段部分地方定义的几个变量:private Private declarations public Public declarations /试卷参数用的变量 var papername,paperid,paperstatus:string; /字符串变量,储存试卷名、试卷编号、 isrepeat:boolean; /是否可重复 var singleti,singlescore,multi,muls

16、core,fillti,fillscore,judgeti,judgescore:integer; /各种题型的数目及给分值 /用户参数 var username,userid,rightkey:string; /储存用户真实姓名、学生ID号,正确答案 var rightno,wrongno,result,testtimes:integer; / 分别是正确、错误数目、成绩 、测试记录数 end;如何把值存到变量中去?在UsersessionUint单元的代码部分,找到Public定义处,按规则定义好几个字符串变量用以保存用户登录后及从数据库获取的数据。要保存到这里的变量的话要在引用的单元里引

17、用UsersessionUint单元,然后用:UsersessionUint.papername:=你要赋的值 ,其它在usersession中定义的变量都是这样操作。如何引用变量中先前存入的值?有一点是必须要明确的,那就是只要你要引用非自身单元的东西的话一定要在uses中加入那个单元的name(也就是你在Form中的name属性)。如果要取胜值的话反过来用就行了,如:iwlabel1.caption:=usersession.papername。变量可以随时加,随时用,但自己一定要记得用了什么变量,不要为同一件事重复地用不同的变量,这样对服务器的负担还是有一定影响的。第二部分:窗口的初始化在

18、显示这个窗口之前,当然需要从数据库中取出相关的参数来初始化界面,比如要看看有没有统一考试的题目,有的话把试卷名显示出来,没有的话就隐藏不必要的控件。在这一个窗口中我写的初始代码如下:procedure Tfrmselect.IWAppFormCreate(Sender: TObject);iwlabel3.Caption:=usersession.username+,欢迎您进入网络练习系统!;根据上一登录界面查询到的用户记录信息,把用户的真实姓名人性化地显示到这一页面的最顶上usersession.qry1.Close;/这里直接操作usersession单元里的query查询控件userse

19、ssion.qry1.SQL.Clear; /查询语句清空usersession.qry1.SQL.Add(select * from papername + where status=统考 );/增加查询语句,查询系统中设定为统考的席卷,为后面界面初始化准备。usersession.con1.Connected:=true; /执行查询操作前先把与数据库的连接控件打开usersession.qry1.Open;/执行查询命令 begin /如果查询到的刻录数为则说明没有统考试卷设定,则显示统考卷的区域可以隐藏, if usersession.qry1.RecordCount=0 then b

20、egin rgtrain.Top:=rgtest.Top; /为了界面的美观,把下region的位置移到与上面的高度一样。 rgtest.Visible:=false; /设置上区域块为不可见属性 end else/如果有刻录,则取出papername属性中的值并在iwtext控件中显示出来texttip.lines.add(usersession.qry1.FieldByName(papername).AsString) ; end; /下面的语句不论有没有记录都要做的usersession.qry1.close;/关闭查询usersession.con1.Connected:=False;

21、/关闭连接end;根据我的经验,写数据库的相关程序,如果不用保持与数据库连接的话尽可能关闭与数据库相关的操作,特别是小型数据库(如:access)是有连接限制的,而且要与数据库交互的话也不要直接用数据感知控件,而要通过一个connection,我就是用这一个办法解决了我第一次写网络考试程序只能左右的人连接上去的疑难。第三部分:试卷的筛选也就是按钮“搜”的代码了,这里要从前面的科目和试卷类型两个下拉选择框中获取参数,要选取是哪一学科,是考试卷还是练习卷。在它下面的是一个IWlistbox控件,它的数据源是旁边放的,操作的过程大致如下:通过usersession窗口中的Query数据控件执行查询,

22、然后把qry1查询到的数据记录用一个循环把试卷名这一列的值全部读取到列表框中去,用户选择了哪一份试卷后,再按下按钮“选中并进入”,就把各类参数都存入相关的session变量中去并打开对应的练习或考试窗口。要实现这个目的的方法有很多,我这里的仅是比较“笨”的方法。 “搜”的代码并不复杂,但却是对及数据库操作的基本功,请看:procedure Tfrmselect.IWButton1Click(Sender: TObject);var su,ty:string; /设两个字符串变量来储存用户选择的科目和类型,到查询语句中使用begin/webapplication.ShowMessage(intt

23、ostr(iwcombobox1.itemindex); 我经常用显示信息来检验程序错误的 if iwcombobox1.ItemIndex=1 then /判断下拉框的选取值是多少来定下是何科目 su:=综合 else su:=信息技术; if iwcombobox2.ItemIndex=1 then ty:=考卷 else ty:=练习;usersession.qry1.Close; /对查询控件操作前,为保险起见,先关闭查询并清空usersession.qry1.SQL.Clear;usersession.qry1.SQL.Add(select 编号,papername as 试卷名,b

24、ywho as 出题人,subject as 科目 usersession.qry1.SQL.Add(+ from papername where subject=+quotedstr(su) );usersession.qry1.SQL.Add(+ and status=+quotedstr(ty)+ order by inputtime desc);这是一个组合查询,简单的那种,限定记录必须是subject(科目)和status(试卷状态)usersession.con1.Connected:=true;usersession.qry1.active:=true;usersession.q

25、ry1.open;lbselect.Caption:=查询到 +inttostr(usersession.qry1.recordcount)+ 条记录,请选择您要的试卷。; /用一个IWLabel控件显示符合条件的查询到的记录数目end;2007-2-4第四天、选择界面的完善及进入相关页面 今天的内容与预想的有点不同,因为现在实现的选择界面比刚开始想的要复杂一些,因为要在这判定用户是选择练习还是测试,再决定是显示练习界面还是考试界面,如果是测试的话还要从数据库中获取该试卷是否允许重复,可以重复的话再判定用户是否超过3次的最大重复次数, 界面设计中还涉及到了从数据库中循环读取一个字段的值到列表框

26、中,本来我是用Dbgrid来显示的,但一直有一个问题困扰我的就是,一旦查询语句发生改变,Dbgrid的存在就会导致程序的查询操作出现种种错误,我试了许多方法都解决不了,最后只能把试卷列表读入到列表框中。再通过一个较为复杂的字符获取语句把试卷的编号读取出来,一些要注意的代码作下说明:按钮:选择并进入(代码解析)procedure Tfrmselect.btokClick(Sender: TObject);begin/根据用户选中列表框中的行,通过分隔符来获取试卷的编号来初始化后面要抽取的试卷。usersession.paperid:=copy(iwlistbox1.Itemsiwlistbox1

27、.itemindex,1,(pos(#,iwlistbox1.Itemsiwlistbox1.itemindex)-1);在读取到列表框的操作中,我是把试卷编号和试卷名同时读到一行去的,用“”作分隔符,而后面要用到的试卷编号只是前面的部分:如33 信息技术测试一,我们只要33就行了,所以要把33截取出来,那就用POS函数确定在文本行中的位置,然后用COPY函数把前的字符串拿过来并把它存进session中的paperid变量中去。/用qry2来查询登陆用户对选中试卷的测试记录 usersession.qry2.close; usersession.qry2.sql.clear; usersess

28、ion.qry2.sql.add(select * from result where paperstatus=+quotedstr(usersession.paperstatus); usersession.qry2.sql.add( and username=+quotedstr(usersession.userid)+ and 编号=+usersession.paperid ); 此句查询的意思是:选择所有试卷状态等于用户查询的试卷状态值并且用户名是用户ID,并且试卷编号是选中编号的记录 usersession.qry2.open;usersession.testtimes:=users

29、ession.qry2.recordcount;usersession.qry2.Close;/用QRY1定位用户选择的试卷,usersession.con1.Connected:=false;usersession.qry1.Close;usersession.qry1.SQL.Clear;usersession.qry1.SQL.Add(select * from papername where 编号=+(usersession.paperid);usersession.con1.Connected:=true;usersession.qry1.open; /并获取试卷的各项参数 usersession.papername:=usersession.qry1.FieldByName(papername).AsString; usersession.isrepeat:=usersession.qry1.fieldby

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1