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