说明:原有的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

自定义报表预览控制工具条相关推荐

  1. win10计算机窗口览,Win10窗口预览管理工具

    Win10窗口预览管理工具是一款专为win10用户打造的窗口预览功能管理软件,通过该工具可以一键开关Win10系统的任务栏窗口预览功能,操作简单,非常实用. Win10窗口预览管理工具是一款专为win ...

  2. js实现图片上传预览及进度条

    js实现图片上传预览及进度条 原文js实现图片上传预览及进度条 最近在做图片上传的时候,由于产品设计的比较fashion,上网找了比较久还没有现成的,因此自己做了一个,实现的功能如下: 1:去除浏览器 ...

  3. [html] 切页面时,每次都动手刷新看效果很麻烦,如果要让你写一个实时刷新预览的工具你该怎么写?

    [html] 切页面时,每次都动手刷新看效果很麻烦,如果要让你写一个实时刷新预览的工具你该怎么写? node包http, scoket.io建立服务静态页面增加webSocket,服务器推送后执行刷新 ...

  4. php 预览器,浏览器html代码快速预览小工具

    这次给大家带来浏览器html代码快速预览小工具,使用浏览器html代码快速预览小工具注意事项有哪些,下面就是实战案例,一起来看一下. 直接弹出预览:javascript:(function() { v ...

  5. 推荐几个手机网站在线预览测试工具

    随着移动互联网的爆发,移动端的布局成了大多数企业的刚需,而手机网站也慢慢成为一个营销企业的标配,包括百度.当当网在内的很多网站,移动端流量已经超过PC端流量,越来越的企业都在建立和完善自己的手机网站, ...

  6. 【Mac 教程系列第 3 篇】如何用 Mac 预览图工具修改图片的分辨率

    这是[Mac 教程系列第 3 篇],如果觉得有用的话,欢迎关注专栏. 修改图片分辨率,可能你首先想到的是 PS ,其实 Mac 自带的预览图工具就可以修改,下面简单说下修改过程. 第一步 双击打开要修 ...

  7. 如何在macOS中使用预览放大镜工具

    苹果公司的所有Mac电脑均随附预览功能,预览功能是macOS内置的功能强大的文件查看器.预览是默认的应用程序,每当您双击图像或PDF时,它就会打开,并具有多个注释工具供您在使用这些文件类型时使用. 最 ...

  8. Sketch设计稿预览快捷工具以及设置方法

    Sketch是一款轻量.易用的矢量设计工具,它为数字设计而生小巧但功能强大,并拥有优雅的界面. Sketch也是为图标设计和界面设计而生的,它轻量化简单易学,有经验的设计师花上几个小时便能将自己的设计 ...

  9. 网页嵌入pdf、在线预览pdf工具及插件(转)

    摘要:在web开发时我们有时会需要在线预览PDF内容,在线嵌入pdf文件: 问题1:如何网页中嵌入PDF: 在网页中: 常用的几种PDF预览代码片段如下: 代码片段1: 1 <object ty ...

最新文章

  1. 如何在一个表达式中合并两个字典?
  2. 大道至简——失败也是积累
  3. 计算机视觉开源库OpenCV之边缘检测cv2.canny()函数
  4. 关于matlab中pcolor显示图片时的shading设置问题
  5. 图像的泊松(Poisson)编辑、泊松融合完全详解
  6. 手机当电脑麦克风 linux,WO Mic让手机成为电脑的无线麦克风
  7. react-native 安装的时候遇到的问题
  8. 用java做登录界面_求用JAVA编写的登陆界面!
  9. 零基础、非计算机相关专业的如何转型程序员
  10. 如何下载sonar?
  11. oracle表空间加密
  12. 批处理学习(一)——MS-DOS命令
  13. 小样本算法库LibFewShot
  14. 程序员值得收藏的10大网站 | 推荐指数 | 满天星★★★★★
  15. cmd下如何运行.exe文件
  16. 全网最全iPhone NFC失灵解决思路
  17. easyui-filebox 限制上传格式
  18. axios拦截器使用
  19. html中好看的按钮,html 好看按钮
  20. 游图邦YOTUBANG的格局与文化

热门文章

  1. 在springBoot中配置web.xml中配置的servlet
  2. Drools 7.4.1.Final参考手册(六) 用户手册
  3. 获取进程CPU占用率
  4. hdu 2612 Find a way (广搜)
  5. iOS 支付宝SDK接入详解
  6. Java异常详解及如何处理
  7. 为静态博客生成器WDTP移植了一款美美哒主题
  8. 往文件中写数据--增量
  9. HttpClient v4.5 简单抓取主页数据
  10. 不是世界不好,而是你见得太少