作者:張洪舉 (
http://www.vfptop.com
)
日期:2003年12月
應(yīng)用于:
Microsoft? Visual FoxPro? 8.0
摘要:使用Visual FoxPro 8.0的新增Header類來(lái)選擇表格列,實(shí)現(xiàn)自定義字段打印。
概述
許多Visual FoxPro程序員希望將顯示在表格控件中的數(shù)據(jù)能夠直接輸出到打印機(jī)上,并且也希望能夠自定義輸出列來(lái)選擇要打印的字段,這在Visual FoxPro 8.0以前還是比較煩瑣的事情。從Visual FoxPro 8.0開(kāi)始,你可以為成員類定義和建立子類,使對(duì)于各種控件的控制更加靈活方便。Visual FoxPro沒(méi)有提供可編程的報(bào)表工具,但是程序化輸出報(bào)表是所有程序員都?jí)裘乱郧蟮氖虑椋捎赩isual FoxPro支持OLE操作,因此,如果你的計(jì)算機(jī)中安裝了Excel,你完全可以將Visual FoxPro數(shù)據(jù)輸出到一個(gè)電子表格中,并立即執(zhí)行打印。
Visual FoxPro的成員類
現(xiàn)在可以為以下的幾個(gè)成員類定義和建立子類:
?Page和PageFrame
?CommandButton和CommandGroup
?OptionButton和OptionGroup
?Column和Grid
?Header和Column
使用成員類可以為一個(gè)指定類的所有成員定義一致的行為,例如,可以在一個(gè)Page類的Activate事件中定義一個(gè)特定行為,用于特定的PageFrame類或?qū)ο螅瑒t所有該頁(yè)框的成員頁(yè)繼承相同的代碼和行為。
PageFrame、CommandGroup、OptionGroup和Grid類有兩個(gè)新增屬性: MemberClassLibrary和MemberClass,用于為成員對(duì)象設(shè)置缺省的自定義類。當(dāng)設(shè)置這兩個(gè)屬性后,新增成員對(duì)象將從指定的成員類進(jìn)行繼承。Column對(duì)象有兩個(gè)新增屬性:HeaderClassLibrary和HeaderClass,用于設(shè)置指定一個(gè)自定義Header類。但是,你不能在類設(shè)計(jì)器中設(shè)計(jì)Column和Header類,這兩個(gè)類只能使用代碼建立。
例如,下面使用代碼建立的NewHeader類保存在一個(gè)名為MyHeader.prg的程序文件中,NewHeader類的基類為Header類,該類用于當(dāng)用戶單擊表格的Header時(shí)切換控件的顯示圖片。能夠?yàn)镠eader指定Picture屬性也是Visual FoxPro 8.0的新增功能。
日期:2003年12月
應(yīng)用于:
Microsoft? Visual FoxPro? 8.0
摘要:使用Visual FoxPro 8.0的新增Header類來(lái)選擇表格列,實(shí)現(xiàn)自定義字段打印。
概述
許多Visual FoxPro程序員希望將顯示在表格控件中的數(shù)據(jù)能夠直接輸出到打印機(jī)上,并且也希望能夠自定義輸出列來(lái)選擇要打印的字段,這在Visual FoxPro 8.0以前還是比較煩瑣的事情。從Visual FoxPro 8.0開(kāi)始,你可以為成員類定義和建立子類,使對(duì)于各種控件的控制更加靈活方便。Visual FoxPro沒(méi)有提供可編程的報(bào)表工具,但是程序化輸出報(bào)表是所有程序員都?jí)裘乱郧蟮氖虑椋捎赩isual FoxPro支持OLE操作,因此,如果你的計(jì)算機(jī)中安裝了Excel,你完全可以將Visual FoxPro數(shù)據(jù)輸出到一個(gè)電子表格中,并立即執(zhí)行打印。
Visual FoxPro的成員類
現(xiàn)在可以為以下的幾個(gè)成員類定義和建立子類:
?Page和PageFrame
?CommandButton和CommandGroup
?OptionButton和OptionGroup
?Column和Grid
?Header和Column
使用成員類可以為一個(gè)指定類的所有成員定義一致的行為,例如,可以在一個(gè)Page類的Activate事件中定義一個(gè)特定行為,用于特定的PageFrame類或?qū)ο螅瑒t所有該頁(yè)框的成員頁(yè)繼承相同的代碼和行為。
PageFrame、CommandGroup、OptionGroup和Grid類有兩個(gè)新增屬性: MemberClassLibrary和MemberClass,用于為成員對(duì)象設(shè)置缺省的自定義類。當(dāng)設(shè)置這兩個(gè)屬性后,新增成員對(duì)象將從指定的成員類進(jìn)行繼承。Column對(duì)象有兩個(gè)新增屬性:HeaderClassLibrary和HeaderClass,用于設(shè)置指定一個(gè)自定義Header類。但是,你不能在類設(shè)計(jì)器中設(shè)計(jì)Column和Header類,這兩個(gè)類只能使用代碼建立。
例如,下面使用代碼建立的NewHeader類保存在一個(gè)名為MyHeader.prg的程序文件中,NewHeader類的基類為Header類,該類用于當(dāng)用戶單擊表格的Header時(shí)切換控件的顯示圖片。能夠?yàn)镠eader指定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
該類能夠?qū)崿F(xiàn)的效果,如圖1所示。
圖1 selected.bmp和unselected.bmp圖片的顯示效果
將建立的Header成員類添加到表格中
在運(yùn)行時(shí)修改Column的HeaderClassLibrary和HeaderClass屬性不會(huì)影響Header,所以只能使用Column的NewObject方法來(lái)根據(jù)在MyHeader.prg中建立的NewHeader類來(lái)添加新對(duì)象,在添加之前應(yīng)當(dāng)將Column中默認(rèn)添加的Header1對(duì)象移除。圖1中“打開(kāi)表”按鈕用于打開(kāi)一個(gè)任意表,然后以表的字段名稱作為Header的標(biāo)題在表格中顯示,其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)
*!* 設(shè)置表格屬性
WITH Thisform.Grid1
.ColumnCount=nCount
.DeleteMark= .F.
.GridLineColor=RGB(192,192,192)
.HeaderHeight=25
.HighlightStyle= 2
.RecordSourceType=1
.RecordSource="cDemoAlias"
ENDWITH
*!* 設(shè)置表格各列屬性
FOR i=1 TO nCount
Thisform.Grid1.Columns(i).ControlSource=aArray(i,1)
Thisform.Grid1.Columns(i).RemoveObject("Header1") &&移除當(dāng)前默認(rèn)Header對(duì)象
Thisform.Grid1.Columns(i).NewObject("Header1","NewHeader","MyHeader.prg") &&添加自定義Header對(duì)象
Thisform.Grid1.Columns(i).Header1.Picture="selected.bmp"
Thisform.Grid1.Columns(i).Header1.Caption=aArray(i,1)
ENDFOR
Thisform.Grid1.AutoFit()
Thisform.Refresh
ENDIF
建立“頁(yè)面設(shè)置”表單
在Excel的頁(yè)面設(shè)置窗口中可以設(shè)置上邊距、下邊距、紙張方向和紙張類型等,為此,我們也相應(yīng)建立了一個(gè)簡(jiǎn)單的“頁(yè)面設(shè)置“表單,如圖2所示。
圖2 “頁(yè)面設(shè)置”表單
為保存頁(yè)面設(shè)置中的各項(xiàng)數(shù)據(jù),建立了一個(gè)tblPrtSet表,該表的結(jié)構(gòu)如表1所示。
表1 tblPrtSet表結(jié)構(gòu)
字段名稱說(shuō)明
TOPMARG上邊距
BOTTMARG下邊距
LEFTMARG左邊距
RIGHTMARG右邊距
PAPERSIZE紙張大小
ORIENTATE紙張方向
HEADERMARG頁(yè)眉
FOOTERMARG頁(yè)腳
ZOOM縮放比例
輸出選定列到Excel中
如果表格中列的Picture屬性為Selected.bmp(表示為選定狀態(tài)),則該列將輸出到打印機(jī)中,下面是“輸出到Excel”按紐的Click事件代碼。
*!* 生成臨時(shí)表
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) &&刪除尾部的逗號(hào)
cSQL="SELECT "+cTmp+" FROM "+cAlias+" INTO CURSOR curPrint" &&生成SQL語(yǔ)句
&cSQL
SELECT curPrint
nCount=AFIELDS(aPrtArray)
IF NOT USED("tblPrtSet")
USE tblPrtSet ALIAS tblPrtSet IN 0
ENDIF
GO TOP
**設(shè)置EXCEL表格頭
oExl=CREATEOBJECT("Excel.Application")
oExl.Workbooks.Add
oExl.Worksheets("sheet1").Activate
oExl.ActiveSheet.PageSetup.TopMargin=tblPrtSet.TopMarg/0.035 &&設(shè)置上邊距
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" &&設(shè)置頂端標(biāo)題行
oExl.ActiveSheet.PageSetup.PaperSize=tblPrtSet.PaperSize &&紙張大小
oExl.ActiveSheet.PageSetup.Orientation=tblPrtSet.Orientate &&紙張方向
oExl.ActiveSheet.PageSetup.RightHeader="第 & P頁(yè) 共&N頁(yè)"
oExl.ActiveSheet.PageSetup.HeaderMargin=tblPrtSet.HeaderMarg/0.035 &&頁(yè)眉
oExl.ActiveSheet.PageSetup.FooterMargin=tblPrtSet.FooterMarg/0.035 &&頁(yè)腳
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 &&合并列
*循環(huán)生成表格頭
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
*生成表內(nèi)容
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 &&細(xì)線
oExl.Range("a2:"+To26(nCount)+ALLTRIM(STR(nRow-1))).Borders.Weight=2 &&線粗細(xì)
*!* oExl.Visible=.T. &&顯示Excel
oExl.ActiveSheet.PrintOut &&直接打印輸出
結(jié)論
Visual FoxPro 8.0的許多新增功能為你快速開(kāi)發(fā)應(yīng)用程序提供了可能,Visual FoxPro的新增功能請(qǐng)見(jiàn)幫助中的What’s New in Visual FoxPro 8.0。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元

