自定义报表预览控制工具条

说明:原有的VFP的打印预览用多了感觉真的不是很方便,在某些特定的要求下,她就显得很笨拙,尤其那个打印工具条上的打印机按纽,一点就打印了,有时候我们需要在那个时候进行有选择性的打印而不是全盘的打出来,也不是很麻烦的还要再关闭打印预览返回去再提示性的打印,所以此次更新在原有的自定义报表预览窗口以及计算报表总页数的基础上,增加自定义的工具条,而使程序显得更个性化。
提示:因为该文处于文章排版的需要,所以采用了汉字双字节的空格,而这些空格在程序中执行会提示错误,所以请将以下代码选择复制后,请再处理去掉其中包含的双字节空格,可用一些文字处理软件将双字节空格“ ”全部替换为单字节空格!

*– 程序名称:RptPreview.prg
*– 程序功能:以自定义的窗口显示报表的同时,显示自定义的工具条控制报表的预览打印…
*– 使用方法:RptPreview ( [,cTitleName])
*    或者:do RptPreview with [, cTitleName ]
*– 程序说明:cReportName 为 报表文件名(无须带扩展名),如果省略的话,则可显示工具条
*       cTitlename 为 报表的标题(可省略,然后以报表文件名做标题)
*       报表的扩展名以 frx 为准
*– 原创作者:红虎
*– 联系方式:E-mail: hu_feng@163.net  
*       HomePage: http://www.honghoo.net
*       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,”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,”",”设置…”)
#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,”",”关闭”)
#define close_pic  iif(isPicBtn,”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
  
*– 判断是否正确传递报表标题参数
if type(”cTitleName”)#”C”
  *– 如果报表标题的数据类型不是字符型的,那么将报表标题用报表的名称来代替
  cTitleName  = cReportName
endif
*– 判断是否正确传递报表文件名参数
if type(”cReportName”)#”C” or isNull(cReportName)
  *– 如果传递来的报表的名称不是字符型或是空的,那么应该终止,并提示没有报表可显示
  *– 此时如果存在报表预览窗口,那么要重新来获取该报表的信息
  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
  
*– 报表文件名的扩展名以 FRX 为准
  if !file(”&cReportName..frx”)  
    
*– 如果传递来的报表文件不存在,那么应该终止,并提示文件不存在
    messagebox(noRptFile_loc,16,error_loc)
    retu .f.
  endif
endif  
*– 判断是否当前有数据打开
*  对于报表来讲需要当前有数据表被打开,否则也会自动弹出打开数据对话框
*  所以,如果当前没有数据表打开,或打开的表的记录数为0时,应该终止。
if !used() or recc()=0
  if messagebox(noData_loc,1+48,error_loc) = 2
    retu .f.
  endif
endif  
*– 得到正确的报表文件名和报表标题
oPrvToolsBar.rptName = cReportName
oPrvToolsBar.rptTitle = cTitleName
*– 定义预览窗口
*  这个窗口相当于一个容器,用来容纳报表预览窗口,预览窗口的特征可以从这个窗口来继承
DEFINE WINDOW WinRptPre ;
  FROM 0,0 TO SROWS()-10,SCOLS()-10 ;
  FLOAT system CLOSE GROW ZOOM noMINIMIZE ;
  TITLE Preview_name +”: “+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
*– 不管是否已经存在原有报表,首先释放原有的报表预览的窗口
*  如果该窗口不存在的话,则不做任何动作
release window Preview_name
*– 显示预览报表在刚才定义的窗口范围内,并不等待,继续执行,
*  如没有nowait参数,报表象一个模式窗口会停留不前,
*  那么接下去的程序运行会因为没有该报表的存在而产生错误
*  所以在这里这个NOWAIT很有必要,不可去掉!!!
REPORT FORM &cReportName PREVIEW WINDOW WinRptPre NOWAIT
*– 将系统打印预览工具条移到屏幕右下角,并释放她
move window “打印预览” to 100,100
release window “打印预览”
*– 释放原有的用来放置预览窗口的”容器”窗口
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 = #0000ff
    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 cmdSetup AS commandbutton WITH ;
    Height = btn_height, ;
    Width = btn_width, ;
    Caption = setup_name, ;
    Name = “cmdSetup”, ;
    ToolTipText = “系统打印机设置”, ;
    Picture = setup_pic
  ADD OBJECT cmdprint AS commandbutton WITH ;
    Height = btn_height, ;
    Width = btn_width, ;
    Caption = print_name, ;
    Name = “cmdPrint”, ;
    ToolTipText = “进入报表打印设置”, ;
    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 = “显示报表文件的打印信息”, ;
    Picture = info_pic
    
  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.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 cmdSetup.Click
    sys(1037)
  ENDPROC
  
*– 打印选项
  PROCEDURE cmdprint.Click
    
*– 调用打印设置对话框,需要另一个程序的支持: RptPrint
    RptPrint (this.parent.RptName)
  ENDPROC
  
*– 获取报表信息
  PROCEDURE cmdInfo.Click
    
*– 显示报表文件的打印信息,需要另一个程序的支持: DspRptInfo
    DspRptInfo(this.parent.rptname)
  ENDPROC
  
*– 关闭报表预览及打印工具条
  PROCEDURE cmdclose.Click
    if messagebox(RptClose_loc,4+32,this.parent.rptTitle) = 6
      
*– 释放预览窗口
      release window Preview_name  
      
*– 释放打印控制工具条
      this.parent.release
    endif
  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 _pageno1 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”)
      
*– 保留打印设置和关闭按纽的可用
      .cmdSetup.enabled=.t.
      .cmdClose.enabled=.t.
      
*– 显示报表信息为没有报表
      .msg.rpt_info.caption = noRpt_loc
      .rptTitle  = noRpt_loc
      
*– 记录当前页数为0,以使下次判断时,当前页数和记录的页数始终不相等
      .pageno = 0
      
*– 关闭时钟的检查
      .ChkTimer.enabled = .F.  
    else
      
*– 打印和报表信息两个按纽的可用性受报表是否初始化影响
      .cmdPrint.enabled  = .isInited
      .cmdInfo. enabled  = .isInited
    endif
      .msg.rpt_info.ToolTipText = .msg.rpt_info.caption
    endwith
  ENDPROC
ENDDEFINE
*– 结束定义
**************************************************
>>>

请下载该示例 dbf2excel.zip 31.3K

点击下载此文件

[url=mailto:hu_feng@163.net?subject=About_dbf2excel]
如有问题,请来信
[/url]

注:该下载包中含有的文件有:
执行程序:dbf2excel_sample.prg
自由表表:sample_item.dbf
包含文件:vb_marco.h
报表预览:RptPreview.prg
报表打印:RptPrint.prg
报表信息:DspRptInfo.prg
报表预览工具条上的8个图片文件
报表文件,表单文件,项目文件各一个

转载于:https://www.cnblogs.com/hylan/archive/2008/10/03/1303449.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/268811.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Struts2结果跳转方式

1.转发 <!-- 转发 --> <action name"Demo1Action" class"cn.itheima.a_result.Demo1Action" method"execute" ><result name"success" type"dispatcher" >/hello.jsp</result> </action> 2.…

mysql gid_mysql主从复制5.6基于GID及多线程的复制笔记

mysql:数据库复制过滤#show grobal variables like binlog%;注意&#xff1a;不能在主服务器上做过滤&#xff0c;二进制不完整性&#xff1b;它将危害到其他的数据库&#xff1b;在从库过滤会占用过多的带宽,还会复制过多的跟数据库无关的内容主端:binlog-do-db:仅将指定数据库…

TreeMap是按照key的字典顺序来排序

一、TreeMap TreeMap 默认排序规则&#xff1a;按照key的字典顺序来排序&#xff08;升序&#xff09; 字典排序&#xff08;lexicographical order&#xff09;是一种对于随机变量形成序列的排序方法。即按照字母顺序&#xff0c;或者数字小大顺序&#xff0c;由小到大的形成…

Fireflow 终于发布啦!

Fireflow终于发布啦。虽然离工程应用还有一段距离&#xff0c;但是我还是想放出来让大家看看&#xff0c;听听大家的意见和建议。Fireflow的特点是模型和engine理论严密&#xff0c;因此可以在设计器中模拟流程的执行。另外Fireflow的系统设计也还可以的~_^文档还很欠缺&#x…

C语言攻略指南(五)数组篇

数组是指那些具有相同的数据类型的&#xff0c;数量有限的若干个变量通过有序的方法组织起来的一样种便于使用的形式。数组属于派生类型&#xff08;数组是建立在其他类型的基础上&#xff09;&#xff0c;数组中的变量被称为数组的元素。 一维数组 一维数组指的是只有一个下标…

java 虚类_java虚方法

java虚方法我们已经讨论了方法的重载&#xff0c;也就是子类能够重载父类的方法。以下是小编为大家搜索整理的java虚方法&#xff0c;欢迎大家阅读!更多精彩内容请及时关注我们应届毕业生考试网!当子类对象调用重载的方法时&#xff0c;调用的是子类的方法&#xff0c;而不是父…

windows下快速启动或关闭系统服务方法

在windows下有些后台服务会开机自动启动。 用命令行方式启动关闭应用服务 使用sc.exe命令功能列表 修改服务启动类型的命令行格式为&#xff08;特别注意start后面有一个空格&#xff09;    sc config 服务名称 start demand(设置服务为手动启动)     sc config 服务名…

我为什么fuck GFW同时FUCK 开心网

我很生气&#xff0c;后果很严重&#xff0c;你要问我为什么&#xff0c;那是因为GFW 屏蔽了一个对我有用的站点[url]www.github.com[/url]&#xff0c; 什么玩意&#xff08;省略1亿遍fuck 他们的话&#xff09;。 开心网删除我的日记&#xff0c; 并没用通知过我&#xff0c…

java 变量存放在哪_Java全局变量存放在哪里?

我们说 常量,静态变量存放在方法区中,方法中的临时变量,存放到Java 虚拟栈中。有人问,那全局变量*(对象)存放在哪里. 其实全局变量 就是参考文章中所说的class的字段,就是指全局变量,它是存放在方法区中的。e)方法区 与堆一样,是被线程共享的区域。在方法区中,存储了每…

中国网瘾群落调查

到底有多少青少年患上网瘾&#xff1f;答案是惊人的400万。在此前举行的全国人大常委会的会议上&#xff0c;全国人大常委会副委员长、秘书长李建国称&#xff0c;目前我国约4000万未成年网民中“网瘾少年”占10%左右&#xff0c;主要原因是迷恋网络游戏。华中师范大学教授、著…

从头认识Spring-1.7 如何通过属性注入Bean?(1)-如何通过属性向对象注入值?...

这一章节我们来讨论一下如何通过属性注入Bean&#xff1f;这一章节分为两部分&#xff0c;第一部分我们通过属性向对象注入值&#xff0c;第二部分我们通过属性向对象注入还有一个对象的引用。1.如何通过属性向对象注入值&#xff1f;&#xff08;1&#xff09;domainpackage c…

chrome java虚拟机_JATT:谷歌的Java虚拟机自动调整工具

JATT是google的Java虚拟机自动调整工具&#xff0c;它是一个开源软件工具&#xff0c;用于优化Java虚拟机(JVM)。JATT是基于OpenTuner开发的&#xff0c;OpenTuner是另一个开源软件框架&#xff0c;用于构建域特定的自动微调器。 JATT专门用于调整HotSpot JVM&#xff0c;这是最…

初识北京

话说话说就来了北京&#xff0c;长期在南方生活惯了&#xff0c;来这里还真有点不习惯。。。 1.、北京不算整洁的城市&#xff0c;作为一个有历史的城市&#xff0c;电线乱牵&#xff0c;路面邋遢&#xff0c;当然&#xff0c;对于一贯低要求的中国人来说问题也不是很严重&…

jsb调用java_在JS代码中使用反射调用java代码注意事项(附webview使用方法)(转)...

本文是推荐使用过jsb.reflection的开发者进行阅读。关于jsb.reflection的说明请参照&#xff1a;我们在代码编写过程中&#xff0c;通常会需要在js脚本中调用到java代码或者Objective-C的代码。例如&#xff1a;接入sdk&#xff0c;显示webview&#xff0c;使用原生代码&#x…

Excel表格内容导出到页面

引入org.apache.poi.ss.usermodelpublic void addExcelBooks() throws Exception { HttpServletRequest request ServletActionContext.getRequest(); String filepath request.getParameter("filepath"); String fileType filepath.substring(filepath.lastIndex…

综述ASP.NET下的AJAX模式

本文内容: 一、导言 二、XMLHttpWebForm模式 三、XMLHttpHttpHandler模式 四、ASP.NET 2.0/3.5回调模式 五、AJAX框架模式 -------------------------------------------------------------------------------------------------- 一、导言 在这篇文章中&#xff0c;将介绍…