📄 reportpreview.prg
字号:
*-- ===============================================================
*-- 程序名称:RptPreview.prg
*-- 程序功能:以自定义的窗口显示报表的同时,显示自定义的工具条控制报表的预览打印...
*-- 使用方法:RptPreview ( <cReportName> [,cTitleName])
* 或者:do RptPreview with <cReportName> [, cTitleName ]
*-- 程序说明:cReportName 为 报表文件名(无须带扩展名),如果省略的话,则可显示工具条
* cTitlename 为 报表的标题(可省略,然后以报表文件名做标题)
* 报表的扩展名以 frx 为准
*-- 原创作者:红虎
*-- 联系方式:E-mail: hu_feng@163.net
* HomePage: http://www.honghoo.net
* Oicq: 1569040
*-- 编写日期:2001年1月
*-- ===============================================================
Func ReportPreview
para cReportName,cTitleName,cDataSource
#include ../inc/system.h
set message to ready_loc
*-- 显示预览工具条
if type("oPrvToolsBar")="O" and !isnull(oPrvToolsBar)
*-- 如果已存在打印工具条,提示信息及打开工具条上的检查时钟
oPrvToolsBar.msg.rpt_info.caption = ready_loc
oPrvToolsBar.ChkTimer.enabled = .T.
else
*-- 如果不存在打印工具条,则创建该工具条
public oPrvToolsBar && 定义工具条对象的全局变量
oPrvToolsBar=CreateObject("RptPrvToolsBar") && 创建工具条
oPrvToolsBar.dock(0) && 使工具条在屏幕的最上边
oPrvToolsBar.show && 显示工具条
set mark of bar 3 of my_view to .T.
endif
*-- 判断是否正确传递报表标题参数
if type("cTitleName")#"C"
*-- 如果报表标题的数据类型不是字符型的,那么将报表标题用报表的名称来代替
cTitleName = cReportName
endif
*-- 判断是否正确传递报表文件名参数
if type("cReportName")#"C" or isNull(cReportName)
*-- 如果传递来的报表的名称不是字符型或是空的,那么应该终止,并提示没有报表可显示
*-- 此时如果存在报表预览窗口,那么要重新来获取该报表的信息
with oPrvToolsBar
if wexist(Preview_name)
.isInited = .T.
.rptName = gcRptName
.rptTitle = gcRptName
.pageno = 0
else
.msg.rpt_info.caption = NoRpt_loc
endif
endwith
retu .f.
else
*-- 报表文件名的扩展名以 FRX 为准
if at(".",cReportName) = 0
cReportName = cReportName + ".frx"
endif
if !file("&cReportName")
*-- 如果传递来的报表文件不存在,那么应该终止,并提示文件不存在
messagebox(noRptFile_loc,16,error_loc)
retu .f.
endif
endif
*-- 判断是否当前有数据打开
* 对于报表来讲需要当前有数据表被打开,否则也会自动弹出打开数据对话框
* 所以,如果当前没有数据表打开,或打开的表的记录数为0时,应该终止。
if type("cDataSource") = "C"
if used("&cDataSource")
sele "&cDataSource"
endif
endif
if !used() or recc()=0
if messagebox(noData_loc,1+48+256,error_loc) = 2
retu .f.
endif
endif
*-- 得到正确的报表文件名和报表标题
oPrvToolsBar.rptName = cReportName
oPrvToolsBar.rptTitle = cTitleName
*-- 定义预览窗口
* 这个窗口相当于一个容器,用来容纳报表预览窗口,预览窗口的特征可以从这个窗口来继承
DEFINE WINDOW WinRptPre ;
FROM 0,0 TO SROWS()-10,SCOLS()-10 ;
system FLOAT CLOSE noGROW noMINIMIZE ZOOM MDI;
TITLE Preview_name +": "+cTitleName
set message to MsgInfo_loc + 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
*-- 不管是否已经存在原有报表,首先释放原有的报表预览的窗口
* 如果该窗口不存在的话,则不做任何动作
rele window Preview_name
*!* oprvtoolsbar.chktimer.enabled=.t.
*!* oprvtoolsbar.isinited=.t.
*-- 显示预览报表在刚才定义的窗口范围内,并不等待,继续执行,
* 如没有nowait参数,报表象一个模式窗口会停留不前,
* 那么接下去的程序运行会因为没有该报表的存在而产生错误
* 所以在这里这个NOWAIT很有必要,不可去掉!!!
REPORT FORM &cReportName PREVIEW WINDOW WinRptPre NOWAIT
*-- 将系统打印预览工具条移到屏幕右下角,并释放她
if wexist(PreviewToolsbarName)
move window PreviewToolsbarName to 100,100
release window PreviewToolsbarName
endif
*-- 将报表预览窗口最大化
*!* zoom window Preview_name max
*-- 初始化工具条完成
* 并标记工具条上的一个是否已初始属性为真.
oPrvToolsBar.isInited = .T.
oPrvToolsBar.msg.rpt_info.Forecolor=rgb(0,0,255)
retu
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -