从VFP试题库直接生成WORD文档试卷
从VFP试题库直接生成WORD文档试卷
常新功
(山西财经大学信息系,山西太原 030006)
摘要:本文通过对一个示例的开发演示了数据库软件和字处理软件协同工作的一种情形:从VFP启动WORD,并将VFP中数据直接送入WORD生成WORD文档。
关键词: VFP;WORD;试题库
VFP(Visual FoxPro)和WORD(Microsoft Word)均为微软公司的产品。前者属于中小型的数据库管理系统,后者则是目前广泛流行的字处理软件。如果能将前者优秀的数据管理功能和便捷宜用的面向对象的数据库软件开发功能同后者强大的字处理功能结合在一起使用,必然可以各尽其才,达到事半功倍的效果。
本文就是在上述思想的指导下用VFP开发了一个“试卷生成系统”,包括试题库的建立、试题的选择、试卷的生成等功能。其设计思想为:在VFP中建立试题数据库,然后利用列表框控件进行试题选择,将选好的试题直接送入WORD生成WORD文档。然后即可利用WORD强大的字处理功能对该文档进行编辑排版,生成一份漂亮的试卷。
1 试题库的建立
为简单起见,本文只以常见的单项选择题为例来介绍整个系统的开发过程。由于单选题的题面和选项的内容长短变化很大,不宜采用字符类型。经过比较分析,我们认为采取以下数据库结构较为合理:
单选.DBF:
Qno char(5) &&题号
Question memo &&题面
Selections memo &&A、B、C、D四个选项
Answer char(1) &&答案
以下录入数据,即可建立试题库:单选.DBF
2 试题的选择及试卷的生成
以下分步骤建立表单程序试题.scx,以实现试题的选择及试卷的生成。
程序界面如图1。在图1 的列表框中用鼠标(配合Ctrl键和Shift键)选择试题,选中的以蓝条显示;也可先随机选择,然后再用Ctrl+鼠标在随机选择的基础上进行选择,表单左下角“已选择的试题数为:”文本框中数字即为最后列表框中选中的试题总数。随机选择的方法是:⑴在微调控件中输入欲随机选择的试题数(或用鼠标单击上下按钮选定);⑵单击“随机选择”按钮。另外,在选择过程中,列表框下面的编辑框中会同步显示列表框中当前试题的A、B、C、D 四个选项,以方便用户选择。
试题选好后,单击“生成WORD文档”按钮,WORD自动启动,选中的试题按顺序自动加上题号插入到WORD文档中,用户可进一步编辑,生成试卷。
以下我们按步骤介绍表单中主要控件的属性及事件响应代码:
(1) 选择File|New命令,创建一个表单Form1,其它属性设置如下:
AutoCenter=.T. &&表单运行时居中显示
Caption=试卷生成系统
Height=296
Left=0
Top=0
Width=369
定义该表单的 Load事件:
use 单选.dbf
定义该表单的 Destroy事件:
close all
定义三个自定义函数: ①num( )
定义该列表框的Init事件:
*将单选.DBF中备注字段Question的内容转为字符串,前面加上题号插入到列表框中
thisform.lockscreen=.t.
scan
s=qno+space(2)
s=s+this.parent.smemfield(recno(),question)
this.additem(s)
endscan
thisform.lockscreen=.f.
定义该列表框的Click事件:
goto this.parent.selecno(this.ListIndex)
&&将记录指针移动到列表框中当前项所在的记录
this.parent.selection1.refresh()
&&显示列表框中当前试题的四个选项
this.parent.num1.value=this.parent.num()
&&同步更新编辑框nm1 中的值
this.parent.spinner1.value=0
(3) 在列表框下加入一个编辑框,并命名为selection1,适当调整其左、右、高、宽,其它属性设置如下:
ConstrolSource=单选.selections
&&备注字段可直接绑定到编辑框
ReadOnly=.T.
Name=selection1
(4) 在表单中加入微调控件spinner1,适当调整其左、右、高、宽,其它属性设置如下:
KeyboardHighValue=20
KeyboardLowValue=0
SpinnerHighValue=20.00
SpinnerLowValue=0.00
(5) 在表单中加入一个文本框(命名为num1),用于显示已选择的试题数,适当调整其左、右、高、宽,其它属性设置如下:
ReadOnly=.T.
Name=num1
(6) 在表单中加入三个按钮,其Caption属性分别为:“随机选择”、“生成WORD文档”、“退出”。
“随机选择” 按钮的Click事件响应代码:
thisform.lockscreen=.t.
for i=1 to this.parent.question1.listcount
this.parent.question1.selected(i)=.f.endfor
for i=1 to this.parent.spinner1.value
ii=int(this.parent.question1.listcount*rand())
this.parent.question1.selected(ii)=.t.endfor
this.parent.num1.value=this.parent.num( )
thisform.lockscreen=.f.
“生成WORD文档”按钮的Click事件响应代码为:
#define CRLF chr(13)+chr(10)&&回车及换行
wait window ″正在创建Word文档...″ nowait
objwddoc=create(″word.basic″)&&创建WORD应用对象
objwddoc.appshow&&显示WORD主窗口
objwddoc.filenewdefault&&打开一个缺省文档
qnum=1&&设置题号初值为1
local i
i=1
do while i<=this.parent.question1.listcount
if this.parent.question1.selected(i)
objwddoc.insert(CRLF)&&插入回车及换行
squestion=ltrim(str(qnum))+″.
″+this.parent.smemfield(this.parent.selecno(i),question)+CRLF objwddoc.insert(squestion)&&插入题面
sselection=this.parent.smemfield(this.parent.selecno(i),selections) objwddoc.insert(sselection)&&插入选项
qnum=qnum+1
endif
i=i+1
enddo
wait window ″完成″ nowait
“退出”按钮的Click事件响应代码为:
Thisform.release
好了,存盘退出,在命令窗口键入DO FORM 试题.scx 即可运行。在生成的WORD文档中可进一步加入试卷标题,定义段落及字体,从而迅速生成一份理想的试卷。
[参考文献]
[1]郗学奎.Visual FoxPro 6.0使用指南[M].人民邮电出版社,1999.9.
[2]沈惠璋,马英骐,吴继泽.深入Visual FoxPro 6.0 面向对象程序设计[M].清华大学出版社,1999.10.