舒 濤
(四川民族學院網絡信息中心,四川康定626001)
基于COM技術的試題庫系統試卷生成技術研究
舒 濤
(四川民族學院網絡信息中心,四川康定626001)
文章首先對當前試題庫系統在試題錄入、試卷生成時無法包含公式等對象的問題進行了分析,然后提出了采用COM技術將Word與試題庫系統進行溶合實現含有公式等對象的試題的錄入、顯示、編輯及試卷的自動生成,并給出了實現過程和關鍵代碼.
試題庫系統;試卷生成;COM;Delphi
隨著計算機技術和網絡技術的發展,逐漸出現了大量試題庫管理系統.試題庫管理系統的出現對于實現教考分離、提升考務管理水平、提高教學質量、減少人為因素對試卷質量的影響,體現考試的公平、客觀有著非常重要的意義.
實現含有圖、文、表、公式等混合內容的試題存儲和試卷及標準答案的自動生成已經是試題庫系統必須具備的功能.目前,許多試題庫管理系統是通過將每道試題先輸出到一個類似于Delphi中的TRichEdit組件這種能夠存放RTF格式的對象中,然后打開一個采用Microsoft Word制作的用于輸出試卷或答案的模板,在試卷生成程序中使用復制和粘貼操作將存放的RTF格式的本文輸入到Word文檔中,從而實現試卷或答案的生成.由于RTF格式本身較簡單無法存儲復雜的表、公式等內容,采用這種方法產生的試卷或答案也就無法包含復雜的表、公式等內容,使試題庫管理系統的實用性大打折扣,同時這種方法還存在操作麻煩,自動性差的缺點.
Microsoft Word作為一款優秀的文字處理軟件使用非常廣泛,是各位教師和考務工作者最熟悉的軟件之一.Word對文字、圖、表、各類符號、圖片,公式等試題基本內容的編輯和輸出均能夠很好的支持.因此采用Word文檔存儲和輸出試題及答案是非常實用的方法.而在程序中要實現Word文檔的存儲、編輯、讀取、顯示沒有純文本類型數據方便,本文針對利用Word文檔存儲試題信息要解決的主要問題進行了深入的探討,并給出具體的解決方法.
2.1 COM技術[1]
COM(Component Object Model,組件對象模型)是由微軟公司開發的一種分布式技術.它是基于Windows的、語言獨立的、以組件為發布單元的對象模型,用于運行于Windows下的各個軟件以一種統一的方式進行交互.COM技術以組件之間、應用程序之間、客戶端和服務器之間通過明確定義的接口進行通信提供了統一的標準,也為組件程序提供了一個面向對象的活動環境.它具有語言無關性、面向對象、進程透明性、可重用性等特點.且隨著COM技術的不斷發展,以基本COM服務為基礎,又逐漸形成了包括所謂自動技術、ActiveX控件技術以及活動文檔和活動目錄等在內的新的COM擴展.
一個典型的COM應用由COM服務器和COM客戶端這兩個基本構建塊組成,二者之間通過COM接口進行溝通.COM服務器是一個執行專門任務的組件軟件,它通過COM接口發布自己所提供的服務,而COM客戶端則是通過COM接口使用和控制COM服務器的軟件.COM應用的基本架構如圖1所示.

圖1 COM應用基本架構
2.2 應用程序連接Word的方式
在Delphi環境中可采用以下三種方式實現應用程序與Word的連接:
(1)通過OleContainer控件將Word嵌入.該方式能夠直接調用Word文檔,在調用時使用ole-Container控件的Run方法即可啟動Word文檔.該方式啟動的Word文檔與調用它的應用程序可以統一在一個界面上,但采用這種方式不能通過Delphi控制Word文檔,無法靈活地控制Word.
(2)通過Delphi中自帶的Servers控件調用Word.該方式實質是將Word當作一個COM應用服務器來進行處理.使用該方式操作Word,能夠較好的實現對Word的控制,但是還有一些如Word中的VBA無法在Delphi中調用,且這種方式啟動的Word與Delphi程序分屬兩個窗體,需要進行特別處理.
(3)通過OLE方式對Word進行控制.該方式是使用CreateOleObject方法啟動Word.這種方式能夠做到完全控制Word,能夠使用Word的所有屬性.該方法啟動的Word與應用程序也分屬兩個窗體.缺點是Delphi無法捕獲Ole對象的異常,對異常的處理需要自行處理,編程較復雜.
2.3 Delphi中的Word組件[2]
Delphi是Borland公司推出的一款RAD(Rapid Application Development,快速應用開發工具),在其中提供了大量的向導、類、接口、組件,為程序開發人員在應用程序中使用基于COM的類和組件提供了方便.在Delphi中有專門針對Word軟件的COM服務器,有關Word操作的組件有5個,介紹如下:
(1)WordDocument組件:用于Word文檔的創建、連接、斷開、存盤、文本插入、語法和拼寫檢查、字符查找、打印等功能.
(2)WordApplication組件:用于在應用程序中啟動和關閉Word并建立和斷開Word文檔的連接.
(3)WordFont組件:用于Word文檔中的字號、字體的設置.
(4)WordParagraphFormat組件:用于Word文檔的段落格式的設置.
(5)WordLetterContent組件:用于調用由信函向導創建的信函的元素.
通過上述5個組件,在Delphi中可以很方便實現對Word的操作,最終實現試題庫管理系統與Word的溶合.
3.2 試題添加與存儲
在添加試題時,將通過Delphi的Server組件連接并啟動Word,然后自動創建一個空白文檔,空白文檔創建完成后,教師就可以在這個文檔內輸入試題內容了.關鍵代碼如下:
TKWord.Documents.Add(EmptyParam,False, wdNewBlankDocument,True);//創建一空白文檔,并使Word窗口可見
TKWord.ConnectTo(TKWord.Documents.Item(ItemIndex));
TKWord.Options.CheckSpellingAs You Type:= False;//關閉拼音查找
TKWord.Options.CheckGrammarAsYouType:= False;//關閉語法檢查
試題錄入完成后需要保存到數據庫中,由于試題內容是保存為Word文檔,必須采用二進制類型的字段進行存儲.具體方法是先創建該試題文檔的文件流,再利用TBlobField類的LoadFromStream方法將試題文檔保存到“內容”字段中,關鍵代碼如下:
fs:=TFileStream.Create(STFilename,fmOpen-Read);/創建文件流,STFilename為試題文件名
fs.Position:=0;
TBlobField(ST.FiledByName(‘內容’)).Load-FromStream(fs);//將試題文件保存到“內容”字段中
fs.free;
3.3 試題讀取與編輯
由于試題是以Word文檔的形式存儲在數據庫中的,讀取和編輯均需在Word應用程序進行,但在試題庫管理中對試題進行維護時,除要編輯試題內容外,還要對試題的題型、分值、知識點、難易度等信息進行設置,這就要求在同一窗口中能夠顯示、編輯試題內容和相關信息.而采用Delphi的Server組件操作Word的一個缺點就是應用程序和Word窗口不能溶合,可采用Delphi的TOleContainer控件將Word文檔嵌入到Delphi Form中來實現應用程序和Word窗口的溶合.這里為每條試題記錄中的存儲文檔數據的字段創建一個對應的TOleContainer控件,而對其他類型的字段使用相對應控件顯示即可.在編輯試題信息時,先創建一個臨時Word文檔,再使用TBlobField類的Save-ToStream方法,將試題內容以寫入到該文檔中,最后用TOleContainer類的CreateLinkToFile方法鏈接該文檔,關鍵代碼如下:
STFileStream:=TFileStream.Create(‘temp_st.doc’,fmCreate);
TBlobField(ST.FieldByName(‘內容’)).Save-ToStream(STFileStream);//將試題內容字段保存到文件流
STFileStream.Free;
OleCconn1.CreateLinkToFile(‘temp_st.doc’, false);//在OleCconn1中顯示試題內容
編輯完成后,使用3.2節代碼即可將修改后的試題保存到數據庫中.
3.4 生成試卷
試題庫管理系統均具有智能組卷功能,通過組卷算法一般只抽取試題的題號,要將這些題號對應的試題內容放入到試卷文檔中才能形成試卷.對于試題內容以Word文檔形式存儲的試題庫管理系統來說,生成試卷的基本流程是:先打開試卷模板,并根據實際情況設置頁眉和頁腳信息,然后根據抽取的題型及題號將試題一一插入到試卷中就生成了試卷.
3.4.1 打開試卷模板文件
通常一個學校的試卷均會采用統一的樣式,因此在生成試卷時應先打開該模板.打開試卷模板的關鍵代碼如下:
TKWord.Documents.Open(SJFileName,Flase, Flase,,,Flase,,wdOpenFormatAuto,,True);
TKWord.ConnectTo(TKWord.Documents.Item(itemindex));
3.4.2 生成頁眉和頁腳
在試卷模板中有一些如考試科目、出題人、出題時間、頁號等變化的內容,只能通過頁眉和頁腳的方法來完成,關鍵代碼如下:
TKWord.Sections.Item(1).Headers.Item(1).Range. Text:=’《計算機文化基礎》試卷’;//設置頁眉
TKWord.Sections(1).Footers(wdHeaderFooterPrimary).PageNumbers.StartingNumber:=1//設置頁腳為頁碼
3.4.3 插入試題
在試卷模板中插入試題是自動生成試卷最核心的步驟,也是實現最為復雜的一步,其基本思路是:先將由抽題算法抽取的試題放入試卷表中,然后將記錄中的試題內容讀入到一個臨時Word文檔中,最后從該臨時文檔中將試題內容讀入到試卷模板的指定位置,同時還將進行題號等試卷元素的生成.由于實現該功能的代碼較長,這里采用偽Object Pascal語言對實現算法進行描述如下:
Begin
統計試卷中的試題類型;
For(試題類型數量)do
Begin
將含有題號、題型、總分值、單項分值、答題說明等內容的題型信息插入到試卷中;
通過SQL語句讀取試卷表中的該類型的全部試題;
While(記錄指針沒有移動到末尾)do
Begin
將小題號(與記錄號相同)輸出到試卷中,;
將記錄指針指向的試題的內容輸出到試卷中;
移動記錄指針讀取下一條記錄;
End
End
End
由于試題庫管理系統對于推進教考分離、提高教學質量的有著積極和作用,各級、各類教育機構對試題庫管理系統的建設越來越重視,而一個好的試題庫管理系統必須要能夠對多學科試題和試卷進行管理.本文提出了采用COM技術在應用程序中控制Word實現試題的錄入、保存和試卷的自動輸出,這樣就可以利用Word強大的編輯排版功能制作各種復雜的試卷.在具體實現上,文中雖然采用的是Delphi進行實現,但COM是一種與開發工具無關的技術,這些思路和方法也同樣適用于其它開發工具.
〔1〕Mark E.Russinovich,David A.Solomon,Alex Ionescu.深入解析Windows操作系統(第5版).北京:人民郵電出版社,2009.
〔2〕牛漢民.Delphi7高級應用開發教程[M].北京:科學出版社,2005.
〔3〕王文發,張根耀,王文東.應用Delphi與Word溶合技術實現試題庫試卷的自動生成[J].延安大學學報(自然科學版),2006(1):21-23.
〔4〕陳麗燕,祝建中.基于Word文檔的試題庫系統的實現[J].信息技術,2005(9):143-145.
〔5〕夏齡,周德榮,舒濤.一種網絡通用題庫系統的設計與實現[J].赤峰學院學報(自然科學版),2011 (2):58-60.
TP311.5
A
1673-260X(2013)08-0014-03
四川省教育廳一般項目資助(12ZB086)