自定义报表预览控制工具条
說明:原有的VFP的打印預覽用多了感覺真的不是很方便,在某些特定的要求下,她就顯得很笨拙,尤其那個打印工具條上的打印機按紐,一點就打印了,有時候我們需要在那個時候進行有選擇性的打印而不是全盤的打出來,也不是很麻煩的還要再關閉打印預覽返回去再提示性的打印,所以此次更新在原有的自定義報表預覽窗口以及計算報表總頁數的基礎上,增加自定義的工具條,而使程序顯得更個性化。
提示:因為該文處于文章排版的需要,所以采用了漢字雙字節的空格,而這些空格在程序中執行會提示錯誤,所以請將以下代碼選擇復制后,請再處理去掉其中包含的雙字節空格,可用一些文字處理軟件將雙字節空格“ ”全部替換為單字節空格!
*– 程序名稱:RptPreview.prg
*– 程序功能:以自定義的窗口顯示報表的同時,顯示自定義的工具條控制報表的預覽打印…
*– 使用方法:RptPreview ( [,cTitleName])
* 或者:do RptPreview with [, cTitleName ]
*– 程序說明:cReportName 為 報表文件名(無須帶擴展名),如果省略的話,則可顯示工具條
* cTitlename 為 報表的標題(可省略,然后以報表文件名做標題)
* 報表的擴展名以 frx 為準
*– 原創作者:紅虎
*– 聯系方式:E-mail: hu_feng@163.net
* HomePage: http://www.honghoo.net
* Oicq: 1569040
*– 編寫日期:2001年1月
Func RPTPreview
para cReportName,cTitleName
#define ready_loc ”預覽報表 …”
#define noRptFile_loc ”報表文件&cReportName.不存在!”
#define noData_loc “當前工作區沒有可共預覽的數據,終止!”
#define RptExist_loc “是否替換原有的報表預覽?”
#define error_loc ”錯誤”
#define NoRpt_loc ”沒有報表可預覽”
#define RptShut_loc ”預覽報表已經關閉!”
#define RptClose_loc ”關閉打印預覽窗口?”
#define Preview_name ”報表名稱” && 用來顯示報表內容的窗口
#define Time_Refresh 500
&& 時鐘刷新頻率(微秒)
set message to ready_loc
#define isPicBtn .T.
&& 是否使用圖片按紐,如果為假時將采用文字按紐
#define btn_width iif(isPicBtn,23,56)
&& 按紐的寬度
#define btn_height iif(isPicBtn,22,25)
&& 按紐的高度
*– 設定按紐的圖片及標題
#define home_name iif(isPicBtn,”",”首頁”)
#define home_pic iif(isPicBtn,”btnhome.bmp”,”")
#define prev_name iif(isPicBtn,”",”上頁”)
#define prev_pic iif(isPicBtn,”btnprev.bmp”,”")
#define next_name iif(isPicBtn,”",”下頁”)
#define next_pic iif(isPicBtn,”btnnext.bmp”,”")
#define end_name iif(isPicBtn,”",”末頁”)
#define end_pic iif(isPicBtn,”btnend.bmp”,”")
#define setup_name iif(isPicBtn,”",”設置…”)
#define setup_pic iif(isPicBtn,”btnsetup.bmp”,”")
#define print_name iif(isPicBtn,”",”打印…”)
#define print_pic iif(isPicBtn,”btnprint.bmp”,”")
#define info_name iif(isPicBtn,”",”信息”)
#define info_pic iif(isPicBtn,”btnprop.bmp”,”")
#define close_name iif(isPicBtn,”",”關閉”)
#define close_pic iif(isPicBtn,”btnclose.bmp”,”")
*– 顯示預覽工具條
if type(”oPrvToolsBar”)=”O” and !isnull(oPrvToolsBar)
*– 如果已存在打印工具條,提示信息及打開工具條上的檢查時鐘
oPrvToolsBar.msg.rpt_info.caption = ready_loc
oPrvToolsBar.ChkTimer.enabled = .T.
else
*– 如果不存在打印工具條,則創建該工具條
public oPrvToolsBar
&& 定義工具條對象的全局變量
oPrvToolsBar=CreateObject(”preview”)
&& 創建工具條
oPrvToolsBar.msg.addobject(”rpt_info”,”rpt_info”)
&& 添加一個信息提示文本框
oPrvToolsBar.dock(0)
&& 使工具條在屏幕的最上邊
oPrvToolsBar.show
&& 顯示工具條
endif
*– 判斷是否正確傳遞報表標題參數
if type(”cTitleName”)#”C”
*– 如果報表標題的數據類型不是字符型的,那么將報表標題用報表的名稱來代替
cTitleName = cReportName
endif
*– 判斷是否正確傳遞報表文件名參數
if type(”cReportName”)#”C” or isNull(cReportName)
*– 如果傳遞來的報表的名稱不是字符型或是空的,那么應該終止,并提示沒有報表可顯示
*– 此時如果存在報表預覽窗口,那么要重新來獲取該報表的信息
with oPrvToolsBar
if wexist(Preview_name)
.isInited = .T.
.pageno = 0
.rptName = pcRptName
.rptTitle = pcRptName
else
.msg.rpt_info.caption = NoRpt_loc
endif
endwith
retu .f.
else
*– 報表文件名的擴展名以 FRX 為準
if !file(”&cReportName..frx”)
*– 如果傳遞來的報表文件不存在,那么應該終止,并提示文件不存在
messagebox(noRptFile_loc,16,error_loc)
retu .f.
endif
endif
*– 判斷是否當前有數據打開
* 對于報表來講需要當前有數據表被打開,否則也會自動彈出打開數據對話框
* 所以,如果當前沒有數據表打開,或打開的表的記錄數為0時,應該終止。
if !used() or recc()=0
if messagebox(noData_loc,1+48,error_loc) = 2
retu .f.
endif
endif
*– 得到正確的報表文件名和報表標題
oPrvToolsBar.rptName = cReportName
oPrvToolsBar.rptTitle = cTitleName
*– 定義預覽窗口
* 這個窗口相當于一個容器,用來容納報表預覽窗口,預覽窗口的特征可以從這個窗口來繼承
DEFINE WINDOW WinRptPre ;
FROM 0,0 TO SROWS()-10,SCOLS()-10 ;
FLOAT system CLOSE GROW ZOOM noMINIMIZE ;
TITLE Preview_name +”: “+cTitleName
*– 計算報表總頁數
report form &cReportName nocons environment
_pepage = _pageno
&& 將報表總頁數記錄在系統變量_pepage中,
&& 注意該變量不可以小于等于0,否則系統出錯
&& 當報表計算出來沒有可供顯示的內容時,
&& 系統變量_pageno最小也是返回1,不會小于0
pnTotalPages=_pageno
&& 此總頁數變量由用戶自定義,可以用到報表中顯示”共幾頁”的形式
&& 當使用該變量時,應實現用 public 來定義
*– 將預覽所要顯示的窗口最大化
ZOOM WINDOW WinRptPre MAX
*– 顯示報表,之前把原先有的先釋放!
if wexist(Preview_name)
&& 存在已有報表預覽窗口
if messagebox(RptExist_loc,4+32,”詢問”) = 7
&& 詢問是否替換原有的窗口
activate window Preview_name
&& 如果不替換,則激活原有的報表預覽窗口
zoom window Preview_name max
&& 并將該窗口最大化
retu .F.
&& 終止程序的繼續執行
endif
endif
*– 不管是否已經存在原有報表,首先釋放原有的報表預覽的窗口
* 如果該窗口不存在的話,則不做任何動作
release window Preview_name
*– 顯示預覽報表在剛才定義的窗口范圍內,并不等待,繼續執行,
* 如沒有nowait參數,報表象一個模式窗口會停留不前,
* 那么接下去的程序運行會因為沒有該報表的存在而產生錯誤
* 所以在這里這個NOWAIT很有必要,不可去掉!!!
REPORT FORM &cReportName PREVIEW WINDOW WinRptPre NOWAIT
*– 將系統打印預覽工具條移到屏幕右下角,并釋放她
move window “打印預覽” to 100,100
release window “打印預覽”
*– 釋放原有的用來放置預覽窗口的”容器”窗口
release window WinRptPre
*– 初始化工具條完成
* 并標記工具條上的一個是否已初始屬性為真.
oPrvToolsBar.isInited = .T.
*– 定義報表文件名為全局變量
public pcRptName
pcRptName = cReportName
set message to “預覽報表完成”
*– 定義控件:用來顯示報表頁數狀態
Define Class rpt_info AS label
AutoSize = .T.
Caption = “初始化報表 …”
Height = 16
Left = 5
Top = 6
Width = 86
ForeColor = #0000ff
Name = “rpt_info”
Visible = .T.
EndDefine
*– 定義控件:打印控制工具條
DEFINE CLASS preview AS toolbar
Caption = “報表預覽打印控制”
Name = “preview”
*– 對工具條新增以下屬性
pageno = 0
isinited = .F.
&& 是否初始完畢
rptName = “”
&& 當前報表文件名
rptTitle = norpt_loc
&& 當前報表名稱
isRptTop = .T.
&& 報表是否最前
isRptBot = .T.
&& 報表是否最尾
ADD OBJECT separator1 AS separator
&& 加上工具條分隔欄
ADD OBJECT separator2 AS separator
ADD OBJECT msg AS container WITH ;
Width = 110, ;
Height = btn_height, ;
SpecialEffect = 1, ;
Name = “msg”
ADD OBJECT separator5 AS separator
ADD OBJECT cmdhome AS commandbutton WITH ;
Height = btn_height, ;
Width = btn_width, ;
Caption = home_name, ;
Name = “cmdHome”, ;
ToolTipText = “第一頁”, ;
Picture = home_pic
ADD OBJECT cmdprev AS commandbutton WITH ;
Height = btn_height, ;
Width = btn_width, ;
Caption = prev_name, ;
Name = “cmdPrev”, ;
ToolTipText = “上一頁” , ;
Picture = prev_pic
ADD OBJECT separator7 AS separator
ADD OBJECT cmdnext AS commandbutton WITH ;
Height = btn_height, ;
Width = btn_width, ;
Caption = next_name, ;
Name = “cmdNext”, ;
ToolTipText = “下一頁”, ;
Picture = next_pic
ADD OBJECT cmdend AS commandbutton WITH ;
Height = btn_height, ;
Width = btn_width, ;
Caption = end_name, ;
Name = “cmdEnd”, ;
ToolTipText = “最后一頁” , ;
Picture = end_pic
ADD OBJECT separator9 AS separator
ADD OBJECT cmdSetup AS commandbutton WITH ;
Height = btn_height, ;
Width = btn_width, ;
Caption = setup_name, ;
Name = “cmdSetup”, ;
ToolTipText = “系統打印機設置”, ;
Picture = setup_pic
ADD OBJECT cmdprint AS commandbutton WITH ;
Height = btn_height, ;
Width = btn_width, ;
Caption = print_name, ;
Name = “cmdPrint”, ;
ToolTipText = “進入報表打印設置”, ;
Picture = print_pic
ADD OBJECT separator10 AS separator
ADD OBJECT cmdInfo AS commandbutton WITH ;
Height = btn_height, ;
Width = btn_width, ;
Caption = info_name, ;
Name = “cmdInfo”, ;
ToolTipText = “顯示報表文件的打印信息”, ;
Picture = info_pic
ADD OBJECT cmdclose AS commandbutton WITH ;
Height = btn_height, ;
Width = btn_width, ;
Caption = close_name, ;
Name = “cmdClose”, ;
ToolTipText = “關閉當前的報表”, ;
Picture = close_pic
*– 工具條的特殊之處是多了一個時鐘,用來檢查當前頁數,及其他的一些信息
ADD OBJECT ChkTimer AS timer WITH ;
Interval = time_refresh , ;
Name = “ChkTimer”
*– 控件添加完畢,下面開始控件過程
*– 工具條初始化
PROCEDURE Init
this.ChkTimer.height=0
this.ChkTimer.width=0
this.refresh
ENDPROC
*– 到首頁
PROCEDURE cmdHome.Click
ACTI window Preview_name
KEYBOARD ‘{HOME}’
ENDPROC
*– 上翻一頁
PROCEDURE cmdPrev.Click
ACTI window Preview_name
KEYBOARD ‘{PGUP}’
ENDPROC
*– 下翻一頁
PROCEDURE cmdNext.Click
ACTI window Preview_name
KEYBOARD ‘{PGDN}’
ENDPROC
*– 到頁尾
PROCEDURE cmdEnd.Click
ACTI window Preview_name
KEYBOARD ‘{END}’
ENDPROC
*– 系統打印設置
PROCEDURE cmdSetup.Click
sys(1037)
ENDPROC
*– 打印選項
PROCEDURE cmdprint.Click
*– 調用打印設置對話框,需要另一個程序的支持: RptPrint
RptPrint (this.parent.RptName)
ENDPROC
*– 獲取報表信息
PROCEDURE cmdInfo.Click
*– 顯示報表文件的打印信息,需要另一個程序的支持: DspRptInfo
DspRptInfo(this.parent.rptname)
ENDPROC
*– 關閉報表預覽及打印工具條
PROCEDURE cmdclose.Click
if messagebox(RptClose_loc,4+32,this.parent.rptTitle) = 6
*– 釋放預覽窗口
release window Preview_name
*– 釋放打印控制工具條
this.parent.release
endif
ENDPROC
*– 工具條刷新
PROCEDURE Refresh
With this
*– 刷新是對工具條上翻頁功能的可用不可用的控制
do case
*– 當頁數處于第一,且總頁數也是只有一頁時,四者都不可用
case _pageno=1 and _pepage=1
.isRptTop =.T.
.isRptBot =.T.
*– 當頁數處于第一,且總頁數大于一頁時,前兩者不可用
case _pageno=1 and _pepage>1
.isRptTop =.T.
.isRptBot =.F.
*– 當頁數在第一和最大之間時,四者都可用
case _pageno>1 and _pageno1 and _pageno=_pepage
.isRptTop =.F.
.isRptBot =.T.
endcase
*– 可是當沒有初始化時,四者都不可用
if !this.isInited
.isRptTop = .T.
.isRptBot = .T.
endif
*– 甚至四個按紐的可用性,前兩個和后兩個分別協調一致
.cmdHome.enabled = !.isRptTop
.cmdPrev.enabled = !.isRptTop
.cmdNext.enabled = !.isRptBot
.cmdEnd. enabled = !.isRptBot
Endwith
ENDPROC
*– 時鐘刷新
PROCEDURE ChkTimer.Timer
with this.parent
*– 當報表預覽初始化,及改變了頁號時
if _pageno # .pageno and .isInited
.pageno = _pageno
&& 當改變了報表的頁號后,重新改寫屬性.pageno的值
.msg.rpt_info.caption = “第 “+allt(str(_pageno))+” 頁,共 “+allt(str(_pepage))+” 頁”
.msg.width = .msg.rpt_info.width + 10
&& 調整信息框的寬度使其寬度適中
.refresh()
&& 刷新工具條,使重新改變按紐的可用性
endif
*– 當被預覽的報表不存在時
if !wexist(Preview_name) and .isInited
set message to rptshut_loc
*– 初始化失敗
.isInited = .F.
*– 使全部按紐不可用.
.setall(”enabled”,.F.,”commandbutton”)
*– 保留打印設置和關閉按紐的可用
.cmdSetup.enabled=.t.
.cmdClose.enabled=.t.
*– 顯示報表信息為沒有報表
.msg.rpt_info.caption = noRpt_loc
.rptTitle = noRpt_loc
*– 記錄當前頁數為0,以使下次判斷時,當前頁數和記錄的頁數始終不相等
.pageno = 0
*– 關閉時鐘的檢查
.ChkTimer.enabled = .F.
else
*– 打印和報表信息兩個按紐的可用性受報表是否初始化影響
.cmdPrint.enabled = .isInited
.cmdInfo. enabled = .isInited
endif
.msg.rpt_info.ToolTipText = .msg.rpt_info.caption
endwith
ENDPROC
ENDDEFINE
*– 結束定義
**************************************************
>>>
請下載該示例 dbf2excel.zip 31.3K
點擊下載此文件
[url=mailto:hu_feng@163.net?subject=About_dbf2excel]
如有問題,請來信
[/url]
!
注:該下載包中含有的文件有:
執行程序:dbf2excel_sample.prg
自由表表:sample_item.dbf
包含文件:vb_marco.h
報表預覽:RptPreview.prg
報表打印:RptPrint.prg
報表信息:DspRptInfo.prg
報表預覽工具條上的8個圖片文件
報表文件,表單文件,項目文件各一個
轉載于:https://www.cnblogs.com/hylan/archive/2008/10/03/1303449.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的自定义报表预览控制工具条的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL配置root远程连接mysql
- 下一篇: ANSYS Workbench流-热-固