?? rptpreview.prg
字號:
*-- 程序名稱:RptPreview.prg
*-- 程序功能:以自定義的窗口顯示報(bào)表的同時,顯示自定義的工具條控制報(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)
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 "錯誤"
#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 && 時鐘刷新頻率(微秒)
set message to ready_loc
#define isPicBtn .T. && 是否使用圖片按紐,如果為假時將采用文字按紐
#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" and !isnull(oPrvToolsBar)
*-- 如果已存在打印工具條,提示信息及打開工具條上的檢查時鐘
oPrvToolsBar.msg.rpt_info.caption = ready_loc
oPrvToolsBar.ChkTimer.enabled = .T.
else
*-- 如果不存在打印工具條,則創(chuàng)建該工具條
public oPrvToolsBar && 定義工具條對象的全局變量
oPrvToolsBar=CreateObject("preview") && 創(chuàng)建工具條
oPrvToolsBar.msg.addobject("rpt_info","rpt_info") && 添加一個信息提示文本框
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)表可顯示
*-- 此時如果存在報(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ù)打開
*對于報(bào)表來講需要當(dāng)前有數(shù)據(jù)表被打開,否則也會自動彈出打開數(shù)據(jù)對話框
*所以,如果當(dāng)前沒有數(shù)據(jù)表打開,或打開的表的記錄數(shù)為0時,應(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ù)覽窗口
*這個窗口相當(dāng)于一個容器,用來容納報(bào)表預(yù)覽窗口,預(yù)覽窗口的特征可以從這個窗口來繼承
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)出錯
&& 當(dāng)報(bào)表計(jì)算出來沒有可供顯示的內(nèi)容時,
&& 系統(tǒng)變量_pageno最小也是返回1,不會小于0
pnTotalPages=_pageno && 此總頁數(shù)變量由用戶自定義,可以用到報(bào)表中顯示"共幾頁"的形式
&& 當(dāng)使用該變量時,應(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ù)覽的窗口
*如果該窗口不存在的話,則不做任何動作
release window Preview_name
*-- 顯示預(yù)覽報(bào)表在剛才定義的窗口范圍內(nèi),并不等待,繼續(xù)執(zhí)行,
*如沒有nowait參數(shù),報(bào)表象一個模式窗口會停留不前,
*那么接下去的程序運(yùn)行會因?yàn)闆]有該報(bào)表的存在而產(chǎn)生錯誤
*所以在這里這個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)記工具條上的一個是否已初始屬性為真.
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 = RGB(0,0,255)
Name = "rpt_info"
Visible = .T.
EndDefine
*-- 定義控件:打印控制工具條
DEFINE CLASS preview AS toolbar
Caption = "報(bào)表預(yù)覽打印控制"
Name = "preview"
*-- 對工具條新增以下屬性
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
*-- 工具條的特殊之處是多了一個時鐘,用來檢查當(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è)置對話框,需要另一個程序的支持: RptPrint
RptPrint (this.parent.RptName)
ENDPROC
*-- 獲取報(bào)表信息
PROCEDURE cmdInfo.Click
*-- 顯示報(bào)表文件的打印信息,需要另一個程序的支持: 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
*-- 刷新是對工具條上翻頁功能的可用不可用的控制
do case
*-- 當(dāng)頁數(shù)處于第一,且總頁數(shù)也是只有一頁時,四者都不可用
case_pageno=1 and _pepage=1
.isRptTop =.T.
.isRptBot =.T.
*-- 當(dāng)頁數(shù)處于第一,且總頁數(shù)大于一頁時,前兩者不可用
case_pageno=1 and _pepage>1
.isRptTop =.T.
.isRptBot =.F.
*-- 當(dāng)頁數(shù)在第一和最大之間時,四者都可用
case_pageno>1 and _pageno<_pepage
.isRptTop =.F.
.isRptBot =.F.
*-- 當(dāng)頁數(shù)在最后一頁時,后兩者不可用
case_pageno>1 and _pageno=_pepage
.isRptTop =.F.
.isRptBot =.T.
endcase
*-- 可是當(dāng)沒有初始化時,四者都不可用
if !this.isInited
.isRptTop = .T.
.isRptBot = .T.
endif
*-- 甚至四個按紐的可用性,前兩個和后兩個分別協(xié)調(diào)一致
.cmdHome.enabled = !.isRptTop
.cmdPrev.enabled = !.isRptTop
.cmdNext.enabled = !.isRptBot
.cmdEnd. Enabled = !.isRptBot
Endwith
ENDPROC
*-- 時鐘刷新
PROCEDURE ChkTimer.Timer
with this.parent
*-- 當(dāng)報(bào)表預(yù)覽初始化,及改變了頁號時
if _pageno # .pageno and .isInited
.pageno = _pageno&& 當(dāng)改變了報(bà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)表不存在時
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,以使下次判斷時,當(dāng)前頁數(shù)和記錄的頁數(shù)始終不相等
.pageno = 0
*-- 關(guān)閉時鐘的檢查
.ChkTimer.enabled = .F.
else
*-- 打印和報(bào)表信息兩個按紐的可用性受報(bào)表是否初始化影響
.cmdPrint.enabled= .isInited
.cmdInfo. Enabled= .isInited
endif
.msg.rpt_info.ToolTipText = .msg.rpt_info.caption
endwith
ENDPROC
ENDDEFINE
*-- 結(jié)束定義
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -