VisualFoxPro9.0中擴(kuò)展報表系統(tǒng)功能

字號:

微軟在2004年歲末發(fā)布最新版Visual Foxpro 9.0,這則消息讓我們回想起曾經(jīng)風(fēng)光無限的Foxpro,現(xiàn)在它已經(jīng)被Java、Delphi、VB等眾多明星遮掩了光芒,有人認(rèn)為如果不是誕生在豪門微軟,它肯定已經(jīng)消失。但了解Visual Foxpro的都知道,Visual Foxpro的卓越性能是無法代替的。
    新版Visual Foxpro 9.0在Foxpro社區(qū)引起了轟動,新版中將包含一個更快的本地數(shù)據(jù)引擎,支持更多的數(shù)據(jù)類型,SQL語句執(zhí)行中有更大的一致性,一個完全重新設(shè)計的可擴(kuò)展報表編寫器,以及一系列效率和功能增強(qiáng)特性。
    在Visual FoxPro 9.0的報表系統(tǒng)出現(xiàn)了難以置信的改進(jìn)。在本文中,我只討論幾個新增功能中的一個——擴(kuò)展運行時報表引擎(runtime reporting engine)的能力。
    Visual FoxPro小組在處理運行時改進(jìn)工作時一直緊記著幾個目標(biāo),包括: 處理打印和預(yù)覽之外的多種報表輸出
    使用GDI+進(jìn)行報表輸出。這會帶來很多顯著的改進(jìn),例如精確地顯示、圖像和字體的平滑調(diào)整,以及一些附加的能力(例如文本旋轉(zhuǎn))
    提供一個更加靈活和可擴(kuò)展的報表系統(tǒng)
    你可以同時訪問舊的和新的報表引擎,因此你可以根據(jù)需要選擇在哪種引擎下運行報表。但是一旦你看到新的報表引擎的優(yōu)點,你就再也不希望使用舊式報表了。
    報表系統(tǒng)的架構(gòu)
    Visual FoxPro 9以前版本中的報表系統(tǒng)類似于單片電路:它處理所有細(xì)節(jié)信息,只有少量的例外(用戶定義的函數(shù)、報表帶條的OnEntry和OnExit表達(dá)式等等),在報表運行的時候,你是不能與它交互操作的。
    新的報表引擎把報表的功能分成了兩部分:現(xiàn)在的報表引擎只處理數(shù)據(jù)和對象定位;一種新對象(報表監(jiān)聽器)處理顯示和輸出的事務(wù)。由于報表監(jiān)聽器是類(class),因此我們現(xiàn)在可以使用以前夢寐以求的方式與報表進(jìn)程交互操作。
    新的報表語法
    Visual FoxPro 9支持使用舊的報表引擎運行報表;你可以像以前一樣使用REPORT命令(盡管你可以使用新命令重載REPORT的行為)。為了得到新式的報表行為,必須使用REPORT命令的OBJECT子句。OBJECT子句支持兩種使用方法:指定報表監(jiān)聽器和指定報表樣式。微軟把它歸納為對象輔助(object-assisted)報表。
    報表監(jiān)聽器是提供新式報表行為的對象。報表監(jiān)聽器是基于Visual FoxPro 9的新的基礎(chǔ)類ReportListener的。為了讓Visual FoxPro 9使用報表指定的監(jiān)聽器,需要實例化監(jiān)聽器類,并在REPORT命令的OBJECT子句中指出該對象的名稱。下面是一個例子:
    loListener = createobject('MyReportListener')
    report form MyReport object loListener
    如果不希望手動實例化監(jiān)聽器,可以通過指定報表類型讓Visual FoxPro自動為你完成實例化過程,例如:
    report form MyReport object type 1
    已經(jīng)定義好的類型有: 0——從打印機(jī)輸出
    1——預(yù)覽
    2——某個時刻的頁面信息模式,但不會輸出到打印機(jī)
    3——所有頁面模式,但不會調(diào)用預(yù)覽窗口
    4——XML輸出
    5——HTML輸出
    當(dāng)然我們還可以使用其它的用戶自定義類型。
    使用這種方式運行報表的時候,將調(diào)用新的_REPORTOUTPUT系統(tǒng)變量(默認(rèn)情況下它位于Visual FoxPro主目錄的ReportOutput.APP中)中指定的應(yīng)用程序來決定指定該類型使用哪種監(jiān)聽器類來實例化。它是通過查看APP中內(nèi)建的監(jiān)聽器注冊表(盡管你可以指定它使用一個外部表)中的監(jiān)聽器類型來實現(xiàn)的。如果它找到了需要的類,它就實例化該類并傳遞該監(jiān)聽器對象的一個引用到報表引擎中。因此,在REPORT命令中使用OBJECT TYPE 某種類型的效果與下面的代碼的效果是相同的:
    loListener = .NULL.
    do (_ReportOutput) with SomeType, loListener
    report form MyReport object loListener
    報表監(jiān)聽器
    在報表運行的過程中,伴隨著報表事件的發(fā)生,Visual FoxPro把這些事件暴露給基于ReportListener基類的對象。Visual FoxPro幫助文件記錄了ReportListener的屬性、事件和方法(PEMs),但是在本文中我只討論其中最有用的一些。
    表1列舉了ReportListener類的最常使用的一些屬性。
    表1:ReportListener類的一些有用屬性
    屬性
     描述
    CurrentDataSession
     報表數(shù)據(jù)的數(shù)據(jù)對話ID
    FRXDataSession
     FRX游標(biāo)的數(shù)據(jù)對話ID
    GDIPlusGraphics
     用于顯示的GDI+繪圖對象句柄
    ListenerType
     監(jiān)聽器生成的報表輸出類型。默認(rèn)值是-1(無輸出),你應(yīng)該把它改成符合需要的值。它的值與REPORT 命令的OBJECT TYPE 子句中規(guī)定的值是相同的。
    OutputPageCount
     被顯示的頁面的數(shù)量
    QuietMode
     如果它的值為.T. (默認(rèn)值是 .F.) 就支持進(jìn)度信息
    表2顯示了經(jīng)常使用的ReportListener的事件和方法。
    表2:ReportListener的一些有用的事件和方法
    事件/方法
     描述
    LoadReport
     在FRX被載入和打印機(jī)假脫機(jī)操作被打開前調(diào)用
    UnloadReport
     在報表運行之后調(diào)用
    BeforeReport
     在FRX被載入但是報表運行前調(diào)用
    AfterReport
     報表運行后調(diào)用
    BeforeBand
     處理某個報表條帶前調(diào)用
    AfterBand
     處理某個報表條帶后調(diào)用
    EvaluateContents
     顯示某個字段前調(diào)用
    Render
     顯示對象的時候調(diào)用
    OutputPage
     向特定的設(shè)備輸出指定顯示的頁面