分享

VFP報表列印技術深入探討集錦

 Alkaid2015 2015-01-08
報表列印技術深入探討集錦
下面是好多前輩以及各版主以前發的文章,我找了一宿,匆匆流覽了一下,覺得掌握了這些技巧,應該和雪心的終極列印比較接近了吧?是不是啊?若不是,老兵 和 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本身為我們提供了幾個與列印有直接關係的系統變數,它們是Sad部分)
_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 ---------------

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多