報表列印技術深入探討集錦
下面是好多前輩以及各版主以前發的文章,我找了一宿,匆匆流覽了一下,覺得掌握了這些技巧,應該和雪心的終極列印比較接近了吧?是不是啊?若不是,老兵 和 centch 你們一定要批判我,可不能看著兄弟出洋相而置之不理啊。 :) 另外,近來有好多狐友問關於報表列印的問題,我想,看了下面的幾個常式會很有幫助的。 概述 在以編程方式創建報表時, 可以使用以下公式來計算報表中物件的寬度: 625/6 每象素報表單位 更多資訊 FONTMETRIC 函數返回指定字體的不同屬性. 例如, FONTMETRIC(6) 返回當前字體的平均字元象素寬. 因此, 要計算報表中五個字元需要的平均寬度, 可用以下公式: reportwidth = 625/6 * ; (FONTMETRIC(6, <cFontName>, <nFontSize>, <cFontStyle>) * ; nNumCharacters) nNumCharacters 指定字元數. 以下代碼將保存 5 個字元寬的 Times New Roman 字體, 12 號字,普通字型在報表中所需要的平均寬度到變數 reportwidth 中. reportwidth = 625/6 * (FONTMETRIC(6, "Times New Roman", 12, "N") * 5) 列印系統變數簡單介紹: 當列印報表時,常會在每一頁的上端印上頁眉,但是如何取得某一頁已列印完並進一張新紙的資訊呢?方法是利用ON PAGE命令: ON PAGE[AT LINE<第幾行>][<命令>] 如: ON PAGE AT LINE 56 DO print_foot PROC print_foot ?'本表由建設銀行製作' ENDPROC 行號可以從_PLINENO系統變數取得,_PLINENO這個系統變數可以返回或設定當前列印的行號,其範圍可以從0至_PLENGTH-1(即打印紙長度減1),_PLENGTH這個系統變數用於設定或返回打印紙的頁長,普通的打印紙是66行長,範圍值從1到32767,這個變數的設定會影響_PLINENO及跳頁的頻率。 列印系統變數簡單介紹: _PADVANCE 語法:_PADVANCE=cAdvanceMethod 類型:字元 預設值:FORMFEED 說明:本系統變數用於設定列印進紙的方式,其值分為以下兩種: FOEMFEED以整張打印紙進紙 LINEFEED表示進了數行後的位置作為一頁的開始 注意: 計算進紙的行數的方法有以下兩種: 當執行EJECT PAGE或PRINTJOB...ENDPRINTJOB命令時,使用公式(_PLENGTH-_PLINENO) 當執行EJECT命令或輸出到印表機後執行@...SAY命令時,使用公式(_PLENGTH-MOD(PROW(),_PLENGTH)) 參閱:_PLENGTH,_PLINENO,_PEJECT _PAGENO 語法:_PAGENO=cAdvanceMethod 類型:數值 預設值:1 說明:本系統變數保存或設定當前的列印頁號,在列印報表時,可以在報表上列印出頁號。 注意:範圍從1-32767 參閱:_PBPAGE,_PEPAGE,ON PAGE _PBPAGE 語法:_PBPAGE=nBeginningPage 類型:數值 預設值:1 說明:本系統變數用於設定或返回印的起始頁號,當_PBPAGE的值大於_PAGENO的值,將不會列印任何資料。 注意:範圍從1-32767 參閱:_PAGENO,_PEPAGE _PCOLNO 語法:_PCOLNO=nCloumn 類型:數值 預設值:當前列位置 說明:本系統變數可以設定或當前打印頭的列位置,使用本變數的效果與使用?命令的AT參數相同。 注意:如果_WRAP設定為.T.,而本變數的設定值小於當前打印頭的列位置,則列印緩衝區的內容會被覆蓋而且也不會列印出來。 參閱:PCOL() _PCOPIES 語法:_PCOPIES=nCopies 類型:數值 預設值:1 說明:本系統變數用於返回或設定列印份數。 注意:必須在執行PRINJOB...ENDPRINTJOB命令之前將列印份數保存在_PCOPIES 參閱:無 _PEJECT 語法:_PEJECT=cPageEjectvalue 類型:字元 預設值:BEFORE 說明:本系統變數用於控制跳頁的方式,其設定值如下: BEFORE 在列印前跳頁 AFTER在列印後跳頁 BOTH 列印前後都跳頁 NONE 列印前後都不跳頁 注意: 本變數在FoxPro for DOS中的預設值是BEFORE,在Visaul FoxPro中的預設值是NONE,本變數只有在PRINTJOB...ENDPRINTJOB命令塊中才有效 參閱:_PECODE,PRINTJOB...ENDPRINTJOB _PEPAGE 語法:_PEPAGE=nLastPageNumber 類型:數值 預設值:32767 說明:本系統變數用於返回或設定列印的終止頁號。 注意:_PEPAGE必須大於_PBPAGE 參閱:_PAGENO,_PBPAGE _PLENGTH 語法:_PLENGTH=nLinesPerPage 類型:數值 預設值:66 說明:本系統變數用於返回或設定打印紙的頁長。普通的打印紙是66行長,數值範圍從1至32767。 注意:本變數的值會影響_PLINENO及跳頁的頻率 參閱:EJECT,ON PAGE _PLINENO 語法:_PLINENO=nCurrentline 類型:數值 預設值:0 說明:本系統變數用於返回或設定列印的行號。數值範圍從0至_PLENGTH-1(即打印紙長度減1)。 注意:本變數與PROW()函數功能相似,他們的出不同在於: PROW()函數返回打印頭的位置 只有在SET PRINTER被設定為ON時,PROW()函數才有效 _PLINENO會自動增加,不論輸出設備是檔、印表機或螢幕 參閱:PROW() _PPITCH 語法:_PPITCH=cExpression 類型:字元 預設值:DEFAULT 說明:本系統變數用於設定印表機的解析度,設定值如下: PICA每英寸10個字元 ELITE 每英寸12個字元 CONDENSED 每英寸17個字元 DEFAULT 使用預設值 注意:如果印表機本身無法列印出太高的密度,進行設定也是無效的。 參閱:無 _PQUALITY 語法:_PQUALITY=lExpression 類型:邏輯 預設值:.F. 說明:本系統變數用於控制列印質量,如果設置為.t.,列印的速度會下降,但列印的質量比較好。 _PSPACING 語法:_PSPACING=nLineSpacing 類型:數值 預設值:1 說明:本系統變數用於控制列印行距,數值範圍界於1-3之間,預設值是1 _PWAIT 語法:_PWAIT=lExpression 類型:邏輯 預設值:.F. 說明:本系統變數用於列印換頁時是否暫停,.t.為暫停。 關於報表列印 江蘇 常州 老王 99.11.30 E-mailcfyns@163.net VFP所提供的報表設計器雖說功能強大,並能提供所見所得的報表預覽, 但我總覺得沒有DOS下直接用代碼編制的列印程式來得方便和自由,雖然DOS 沒有預覽功能。也正因為如此,我很少談及VFP 的列印問題,為了和大家交 流,這次也談談VFP的報表列印問題,希望以此和大家共同探討。 一、部分與列印有關的系統變數 VFP本身為我們提供了幾個與列印有直接關係的系統變數,它們是 ![]() _BOX 是否列印文字邊框,.T.=列印 _GETNPD 指定或保存印表機介面驅動程式的檔案名。 _PADVANCE 設定打印紙進紙方式,=FORMFEED(默認)整張進紙。 _PAGENO 設定或保存當前的列印頁號。 _PBPAGE 設定或返回列印的起始頁號。 _PEPAGE 設定或返回列印的終止頁號。 _PCOLNO 設定或返回當前打印頭的列。 _PLINENO 設定或返回當前打印頭的行。 _PCOPIES 設定或返回列印份數。 _PLENGTH 設定或返回打印紙的頁長,默認=66行長。 _PPITCH 設定印表機的列印密度。 _PQUALITY 設定印表機的列印質量。 ... ... 這些變數在設計報表程式時,有些是很有用的,故在此列出。 二、一些常用的列印技巧 1.怎樣列印指定的頁 REPORT FORM XXXX RANGE 2,5 TO PRINTER &&從第2起打至第5頁止 2.如何計算總頁數,以實現“第?頁/總?頁” 在列印前根據細節區所列印的記錄條數,先進行計算,然後再列印,具體代碼: PUBL mPAGE SELE XXX &&xxx=供列印的資料表 XX=10 &&XX=細節區所列印的記錄條數 mPAGE=IIF(RECCOUNT()%XX=0,INT(RECCOUNT()/XX),INT(RECCOUNT()/XX)+1) mPAGE就是總頁數,這樣在需要總頁數的地方就可直接引用mPAGE變數了。 3.如何使報表打滿一頁 如果列印的記錄不足一頁,“頁注腳”會自動上移,影響報表的美觀,解決的 辦法和上面的差不多,即補足一頁中所缺少的記錄(補足空白記錄): SELE XXX &&xxx=供列印的資料表 XX=10 &&XX=一頁細節區所列印的記錄條數 mI=RECCOUNT()%XX &&取得缺少的記錄條數 FOR I=1 to mI APPEND BLANK ENDF 4.報表在設計時明明可以列印,可一安裝到其他機器或重裝系統後,就會出現 “XXX 帶區太大不能放入頁中”等提示,而且無法正常退出(尤其是對自定義紙張 大小的程式),這是為什麼呢? 我們用報表設計器設計的列印程式,保存退出後,磁片上就會出現 .frx和.FRT 檔,我們的所有設計均保存在這兩個檔中。在VFP中 .frx相當於.DBF表,.FRT 相當於.FPT備註型檔,我們用USE XXX.frx 可以象打開.DBF文件一樣打開.frx文 件,在.frx檔中有個Expr備註型欄位名,在這個欄位名中有如下內容:其中()內是 我所加的譯文 ====================================================================== RIVER=winspool DEVICE=Epson LQ-1600K OUTPUT=LPT1: ORIENTATION=0 PAPERSIZE=256 (紙張大小) PAPERLENGTH=1000 (紙張長度) PAPERWIDTH=1600 (紙張寬度) DEFAULTSOURCE=8 (默認來源) PRINTQUALITY=180 (列印質量) COLOR=2 YRESOLUTION=180 TTOPTION=1 ====================================================================== 從這個Expr備註型欄位裏可以看出:PAPERSIZE=256 這裏的256表示是自定義紙張, 如果: PAPERSIZE=9 為A4、11為A5 具體資料見VFP幫助的Printfo()一節, 而: PAPERLENGTH=1000 (紙張長度) PAPERWIDTH=1600 (紙張寬度) 則分別代表自定義紙張的長度和寬度。 之所以會出現上面提到的問題,是因為系統重 新安裝印表機後,WIN系統一般默認的是A4打印紙,與我們設計時保存在.frx文件裏的 紙張不符,因而造成這種情況。 那麼如何避免出現這個問題呢? 下面是一段檢測紙張類型的代碼,供您參考: 這段代碼必須放在執行report form ... 命令前。 use xxx.frx in 0 ALIAS mPrint &&在空閒工作區以mPrint別名打開xxx.frx文件 x=atcline('PAPERSIZE',mPrint.Expr) &&取得PAPERSIZE在Expr欄位中的行 sSIZE=subs(mline(mPrint.Expr,x),11) &&取得設計時保存的紙張類型 mSIZE=allt(str(Prtinfo(2))) &&取得當前印表機默認的紙張類型 x=atcline('PAPERLENGTH',mPrint.Expr) &&取得紙張長度在Expr欄位中的行 sLEN=subs(mline(mPrint.Expr,x),13) &&取得紙張長度 x=atcline('PAPERWIDTH',mPrint.Expr) &&取得紙張寬度在Expr欄位中的行 sWIDTH=subs(mline(mPrint.Expr,x),12) &&取得紙張寬度 use in 'mPrint' &&關閉xxx.frx文件 if sSIZE=mSIZE &&如果相符,則正常列印 report form xxx.frx to printer else Messagebox('請設定印表機紙張為自定義:長='+sLEN+',寬='+sWIDTH,0+48+0,'提示') report form xxx.frx to printer prompt &&列印前先打開印表機設置對話視窗 endi 5.不讓列印的結果顯示在螢幕上 report form xxx.frx to printer Noconsole 6.列印或列印預覽時,如何使系統列印工具條不出現 系統提供的列印工具條,我們無法檢測其各按鈕的事件,不能掌握用戶當時操 作的情況,那如何不讓它出現呢? 首先您得做一個表單(最好是模式表單),用於代替系統的預覽視窗(Preview),然後: do form dybd &&打開這個表單 report form xxx.frx windows dybd 這樣系統提供的列印工具條就不會出現了。 當然如果自己再做個類似於列印工具條的類,既可掌握按鈕事件又美觀就更好了, 注:經查VFP3.0可能沒有windows子句。 很慚愧,我平時很少用VFP的報表設計器來編制列印程式(用其他語言代替的), 所以能談的體會很少,十分希望這方面的高手能介紹您的經驗,謝謝! =================================== 我所寫出的代碼可能不是最合理和最精練的,只是提出一種思路或方法 供大家參考,希望能對您有所幫助。 ------------------------------------------------ END --------------- |
|
来自: Alkaid2015 > 《75.VFP狐仙◆》