作者:张洪举 (
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的新增功能。
日期: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。