微软MVP 张洪举

非淡泊无以明志,非宁静无以致远。

张洪举ID:zhanghongju
73304次访问,排名1288好友0人,关注者1
zhanghongju的文章
原创 19 篇
翻译 2 篇
转载 2 篇
评论 72 篇
最近评论
dongxiaolin:巴西木,令箭,那个叫不上来。长势不错,绿油油的,每一片叶都那么好。闲暇时放松一下压力,继续加油。
yt045326:张老师你好:
最近我用vfp+sql server2000作了一个C/S系统。
请教怎样才能实现用sqlexec()函数向sql 传送图片和长度大于255的字符串?
急用,赐教为盼!
21cg21cg:张老大,能不能说说UNPIVOT.a.首先建立一个临时结果集的结构,该结构中包含MyPvt表中除IN (五月, 六月, 七月)之外的列,以及SubTotal FOR OrderMonth中指定的值列(SubTotal)和透视列(OrderMonth)。这个临时结果集的结构有什么用.
lyt319:
我买了一本<<Visual Foxpro 软件开发模式与应用案例>>但是光盘丢失了,可否提供下载? 下面是我关于本书的的些疑问,及在网上一些的提出的疑部.:
在第二章中.depin, depout 为什么不把每个记录都记入一个表中然后库存的数量由统计产生呢?而是每张单计算再输入.这样很难控制,也很容易出错.下面在网上就有一位网友提出了疑问.
jamton:请教张老师,reportlistener中文输出乱码的情况怎么解决?
文章分类
    收藏
      相册
      存档
      软件项目交易
      订阅我的博客
      XML聚合  FeedSky
      订阅到鲜果
      订阅到Google
      订阅到抓虾
      订阅到BlogLines
      订阅到Yahoo
      订阅到GouGou
      订阅到飞鸽
      订阅到Rojo
      订阅到newsgator
      订阅到netvibes

      原创 使用Visual FoxPro 8.0的成员类和Excel实现自定义报表输出收藏

      新一篇: [2006新书]Visual FoxPro 6.0~9.0解决方案与范例大全 | 旧一篇: 为Visual FoxPro开发者建立移动解决方案

      作者:张洪举  (http://www.vfptop.com
      日期:2003年12月
      应用于:
         Microsoft® Visual FoxPro® 8.0
      摘要:使用Visual FoxPro 8.0的新增Header类来选择表格列,实现自定义字段打印。
      概述
      许多Visual FoxPro程序员希望将显示在表格控件中的数据能够直接输出到打印机上,并且也希望能够自定义输出列来选择要打印的字段,这在Visual FoxPro 8.0以前还是比较烦琐的事情。从Visual FoxPro 8.0开始,你可以为成员类定义和建立子类,使对于各种控件的控制更加灵活方便。Visual FoxPro没有提供可编程的报表工具,但是程序化输出报表是所有程序员都梦寐以求的事情,由于Visual FoxPro支持OLE操作,因此,如果你的计算机中安装了Excel,你完全可以将Visual FoxPro数据输出到一个电子表格中,并立即执行打印。
      Visual FoxPro的成员类
      现在可以为以下的几个成员类定义和建立子类:
      • Page和PageFrame
      • CommandButton和CommandGroup
      • OptionButton和OptionGroup
      • Column和Grid
      • Header和Column
      使用成员类可以为一个指定类的所有成员定义一致的行为,例如,可以在一个Page类的Activate事件中定义一个特定行为,用于特定的PageFrame类或对象,则所有该页框的成员页继承相同的代码和行为。
      PageFrame、CommandGroup、OptionGroup和Grid类有两个新增属性: MemberClassLibrary和MemberClass,用于为成员对象设置缺省的自定义类。当设置这两个属性后,新增成员对象将从指定的成员类进行继承。Column对象有两个新增属性:HeaderClassLibrary和HeaderClass,用于设置指定一个自定义Header类。但是,你不能在类设计器中设计Column和Header类,这两个类只能使用代码建立。
      例如,下面使用代码建立的NewHeader类保存在一个名为MyHeader.prg的程序文件中,NewHeader类的基类为Header类,该类用于当用户单击表格的Header时切换控件的显示图片。能够为Header指定Picture属性也是Visual FoxPro 8.0的新增功能。
      DEFINE CLASS NewHeader AS Header
          Name="NewHeader"
          PROCEDURE Click
              cPictureName=JUSTSTEM(This.Picture)
              IF cPictureName="selected"  
                  This.Picture="unselected.bmp"
              ELSE 
                  This.Picture="selected.bmp"
              ENDIF 
          ENDPROC 
      ENDDEFINE
      该类能够实现的效果,如图1所示。
      图1  selected.bmp和unselected.bmp图片的显示效果
      将建立的Header成员类添加到表格中
      在运行时修改Column的HeaderClassLibrary和HeaderClass属性不会影响Header,所以只能使用Column的NewObject方法来根据在MyHeader.prg中建立的NewHeader类来添加新对象,在添加之前应当将Column中默认添加的Header1对象移除。图1中“打开表”按钮用于打开一个任意表,然后以表的字段名称作为Header的标题在表格中显示,其Click事件代码如下:
      cFile=GETFILE("dbf")
      cDemoAlias=JUSTSTEM(cFile)
      IF NOT EMPTY(cFile)
          Thisform.Text1.Value=cFile
          CLOSE TABLES ALL 
          USE (cFile) ALIAS cDemoAlias IN 0
          nCount=AFIELDS(aArray)
          *!* 设置表格属性
          WITH Thisform.Grid1
              .ColumnCount=nCount
              .DeleteMark= .F. 
              .GridLineColor=RGB(192,192,192)
              .HeaderHeight=25
              .HighlightStyle= 2 
              .RecordSourceType=1
              .RecordSource="cDemoAlias"
          ENDWITH 
          *!* 设置表格各列属性
          FOR i=1 TO nCount
              Thisform.Grid1.Columns(i).ControlSource=aArray(i,1)
              Thisform.Grid1.Columns(i).RemoveObject("Header1")      &&移除当前默认Header对象
              Thisform.Grid1.Columns(i).NewObject("Header1","NewHeader","MyHeader.prg")  &&添加自定义Header对象
              Thisform.Grid1.Columns(i).Header1.Picture="selected.bmp"
              Thisform.Grid1.Columns(i).Header1.Caption=aArray(i,1)
          ENDFOR  
          Thisform.Grid1.AutoFit()
          Thisform.Refresh 
      ENDIF
      建立“页面设置”表单
      在Excel的页面设置窗口中可以设置上边距、下边距、纸张方向和纸张类型等,为此,我们也相应建立了一个简单的“页面设置“表单,如图2所示。
      图2  “页面设置”表单
      为保存页面设置中的各项数据,建立了一个tblPrtSet表,该表的结构如表1所示。
      表1  tblPrtSet表结构
      字段名称 说明
      TOPMARG  上边距
      BOTTMARG 下边距
      LEFTMARG 左边距
      RIGHTMARG 右边距
      PAPERSIZE 纸张大小
      ORIENTATE 纸张方向
      HEADERMARG 页眉
      FOOTERMARG 页脚
      ZOOM  缩放比例
      输出选定列到Excel中
      如果表格中列的Picture属性为Selected.bmp(表示为选定状态),则该列将输出到打印机中,下面是“输出到Excel”按纽的Click事件代码。
      *!* 生成临时表
      cAlias=Thisform.Grid1.RecordSource
      SELECT (cAlias)
      cTmp=""
      FOR i=1 TO Thisform.Grid1.ColumnCount
          IF JUSTSTEM(Thisform.Grid1.Columns(i).Header1.Picture)="selected"
              cTmp=cTmp+Thisform.Grid1.Columns(i).ControlSource+","
          ENDIF 
      ENDFOR 
      cTmp=SUBSTR(cTmp,1,LEN(cTmp)-1)         &&删除尾部的逗号
      cSQL="SELECT "+cTmp+" FROM "+cAlias+" INTO CURSOR curPrint"  &&生成SQL语句
      &cSQL
      SELECT curPrint
      nCount=AFIELDS(aPrtArray)
      IF NOT USED("tblPrtSet")
          USE tblPrtSet ALIAS tblPrtSet IN 0
      ENDIF 
      GO TOP 
      **设置EXCEL表格头
      oExl=CREATEOBJECT("Excel.Application")
      oExl.Workbooks.Add
      oExl.Worksheets("sheet1").Activate
      oExl.ActiveSheet.PageSetup.TopMargin=tblPrtSet.TopMarg/0.035      &&设置上边距
      oExl.ActiveSheet.PageSetup.BottomMargin=tblPrtSet.BottMarg/0.035  &&下边距
      oExl.ActiveSheet.PageSetup.LeftMargin=tblPrtSet.LeftMarg/0.035    &&左边距
      oExl.ActiveSheet.PageSetup.RightMargin=tblPrtSet.RightMarg/0.035  &&右边距
      oExl.ActiveSheet.PageSetup.PrintTitleRows ="$1:$2"                &&设置顶端标题行
      oExl.ActiveSheet.PageSetup.PaperSize=tblPrtSet.PaperSize          &&纸张大小
      oExl.ActiveSheet.PageSetup.Orientation=tblPrtSet.Orientate        &&纸张方向
      oExl.ActiveSheet.PageSetup.RightHeader="第 & P页  共&N页"
      oExl.ActiveSheet.PageSetup.HeaderMargin=tblPrtSet.HeaderMarg/0.035  &&页眉
      oExl.ActiveSheet.PageSetup.FooterMargin=tblPrtSet.FooterMarg/0.035  &&页脚
      oExl.ActiveSheet.PageSetup.Zoom=tblPrtSet.Zoom                      &&缩放比例
      oExl.Cells(1,1).Value=Thisform.Text1.Value
      oExl.Cells(1,1).Font.Name="黑体"
      oExl.Cells(1,1).Font.Size=14
      oExl.Cells(1,1).HorizontalAlignment=3                               &&水平居中
      oExl.Range(To26(1)+"1:"+To26(nCount)+"1").Merge                     &&合并列
      
      *循环生成表格头
      FOR i=1 TO nCount
          oExl.ActiveSheet.Columns(i).Font.Size=9
          oExl.ActiveSheet.Columns(i).ColumnWidth=10
          oExl.Cells(2,i).Value=aPrtArray(i,1)
          oExl.Cells(2,i).HorizontalAlignment=3  &&水平居中
      ENDFOR 	
      
      *生成表内容
      SELECT curPrint
      nRow=3
      SCAN 
          FOR nColumn=1 TO nCount
          	cField=aPrtArray(nColumn,1)
         	    oExl.Cells(nRow,nColumn).Value=&cField
          ENDFOR 
          nRow=nRow+1
      ENDSCAN 
      oExl.Range("A2:"+To26(nCount)+ALLTRIM(STR(nRow-1))).Borders.LineStyle=1  &&细线
      oExl.Range("a2:"+To26(nCount)+ALLTRIM(STR(nRow-1))).Borders.Weight=2     &&线粗细
      *!* oExl.Visible=.T.       &&显示Excel
      oExl.ActiveSheet.PrintOut  &&直接打印输出
      结论
      Visual FoxPro 8.0的许多新增功能为你快速开发应用程序提供了可能,Visual FoxPro的新增功能请见帮助中的What’s New in Visual FoxPro 8.0。

      发表于 @ 2006年05月29日 22:14:00|评论(loading...)|编辑

      新一篇: [2006新书]Visual FoxPro 6.0~9.0解决方案与范例大全 | 旧一篇: 为Visual FoxPro开发者建立移动解决方案

      评论:没有评论。

      发表评论  


      当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
      Csdn Blog version 3.1a
      Copyright © 张洪举