⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rptpreview.bak

📁 不错的用电管理系统,用VFP6.0做的.大家可以下来看看哦
💻 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 + -