📄 rptpreview.bak
字号:
*-- 程序名称:RptPreview.prg
*-- 程序功能:以自定义的窗口显示报表的同时,显示自定义的工具条控制报表的预览打印...
*-- 使用方法:RptPreview ( <cReportName> [,cTitleName])
* 或者:do RptPreview with <cReportName> [, cTitleName ]
*-- 程序说明:cReportName 为 报表文件名(无须带扩展名),如果省略的话,则可显示工具条
* cTitlename 为 报表的标题(可省略,然后以报表文件名做标题)
* 报表的扩展名以 frx 为准
*-- 原创作者:红虎
*-- 联系方式:E-mail: hu_feng@163.net
* HomePage: http://rts.coolbel.com
* 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,"ico\btnhome.bmp","")
#define prev_name iif(isPicBtn,"","上页")
#define prev_pic iif(isPicBtn,"ico\btnprev.bmp","")
#define next_name iif(isPicBtn,"","下页")
#define next_pic iif(isPicBtn,"ico\btnnext.bmp","")
#define end_name iif(isPicBtn,"","末页")
#define end_pic iif(isPicBtn,"ico\btnend.bmp","")
#define print_name iif(isPicBtn,"","打印...")
#define print_pic iif(isPicBtn,"ico\btnprint.bmp","")
#define close_name iif(isPicBtn,"","关闭")
#define close_pic iif(isPicBtn,"ico\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
*-- 得到正确的报表文件名和报表标题
oPrvToolsBar.rptName = cReportName
oPrvToolsBar.rptTitle = cTitleName
*-- 定义预览窗口 --*-- 这个窗口相当于一个容器,用来容纳报表预览窗口,预览窗口的特征可以从这个窗口来继承 --*
DEFINE WINDOW WinRptPre ;
FROM 0,0 TO SROWS()-10,SCOLS()-10 ;
NOFLOAT system NOCLOSE NOGROW NOZOOM NOMINIMIZE ;
TITLE Preview_name +": "+cTitleName
report form &cReportName nocons environment&&-- 计算报表总页数
_pepage = _pageno && 将报表总页数记录在系统变量_pepage中,
&& 注意该变量不可以小于等于0,否则系统出错
&& 当报表计算出来没有可供显示的内容时,
&& 系统变量_pageno最小也是返回1,不会小于0
TotalPages=_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
if wexist("打印预览") &&-- 将系统打印预览工具条移到屏幕右下角,并释放她
move window "打印预览" to 100,100
release window "打印预览"
endif
if wexist("Print Preview")
move window "Print Preview" to 100,100
release window "Print Preview"
endif
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 = RGB(0,0,0)
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 separator10 AS separator
ADD OBJECT cmdprint AS commandbutton WITH ;
Height = btn_height, ;
Width = btn_width, ;
Caption = print_name, ;
Name = "cmdPrint", ;
ToolTipText = "报表打印", ;
Picture = print_pic
ADD OBJECT separator11 AS separator
ADD OBJECT separator12 AS separator
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.cmdPrint.enabled=printbz
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 cmdprint.Click &&-- 打印选项
do form dykz
* do bb_prin with oPrvToolsBar.rptName,oPrvToolsBar.rptTitle &&-- 调用打印设置对话框,需要另一个程序的支持: RptPrint
ENDPROC
PROCEDURE cmdclose.Click &&-- 关闭报表预览及打印工具条
release window Preview_name &&-- 释放预览窗口
this.parent.release &&-- 释放打印控制工具条
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 _pageno<_pepage&&-- 当页数在第一和最大之间时,四者都可用
.isRptTop =.F.
.isRptBot =.F.
case _pageno>1 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")&&-- 使全部按纽不可用.
.cmdPrint.enabled=printbz&&-- 保留打印设置和关闭按纽的可用
.cmdClose.enabled=.t.
.msg.rpt_info.caption = noRpt_loc&&-- 显示报表信息为没有报表
.rptTitle = noRpt_loc
.pageno = 0&&-- 记录当前页数为0,以使下次判断时,当前页数和记录的页数始终不相等
.ChkTimer.enabled = .F. &&-- 关闭时钟的检查
endif
endwith
ENDPROC
ENDDEFINE
*-- 结束定义
**************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -