作者:張洪舉 (
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元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
