作者:張洪舉 (
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。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

