摘要:該文給出了一種在Windows環(huán)境下利用Visual Foxpro編制無紙化考試系統(tǒng)的實現(xiàn)方案,同時介紹了利用系統(tǒng)的一個動態(tài)鏈接庫Foxtools.fll巧妙地為系統(tǒng)添加背景音樂的技巧,一改以往使用OLE控件嵌套的繁瑣方法,效果更好,占用資源更少。
關(guān)鍵詞:背景音樂;動態(tài)鏈接庫;數(shù)據(jù)庫;控件;表單;Visual FoxPro(VFP)
中圖分類號:TP311文獻標識碼:A 文章編號:1009-3044(2010)05-1118-03
Use VFP Programming to Implementation a Nonpaperlized System with Background Music Based on Windows Operating System
XIA Jian-hua
(Shaoxing county vocational education center, Shaoxing 312030,China)
Abstract: This article presents a Windows environment using Visual FoxPro compilation of the nonpaperlized system of implementation, at the same time describes the use of a dynamic-link library Foxtools.fll neatly to add background music and desist using the OLE controls nested cumbersome method will work better, less resource-intensive.
Key words: background music; Dynamic-link library; Datebase; Control; Form; Visual Foxpro(VFP)
當今世界最先進、最省事的考試方法莫過于無紙化考試方式,即利用微機進行自動化出題、改卷、統(tǒng)計分數(shù)等代替手工操作的考試方式,現(xiàn)已廣泛應(yīng)用于如機動車駕駛員理論科目考試等場合。微機無紙化考試系統(tǒng)的應(yīng)用使得各類考試逐漸趨向規(guī)范化和標準化,而在各類標準化考試中選擇題、是非判斷等客觀題所占的比例越來越大,本文就以單項選擇、多項選擇和是非判斷題為例粗淺地探討一下怎樣利用數(shù)據(jù)庫技術(shù)完成題目的生成、顯示、操作和計分方法,以求拋磚引玉,同時希望能對利用Visval Foxpro 進行這方面編程開發(fā)的朋友有一定幫助。
關(guān)于無紙化考試的微機實現(xiàn),是探討得比較多的一個話題,以前曾有一少作者提出過見仁見智的方案,然而大都是建立在DOS這個早期操作系統(tǒng)環(huán)境下的,且離不開UCDOS漢字系統(tǒng),這種利用Foxbase或FoxPro編寫出來的程序不但代碼冗長、界面粗糙,而且操作不方便。而今在Windows 環(huán)境下,利用功能強大的面向?qū)ο箝_發(fā)工具如Visual FoxPro可以十分方便地開發(fā)出界面美觀、操作方便的考試系統(tǒng),并且我們還可以利用VFP的動態(tài)鏈接庫foxtools.fll給系統(tǒng)加上美妙的背景音樂。
1 背景音樂的實現(xiàn)
在利用Visual Foxpro 編制應(yīng)用程序時,如果能給應(yīng)用程序添加背景音樂,無疑是件錦上添花的事,背景音樂能給應(yīng)用程序增色不少。不般的方法是利用OLE(對象嵌入與鏈接)進行嵌套。具體方法是選擇“表單控件”上的“OLE容器控件”,將其拖到表單上,再在“插入對象(Insert Object)”窗口中選擇“媒體剪輯”,調(diào)用“媒體播放機”,利用它來播放出音樂,同時把播放任務(wù)條隱藏起來。利用這種方法要占用大量系統(tǒng)資源,且要利用到外部程序“媒體播放機”,不是一個好方法。其實我們可以利用VFP的動態(tài)鏈接庫foxtools.fll來輕松實現(xiàn)背景音樂,而且極少占用系統(tǒng)資源。foxtools.fll位于VFP的安裝目錄中,默認安裝時可以在C:\\Program Files\\VFP5目錄下找到它,你可以把它單獨拷貝到你的考試系統(tǒng)項目的主目錄內(nèi),這里我們假定C:\\Quiz為我們考試系統(tǒng)的主目錄,把foxtools.fll拷貝到其內(nèi)。接著要準備一WAV格式的背景音樂文件(這里以back.wav這例),放于主目錄C:\\Quiz中;現(xiàn)在我們可以為系統(tǒng)添加背景了,在考試系統(tǒng)項目的第一個表單(這里為Form1)的Activate事件中加入如下代碼:
public sound
set defa to C:\\Quiz
set Library to foxtools.fll指定FoxPro 動態(tài)鏈接庫
sound=regfn(\"SndplaySound\",\"CI\",\"I\",\"Mmsystem\")
=callfn(sound,\"back.wav\",1)播放背景音樂back.wav
為了在表單釋放時關(guān)閉音樂,同時在LostFocus事件中加入代碼:
=Callfn(sound,\" \",0)
set library to
同理你可以為系統(tǒng)內(nèi)的任一個表單添加不同的背景音樂,方法是在表單的Activate和LostFocus事件中分別加入以上的代碼,如果指定音樂文件back.wav為其它wav,則可以播放出不同的背景音樂了。
2 考試系統(tǒng)的前期準備——數(shù)據(jù)庫準備
系統(tǒng)中要建立兩類數(shù)據(jù)庫:考生名冊庫與題庫。每個考試班級應(yīng)建立單獨的考生名冊數(shù)據(jù)庫,注意它在Visual foxPro中稱為表,即DBF文件。接著把考生班級放在登錄界面的下拉列表框中供考生選擇。這里建立三個樣例班級考生名冊表:97建經(jīng).DBF、97水電.DBF和97計中.DBF,每班人數(shù)不限,庫結(jié)構(gòu)如下表所示:
接著建立題庫,本無紙化考試系統(tǒng)包括三種題型:單項選擇題、多項選擇題、是非判斷題,故系統(tǒng)應(yīng)包括這三個測試模塊,三種題型的數(shù)據(jù)庫結(jié)構(gòu)如下:
單項選擇.dbf多項選擇.dbf是非判斷.dbf
建立完了數(shù)據(jù)庫后,輸入班級學(xué)生名冊和各類題目,準備工作即告結(jié)束。這里以20個單項選擇題(每題2分)、10個多項選擇題(每題4分)、10個是非判斷題(每題2分)為例進行考試,當然你也可以改變各類題目數(shù)量,但評分標準亦要進行相應(yīng)改變。
3 總體設(shè)計
首先要確定設(shè)計目標:系統(tǒng)能實現(xiàn)考生登錄、題目讀取、答題、成績統(tǒng)計和顯示等。
其中單項選擇和多項選擇同屬于選擇題型,但因多項選擇有多個正確答案,所以在設(shè)計上應(yīng)有所區(qū)別,剛好在Visual FoxPro中有單選框與復(fù)選框等控件與之相對應(yīng)。
各模塊功能如下:
1)登錄模塊:考生登錄功能;選擇班級、輸入學(xué)號后,系統(tǒng)打開考生名冊庫,把指針定位到與輸入學(xué)號相符的考生記錄,同時顯示該考生的姓名供考生核對,無誤后隨即進入測試模塊。
2)測試模塊:分為“單項選擇”、“多項選擇”、和“是非判斷”三個標準模塊。每個模塊界面大同小異,有“上一題”、“下一題”等按鈕,同時顯示題目總數(shù)和剩余量。
3)成績模塊:成績的統(tǒng)計與顯示功能。考生一旦登錄系統(tǒng),首先初化成績(Scores)為0,隨后每做一題即自動累加計分,待到考生按下“交卷”按鈕后,彈出一個顯示該考生成績的表單窗口,然后退出系統(tǒng),考試即告完成。
4 源代碼舉例
4.1 Form“考生登錄”(Activate事件)代碼
SET EXACT ON
set defa to sys(5)+\"\\quiz\"
modi window screen title\"紹興工業(yè)學(xué)校計算機考試系統(tǒng)\"
zoom window screen max 使運行窗口最大化
SET SYSMENU OFF 關(guān)閉窗口內(nèi)的系統(tǒng)菜單
set path to sys(2004)
public scores 定義一個存放考生成績的公用變量scores
scores=0
thisform.text2.SetFocus 把光標定位到輸入學(xué)號文本框
4.2 登錄模塊窗口中,輸入學(xué)號顯示考生姓名,核對無誤,按“正確無誤”按鈕進入測試模塊
對此按鈕設(shè)置代碼如下:
*******Button“正確無誤”(Click事件)代碼*********
XH=thisform.text2.value
BJ=thisform.Combo1.value
select 1
use \\quiz\\data\\BJ 打開選中的班級名冊庫
select 2
use \\quiz\\data\\單項選擇 打開“單項選擇”題庫
select 4
use \\quiz\\data\\多項選擇 打開“多項選擇”題庫
select 6
use \\quiz\\data\\是非判斷 打開“是非判斷”題庫
ifXH!=0如果學(xué)號不空
select 1
locate all for 學(xué)號=XH把指針定位到與輸入學(xué)號相符的考生記錄
if found()
thisform.text4.value=姓名 顯示考生姓名以便核對
成績=scores
wait\"\"
release thisform
do form \\quiz\\forms\\單項選擇 打開“單項選擇”模塊窗口
else
messagebox(\"沒有找到你的名字,請重新輸入學(xué)號\")
thisform.text4.value=\"沒有相應(yīng)姓名\"
endif
else
thisform.text4.value=\"查無此人\"
endif
4.3 Form“單項選擇”(Activate事件)代碼
public num 定義一個存放題目數(shù)量的公用變量num
select 2
count all to num
replace all 對錯 with .F.
go top
thisform.text1.value=題目讀取單項選擇題目
this.optiongroup1.option1.caption=\"A、\"+選a讀取選項A,以此類推
this.optiongroup1.option2.caption=\"B、\"+選b
this.optiongroup1.option3.caption=\"C、\"+選c
this.optiongroup1.option4.caption=\"D、\"+選d
this.label1.caption=str(num)顯示單項選擇題目總數(shù)
thisform.label2.caption=str(1)顯示當前為第1題
4.4 各模塊中的“下一題”按鈕不但能更新題目,同時具有分數(shù)累加功能
其源代碼如下:
********Button“下一題”(Click事件)代碼***********
if recno()<=num 如果庫指針沒有到達最尾
if thisform.optiongroup1.value=答案 如果考生答案與標準答案相同
replace 對錯 with .T.
else
replace 對錯 with .F.
endif
thisform.label2.caption=str(recno()+1)
skip 題庫中指針下移
thisform.label7.caption=\"\"
thisform.label8.visible=.f.
thisform.text2.visible=.f.
thisform.text1.value=題目 顯示下一個題目內(nèi)容
thisform.optiongroup1.option1.caption=\"A、\"+選a
thisform.optiongroup1.option2.caption=\"B、\"+選b
thisform.optiongroup1.option3.caption=\"C、\"+選c
thisform.optiongroup1.option4.caption=\"D、\"+選d
thisform.optiongroup1.value=0
else
select 2
count for 對錯=.T. to sco分數(shù)統(tǒng)計,統(tǒng)計答對的題目數(shù)量
scores=sco*2單項選擇每題2分,故要*2
select 1
replace成績 with scores把單項選擇模塊的得分記入考生成績字段
messagebox(\"單項選擇已做完,下面進入多項選擇!\")
do form \\quiz\\forms\\多選
thisform.hide
endif
4.5 為了使考生能修改前面做過的題目,設(shè)置“上一題”按鈕
其源代碼如下:
********Button“上一題”(Click事件)代碼***********
if !bof()如果庫指針沒有達到首記錄
skip –1題庫中指針向上移一個記錄
thisform.label2.caption=str(recno())
thisform.text1.value=題目以下顯示上一個題目內(nèi)容
thisform.optiongroup1.option1.caption=\"A、\"+選a
thisform.optiongroup1.option2.caption=\"B、\"+選b
thisform.optiongroup1.option3.caption=\"C、\"+選c
thisform.optiongroup1.option4.caption=\"D、\"+選d
thisform.label8.visible=.f.
thisform.label7.caption=\"\"
thisform.text2.value=\"\"
else
messagebox(\"已到單項選擇題之首!\")
endif
4.6 當考生做完了三種類型的題目后,就可以交卷了,故設(shè)置一個“交卷”按鈕
代碼如下:
********Button“交卷”(Click事件)代碼***********
yn=messagebox(\"確定要交卷嗎?\",4)
select 6
count for 對錯=.T. to sco3
if yn=6如果按下“是”按鈕
select 1
replace成績 with 成績+sco3*2統(tǒng)計分數(shù)并記入考生成績字段
endif
thisform.command1.enabled=.F. 屏蔽“下一題”按鈕
do form \\quiz\\forms\\成績單打開“成績單”表單窗口,顯示考生成績
4.7 為了顯示考生成績,單獨設(shè)計一個“成績單”表單
設(shè)計代碼如下:
*******Form“成績單”(Activate事件)代碼**********
select 1 打開考生名冊庫
thisform.label4.caption=姓名+\":\" 顯示當前考生姓名
thisform.label1.caption=alltrim(str(成績)) 顯示考生最終成績
以上程序在中文Windows XP環(huán)境, Microsoft Visual Foxpro 6.0中文版下調(diào)試通過。
參考文獻:
[1] 木林森,高峰.中文 Visual FoxPro 6.0使用與開發(fā)[M].北京:清華大學(xué)出版社,2006.