|
泉州培元中学
王全井
《信息技术》作为一门重要课程列入福建省高中会考科目,大大提高了《信息技术》在中学课程中的地位。宽带技术的迅速普及,使得学生自主学习的可能变成现实。如何通过计算机验查学生学习的进度和成效变得越来越重要。本文通过作者自行开发的例程(如需源代码可与作者联系)介绍利用OLE功能编写计算机教学评价软件的基本方法,为检验学生自主学习的效果提供一条可行性途径。从而帮助计算机老师自主编写测试软件,自行编纂测试题目,这样一方面可以提高教师的计算机水平,一方面使教师能按自己的教学进度编写题库测试学生。测试成绩充分利用网络的功能进行在线公布,从面激发学生自主学习的积极性。
一、OLE简介
随着 OLE 的到来, 它允许 OLE 就地(In-Place) 激活。 这使得 Excel 嵌入对象在相同的应用程序窗口中作为 Excel 对象激活, 并带有 "合并" 的菜单和工具栏。由于文档具有单一的 "合并后的" 编辑环境, "混合文档" 的概念更进一步的传播.这些复合文档体系的发展真正帮助了交互式用户, 使他们在操作环境中更为多产。 用户可以同时运行多个应用程序并因此而实现了提高生产效率。 但是, 应用程序开发者也看到了在应用程序可编程性上的发展, 允许应用程序开发者以编程方式控制其它应用程序的能力。
Windows 有一个称为 DDE 的技术, 或介绍为动态数据交换 (Dynamic Data Exchange)。它允许程序员以特定的编程语言编写可与其它应用程序通信或执行它们的命令的程序。程序员用服务器的服务来编写一个控制器或客户的概念对于 DDE 来说是讨厌的. 程序员必须懂得两个对象的编程语言, 也必须创建一个 DDE 回调函数, 而且还必须熟悉服务器应用程序的知识。
OLE的出现扭转了局面,OLE 2.0 的另一个功能, OLE Automation, 针对 DDE 的缺点并引入一种新等级的应用程序间通信. OLE Automation 让应用程序开发者可以允许他们的程序与其它应用程序以标准方式"交谈". 程序员通过 OLE Automation 控制器设计一个 "界面" 用以调用例程和修改 OLE Automation 服务程序上的属性。
在现代的计算机环境中, 一个应用程序可以多次成为一个 OLE Automation 服务程序. 一个标准独立的应用程序如 Excel 有许多图形, 数学, 统计和财务函数。其它应用程序可以通过编程地调用 Excel 来简单地利用这些函数。应用程序的最终用户甚至可以不需要知道使用了 Excel。
当然, 为了使用 OLE 服务程序对象, 应用程序必须能够作为一个 OLE Automation 控制器与它交谈. Visual FoxPro 3.x 以上, Microsoft Excel 和 Visual Basic 都具有 OLE Automation 控制器的能力。
下面使用Visual FoxPro 6.0编程语言说明如何使用OLE功能编写简单的具有OLE Automation 控制器能力的应用程序。
在中学计算机教育中,Excel电子表格是一项必不可少的教学内容,下面利用Visual Foxpro 6.0编写一个简单的程序,由程序打开Excel并在其中写入一些数字,从面说明如何利用Visual Foxpro 6.0控制Excel。
PUBLIC myole
myole=CreateObject("Excel.application")
myole.visible=.t.
myole.windowstate=1
myole.workbooks.add
FOR i = 1 TO 10
FOR j= 1 to 8
myole.cells[i,j].value = I * 10 + j
ENDFOR
ENDFOR
现对上面程序段做简要说明:
public myole语句是声明myole为一全局变量。
myole=CreateObject("Excel.application")语句是使myole变量指向一个新建Excel的应用程序。Myole成为一个存在的对象。
CreateObject()函数的简要说明:
功能:从类定义或支持 OLE 的应用程序中创建对象。
返回值类型:对象
说明:可用 CREATEOBJECT( ) 从类定义或支持 OLE 自动化的应用程序中创建对象,并将对象引用赋给内存变量或数组元素。
由用户自定义类创建对象之前,用户自定义类必须先用 DEFINE CLASS 来创建,或者必须是用 SET CLASSLIB 打开的 .VCX 可视类库中的类。
myole.visible=.t.语句是使myole对象可见。
myole.windowstate=2语句是使myole对象最大化:
windowstate 属性的设置有:
myole.workbooks.add语句的功能是为myole对象的当前工作簿增加一个工作表。
FOR i = 1 TO 10
FOR j= 1 to 8
myole.cells[i,j].value = i * 10 + j
ENDFOR
ENDFOR
以上语句的功能是对当前工作表从第一行到第10行中的一到八列分别写入数值,数值为行号乘十加上列号。
二、编写计算机教学评价软件的思想方法
中学计算机教育的过程中,评价是变化的,所以题目和评价方法也应是变化的。这就要求我们所编写的评价软件具有增加、修改题目和评分方法的功能。充分利用数据库功能可以很方便地解决这样的问题。
(一)、计算机教学自主学习评价软件的数据库结构
建议设计的数据库的结构至少应包括:
1、科目号(字符型,宽度20)
2、章节名称(字符型,宽度12)
3、知识点名称(字符型,宽度30)
4、题目编号(字符型,宽度8)
5、掌握程度(字符型,宽度4,内容:“了解、识记、理解、掌握”
6、题型代号(字符型,宽度2,内容:“01-选择、02-填空、03-汉字输入、04-Windows操作、05-Word操作、06-Excel操作、07-Internet操作、08-数据库操作、09-VB、……”)
7、题干(备注型)
8、题支A(备注型)、题支B(备注型)、题支C(备注型)、题支D(备注型)、题支E(备注型)、题支F(备注型)、
9、答对得分(数值型,宽度3)
10、答案或评分代码(备注型)
11、使用次数(数值型,宽度4)
12、答对次数(数值型,宽度4)
(二)、选择题和填空题的评价
选择题和填空题的评价是最简单的,只要学生所选的序号或所填的字符与答案相同即得分。
(三)、汉字输入的的评价
一般在规定时间内测试,计算正确字数,错误字数,通过表达式计算得分。
(四)、Windows操作的评价
在编写评价软件时,需设计以下子函数:
1、检测文件或目录存在性的函数:CkF(文件,存在或不存在,得分)
2、检测文件或目录属性的函数:CkA(文件,属性,得分)
例:对于“将考生目录下的文件ABC.doc复制到考生目录的子目录Dat下”,我们的评分代码:可以为CkF("ABC.doc",1,5),CkF("Dat\ABC.doc",1,5)这时当两个函数都返回.t.时可得10分。
下面详细说明如何利用OLE功能对 Word文档的评价。
三、使用OLE功能测试学生自主学习WORD的基本方法。
WORD对中学计算机教育来说至关重要,学生在勤于上网的时候,是否学好了Word,教师可以通过以下方法随时进行检测。
(一)、以OLE对象打开学生的作业文档
下面假设学生自主学习时,把作业存放在“K:\年级\班级\座号”下面,取名为“练习,一.doc”。在编写程序时可使用循环语句逐个打开学生的练习文档,这里不再遨述。
在编写程序时就使用全局变量存放学生的存档位置和文档名称。
例:public StuWz,StuDoc
StuWz="K:\高一年\一班\01号"
StuDoc="练习一.Doc"
下面这个自行设计的函数可以打开教师“指定的位置”和“指定文档名称”的Word文档,并使其指向WordOle对象。
函数名:OpenWordDoc(),参数:“文档位置”和“文档名称”
Parameters DocWz,DocName
Public WordOle
Temvar=DocWz+"\"+DocName
WordOle=CreateObject("Word.Application")
WordOle.documents.open(Temvar)
WordOle.visible=.t.
简要说明:WordOle=CreateObject("Word.Application")是建立一个Word应用程序对象。WordOle.documents.open(Temvar)是打开教师指定的测试文档。WordOle.visible=.t.语句是使该Word窗口可见,当然,在评分时可设为.f.,这样评分时学生将不再能修改。
使用举例:OpenWordDoc(StuWz,StuDoc)打开StuWz位置下StuDoc文档。
(二)、对Word字体设置的检测
当建立WordOle对象后,就可以访问该对象的任何属性。WordOle对象的下层可以是段落对象,也可以是文字对象,还可以是表格对象,图形对象等,通过“.”进行分隔。例如:WordOle.ActiveDocument.paragraphs(1)表示WordOle对象的当前文档的第一段。通过对该对象属性的访问,可以检测用户对该段落的设置是否正确。
我们可以自行设计一个检查某一段落字体的函数:
函数名:CkPrZt(),参数:段落号,字体名称,分数
Parameters Prs,NeedFont,Fs
if WordOle.ActiveDocument.Paragraphs(Prs).range.font.name=NeedFont
return Fs
else
return 0
endif
上面语句的意思是当WordOle对象的当前文档的Prs段范围的字体名称是NeedFont时返回Fs,否则返回0.
在使用时可以这样调用:(totfs表示总分)
totfs=totfs+CkPrZt(1,"宋体",10)
表示当第一段如为“宋体”时加10分。
(三)、对Word字号设置的检测
我们可以自定义函数CkPrZh(),参数:段落号,字号,分数
Parameters Prs,zhname,Fs
zhv=0
do case
case zhname="初号"
zhv=42
case zhname="小初"
zhv=36
case zhname="一号"
zhv=26
case zhname="小一"
zhv=24
case zhname="二号"
zhv=22
case zhname="小二"
zhv=18
case zhname="三号"
zhv=16
case zhname="小三"
zhv=15
case zhname="四号"
zhv=14
case zhname="小四"
zhv=12
case zhname="五号"
zhv=10.5
case zhname="小五"
zhv=9
endcase
if WordOle.ActiveDocument.Paragraphs(Prs).Range.font.size=zhv
return Fs
else
return 0
endif
简要说明:其中变量zhv的作用是存储对应字号的“磅数”。
在使用时可以这样调用:(totfs表示总分)
totfs=totfs+CkPrZh(1,"四号",5)
表示当第一段的字号如为“四号”时加5分。
(四)、对Word段落行距设置的检测
在VBA中提供了Linespacine属性,使我们可以很方便地检测段落的行距,
Linespacing属性:返回或设置指定段落的行距(以磅为单位)。
下面这个示例,以磅为单位检测教师所指定的段落的行距是否为指定的磅数,如是返回该题分数,否则返回0分。
函数名:CkPrHj1(),参数:段落号,行距磅数,分数
parameters Prs,LineValue, Fs
if WordOle.ActiveDocument.Paragraphs(Prs).Linespacing=LineValue
return Fs
else
return 0
endif
可以这样调用CkPrHj1()函数:(totfs表示总分)
totfs=totfs+CkPrHj1(1,12,8)
表示当第一段的行距如为12磅时总分加8分。
在使用时,经常使用倍数表示行距,如有这样的题目“设置文章第二段为1.5倍行距”。这时我们就要引用另外的属性和方法。
自定义函数名:CkPrHj2(),参数:段落号,行距倍数,分数
parameters Prs,HjBS, Fs
WordOle.ActiveDocument.Paragraphs(Prs).LineSpacingRule=wdLineSpaceMultiple
if WordOle.ActiveDocument.Paragraphs(Prs).Linespacing= LinesToPoints(HjBS)
return Fs
else
return 0
endif
说明:WordOle.ActiveDocument.Paragraphs(Prs).LineSpacingRule=wdLineSpaceMultiple语句的功能是设置该段计算机行距的规则为“多倍行距”。而LinesToPoints(HjBS)是以HjBS作为倍数返回相就的磅数。最终仍是以磅数作为判断的依据。
调用方法与CkPrHj1()基本相似,只是磅数应改为倍数。如:
totfs=totfs+CkPrHj2(2,1.5,10)表示当第二段行距为1.5倍时加10分。
(五)、对Word段落对齐方式的检测
我们可以使用段落对象的Alignment属性访问段落的对齐方式。
自定义函数名CkPrDq(),参数:段落号,对齐方式,分数
Parameters Prs,DqName,Fs
zhv=0
do case
case DqName="居左"
zhv=0
case DqName="居中"
zhv=1
case DqName="居右"
zhv=2
case DqName="两端对齐"
zhv=3
case DqName="分散对齐"
zhv=4
endcase
if WordOle.ActiveDocument.Paragraphs(Prs).Alignment=zhv
return Fs
else
return 0
endif
可以这样调用CkPrDq()函数:
totfs=totfs+CkPrDq(4,"居中",2)表示当第4段的对齐方式为“居中”时得2分。
(六)、Word段落的其他属性介绍
以上通过例程介绍Word段落的一些基本属性,下面简要介绍Word段落的其他属性。
1、 检测是否为粗体:
Parameters Prs,Fs
if WordOle.ActiveDocument.Paragraphs(Prs).Range.Font.Bold=-1
return Fs
else
return 0
endif
2 、检测是否为斜体
Parameters Prs,Fs
if WordOle.ActiveDocument.Paragraphs(Prs).Range.Font.Italic=-1
return Fs
else
return 0
endif
3、检测是否加相应的下划线
Parameters Prs,XHXname,fs
zhv=0
do case
case XHXname="单线"
zhv=1
case XHXname="双线"
zhv=3
endcase
if WordOle.ActiveDocument.Paragraphs(Prs).Range.Font.Underline=zhv
return btfs
else
return 0
endif
4、检测指定段落的颜色设置
Parameters Prs,ZtColor,Fs
zhv=0
do case
case ZtColor ="黑色"
zhv=0
case ZtColor ="红色"
zhv=6
case ZtColor ="黄色"
zhv=7
case ZtColor ="白色"
zhv=8
case ZtColor ="鲜绿"
zhv=4
case ZtColor ="蓝色"
zhv=2
case ZtColor ="蓝绿"
zhv=3
case ZtColor ="粉红"
zhv=5
case ZtColor ="深蓝"
zhv=9
case ZtColor ="紫色"
zhv=12
case ZtColor ="深红"
zhv=13
case ZtColor ="绿色"
zhv=11
endcase
if WordOle.ActiveDocument.Paragraphs(Prs).Shading.BackgroundPatternColorIndex=zhv
return Fs
else
return 0
endif
5、边框线宽度检测
Parameters Prs, BkKd, Fs
if WordOle.ActiveDocument.Paragraphs(prs).Borders.OutsideLineWidth=BkKd*8
return Fs
else
return 0
endif
注意:关于对段落对象检测时尚需在每个例程的开头加入如下语句,以保证程序能更加健壮地运行:
if WordOle.ActiveDocument.Paragraphs.count<Prs
return 0
endif
即是当文章的总段落数达不到要检测的段落数时,得0分。
(七)、对文字对象的控制
以上例程主要介绍对段落的控制,但经常只要求对其中某些文字进行检测,而不是整个段落时,就要使用下面介绍的方法,先建立该文字对应的对象,再对其属性进行访问。为了建立文字对象,可以使用“查找”的功能。
自定义函数名:FindStr(),参数:要查找的字符串
Parameters fd_txt
WordOle.selection.escapekey
WordOle.selection.find.text=fd_txt
Wordle.selection.start=0
WordOle.selection.find.execute
对上述语句简要说明:
WordOle.selection.escapekey使原来的“选择对象”失效,这样可以重新开始选择。WordOle.selection.find.text=fd_txt,为Word指明要查找的内容,Wordle.selection.start=0告诉Word从文章开头开始查找。WordOle.selection.find.execute表示开始执行查找语句。
执行上述函数后,Word将为查找对象“涂黑”,这样就可以访问该对象的属性了。
例如:要求学生“设置文章第一段中‘正弦值’三字为黑体字”,我们可以先编写这样的了函数:
函数名:CkCharZt(),参数:字符,字体,分数
Parameters Chars, ZtName, Fs
FindStr(Chars)
if (WordOle.selection.find.found).and.(WordOle.selection.font.name=ZtName)
return Fs
else
return 0
endif
我们便可以这样调用:totfs=totfs+CkCharZt("正弦值","黑体",10)表示当文中‘正弦值’三字如为黑体时得10分。
对文字字号的检测可以对WordOle.selection.font.size进行判断。
对文字颜色的检测可以对WordOle.selection.font.ColorIndex进行判断(参阅前文关于段落颜色判断部分)
(八)、对Word表格的检测
1、检测表格是否存在
对表格是否存在的检测可以对Tables的Count属性进行访问。
自定义函数名:CkTabS(),参数名:表格数
Parameters tabs
If WordOle.ActiveDocument.Tables.Count<tabs
Return .f.
Else
Return .t.
Endif
2、检测指定表格的行数与列数
例如要评价学生是否按要求建立一个5行4列的表格时,我们可以先编写这样的自定义函数。
自定义函数名:CkTabHsLs(),参数:表格号,行数,列数,分数
Parameters tabs, hs, ls, Fs
if .not.CkTabS(tabs)
return 0
endif
thishs=WordOle.ActiveDocument.Tables(tabs).Rows.Count
thisls=WordOle.ActiveDocument.Tables(tabs).Columns.Count
if thishs=hs.and.thisls=ls
return Fs
else
return 0
endif
然后调用totfs=totfs+CkTabHsLs(1,5,4,10),这样当Word的第一个表格的行数为5,列数为4时将对totfs变量加10分。
3、对表格的行高和列宽进行检测
有时要求学生按一定的行高和列宽制作表格,如何评价学生制作的表格是否符合要求呢?下面这个函数可以完成这样的功能。
自定义函数名:CkTabHW(),参数:表格号,行高,列宽,分数
parameter tbs, hs, ls, Fs
thishs=WordOle.ActiveDocument.Tables(tbs).Rows.Height
thisls=int(WordOle.ActiveDocument.Tables(tbs).Columns.Width)
if hs>0.and.thishs<>hs
return 0
endif
if ls>0.and.thisls<>int(ls*28.3500004)
return 0
endif
return Fs
上面例程中,为了配合Word97默认单位,行高以磅为单位,列宽以厘米为单位,面1厘米=28.3500004磅,所以有ls*28.3500004的表达式。
我们可以用CkTabHW(1,20,2,5)来检测1号表格行高是否为20磅,列宽是否为2厘米,如是得5分。
4、对表格格式的综合检测
下面这个自定义函数可以检测指定表格号的字体、字号、下划线、对齐、粗体、颜色,如不检测某一项内,只须该项为空字符串。
函数名:CkTabFormat(),参数:表格号,字体,字号,下划线,对齐,粗体,颜色,分数
parameter tbs, fd_zt, zhname, fd_xhx, fd_qx, fd_ct, fd_ys, Fs
tole=WordOle.ActiveDocument.Tables(tbs).Range.Font
thisc=.f.
do while .t.
if .not.(fd_zt=="")
if .not.(tole.name=fd_zt)
exit
endif
endif
if .not.(zhname=="")
zhv=0
do case
case zhname="初号"
zhv=42
case zhname="小初"
zhv=36
case zhname="一号"
zhv=26
case zhname="小一"
zhv=24
case zhname="二号"
zhv=22
case zhname="小二"
zhv=18
case zhname="三号"
zhv=16
case zhname="小三"
zhv=15
case zhname="四号"
zhv=14
case zhname="小四"
zhv=12
case zhname="五号"
zhv=10.5
case zhname="小五"
zhv=9
endcase
if .not.(tole.size=zhv)
exit
endif
endif
if .not.(fd_qx=="")
if tole.italic<>-1
exit
endif
endif
if .not.(fd_xhx=="")
zhv=0
do case
case fd_xhx="单线"
zhv=1
case fd_xhx="双线"
zhv=3
endcase
if tole.underline<>zhv
exit
endif
endif
if .not.(fd_ct=="")
if tole.bold<>-1
exit
endif
endif
if .not.(fd_ys=="")
zhv=0
do case
case fd_ys="黑色"
zhv=0
case fd_ys="红色"
zhv=6
case fd_ys="黄色"
zhv=7
case fd_ys="白色"
zhv=8
case fd_ys="鲜绿"
zhv=4
case fd_ys="蓝色"
zhv=2
case fd_ys="蓝绿"
zhv=3
case fd_ys="粉红"
zhv=5
case fd_ys="深蓝"
zhv=9
case fd_ys="紫色"
zhv=12
case fd_ys="深红"
zhv=13
case fd_ys="绿色"
zhv=11
endcase
if .not.(tole.colorindex=zhv)
exit
endif
endif
thisc=.t.
exit
enddo
if thisc
return Fs
else
return 0
endif
可以这样调用上面这个函数:
totfs=totfs+CkTabFormat(1, "", "小四", "单线","", "粗体","",20)
则将当前文档的第一个表格检查“字号”“下划线”“粗体”设置,如正确,将得20分。
四、使用OLE功能测试学生自主学习Excel的基本方法。
下面通过几个例程说明检测Excel文档的基本方法,读者可以参考VBA编写其它例程。
1、建立Excel文档对象
自定义函数名:OpenExcelDoc(),参数:“文档位置”和“文档名称”
Parameters DocWz,DocName
Public ExcelOle
Temvar=DocWz+"\"+DocName
ExcelOle=CreateObject("Excel.Application")
ExcelOle.Workbooks.open(Temvar)
ExcelOle.Visible=.t.
2、检测单元格的值
自定义函数名:CkValue(),参数:单元格名称,值,分数
Parameters wz,dx,Fs
tem='ExcelOle.workbooks(1).worksheets(1).range(wz).value'
if type(tem)<>type('dx')
return 0
endif
if ExcelOle.workbooks(1).worksheets(1).range(wz).value=dx
return fs
else
return 0
endif
3、检测工作表的名字
自定义函数名:CkSheetName(),参数:工作表号,工作表名,分数
Parameters SheetNo,SheetName, Fs
Tem= ExcelOle.workbooks(1).worksheets(SheetNo).name
if type('Tem')<>'C'
return 0
endif
if Tem=SheetName
return Fs
else
return 0
endif
OLE的功能非常广泛,上面的例程只是中学计算机教育中最常出现的操作的评价方法,可以这样说,利用OLE功能,几乎可以评价中学计算机教学中的大部分操作。充分挖掘OLE功能,将对中学计算机教学的评价起着关键作用,使中学生的自主学习更加规范、有序和健康。
参考文献:《Office 2000编程技术》,[美]Paul Mcfedries
《中文版Microsoft Word 97 Visual Basic》
《中文版Microsoft Excel 97 Visual Basic》
利用OLE功能编写计算机教学评价软件的方法探讨 |