|
VFP 愛用者社區 本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.
|
上一篇主題 :: 下一篇主題 |
發表人 |
內容 |
Ruey
註冊時間: 2003-03-12 文章: 1698 來自: tunglo
第 1 樓
|
發表於: 星期一 九月 01, 2003 6:17 pm 文章主題: 表單生成器精靈的改進(轉貼) |
|
|
來源:狐皮超市
對Visual FoxPro表單生成器嚮導的改進
作為一種視覺化的面向物件的編程語言,Visual FoxPro提供了很多非常好的生成器嚮導,如表單嚮導、查詢嚮導、視圖嚮導,甚至還有製作安裝盤的嚮導。使用這些嚮導,編程人員可以不用書寫任何一句程式而製作出非常漂亮的、功能強大的程式介面、報表、安裝盤等最終成品。使用Visual FoxPro 5.0提供的應用程式嚮導,你甚至可以直接製作出一個完整的 Windows 95中的應用程式。在眾多的生成器嚮導中,表單嚮導可能是最常用的嚮導之一,但是在使用中筆者發現表單嚮導也並非盡善盡美。以下是筆者使用中發現的兩個問題及筆者的改進方法,有興趣的讀者不妨一試。
為方便演示,需先建立兩個表:DEPT和EMP,表結構如下:
DEPT表:
欄位名 欄位類型 欄位長度 標題 索引
DEPTNO Char 6 單位編號 主索引
DNAME Char 20 單位名稱
LOA Char 20 單位位址
EMP 表:
欄位名 欄位類型 欄位長度 標題 索引
DEPTNO Char 6 單位編號
EMPNO Char 20 職員編號 主索引
ENAME Char 8 職員姓名
DEPT表為父表,EMP表為子表,兩表之間通過DEPTNO欄位相關聯。
表單嚮導分為‘表單嚮導’和‘一對多表單嚮導’,前者用於為單個表建立資料操作的表單,後者用於為兩個相關表建立資料操作的表單,在表單的表格中顯示子表的欄位。首先談談‘表單嚮導’,‘表單嚮導’可以創建一個顯示表中欄位並帶有十個按鈕的資料操作表單。在此表單中,Visual FoxPro 提供了一個很有用的按鈕:‘查詢’按鈕,按下‘查詢’按鈕後可在‘查詢’視窗中選擇表中不同的欄位輸入條件進行查詢。進入‘查詢’視窗就可發現‘表單嚮導’的一處明顯的‘缺陷’:欄位列表框中直接顯示的是表中的欄位名,即DEPTNO、DNAME等,用欄位名面向普通操作人員顯然是不合適的。筆者對‘表單嚮導’進行剖析,發現可通過修改‘表單嚮導生成器’調用的可視類庫WizStyle.VCX中的‘SerchClass’類對其進行改進。WizStyle.VCX可在Visual FoxPro系統目錄下的WizStyle目錄中找到。選擇‘檔’功能表中的‘打開’,打開WizStyle.VCX,在‘類名’框中雙擊‘SerchClass’即可對‘SerchClase’類進行修改。雙擊Form進入過程編寫視窗,在‘物件’下拉清單中選擇cboFields1,‘過程’下拉清單中選擇‘Init’。改進時用到Visual FoxPro 提供的一個函數DBGETPROP(),此函數用於從資料庫的表中根據欄位名提取相應字段落資訊,當然這些資訊中也包括‘欄位標題’(Caption)資訊,利用此資訊即可對‘表單嚮導’的查詢視窗中的列表框進行漢化處理。處理方法如下:
將‘cboFields1’的‘Init’過程改為如下的程式:
代碼: | LOCAL i
PUBLIC aWizFList
DIMENSION aWizFList[1]
=AFIELDS(aWizFList)
FOR m.i = FCOUNT() TO 1 STEP -1
IF INLIST(aWizFList[m.i,2],"G","M","U") =ADEL(aWizFList,m.i)
DIMENSION aWizFList[MAX(1,ALEN(aWizFList,1)-1),11]
ENDIF
ENDFOR
OldPath = SET('FullPath')
Set FullPath Off
For m.i = 1 To MAX(1,ALEN(aWizFList,1)-1) + 1
If NOT EMPTY(DBGETPROP(STRTRAN(SUBST(DBF(),3),".DBF")+ ;
'.'+aWizFList(m.i,1), 'Field', 'Caption'))
aWizFList(m.i,1)=DBGETPROP(STRTRAN(SUBST(DBF(),3),;
".DBF")+'.'+aWizFList(m.i,1), 'Field', 'Caption')
EndIf
EndFor
Set FullPath &OldPath
THIS.RowSourceType = 5
THIS.RowSource = "aWizFlist"
THIS.VALUE = THIS.LIST[1] |
保存後再運行已生成好的資料操作表單,會發現‘查詢’視窗的條件選擇框中的條件已變成相應欄位的標題,介面友好性自然大增。
再來談談‘一對多表單嚮導’,筆者認為,微軟公司提供此嚮導或許是為了建立一個主/從(Master/Detail)表單(父表中記錄改變時,子表表格中顯示與父表相關聯的子表中值),但卻又未能達到主/從表單的效果(子表表格中值始終不發生變化),故而此嚮導似乎沒有什麼意義。筆者對此生成器進行分析,發現無法對其進行改進,筆者在此只能提供一種生成主/從表單的快捷方式。還是以DEPT和EMP表為例,DEPT為父表,EMP為子表,當DEPT中記錄改變時,EMP的表格中顯示相應單位的人員資訊。首先,用‘表單嚮導’生成DEPT表的操作表單,存儲後對其進行修改。進入表單修改介面,選擇表單控制中的‘列表框’在FORM上拉出一個方框,建立一個列表框(LIST1)用於顯示子表中記錄,設置LIST1的ColumnCount屬性為3列,CloumnWidth為(100,150,150),RowSource屬性為 EMP_A,RowType為2-別名。雙擊FORM表單,建立FORM的Activate過程為:
代碼: | Select * From EMP Into Cursor EMP_A Where ALLTRIM(EMP.DEPTNO) == ALLTRIM(ThisForm.Deptno1.Value)
ThisForm.List1.ReQuery |
雙擊文本框DNAME1,建立DNAME1的Refresh過程,過程內容同上。運行此表單可見到當父表中記錄改變時,LIST1中列出子表中相應記錄,這在編制應用程式時顯然是非常常用的方法。
以上的方法均適用於Visual FoxPro 3.0和Visual FoxPro 5.0。 _________________ #############################
快樂媽咪系列幸福宅配,喝十全雞湯~原來幸福那麼簡單!!
學會VFP使用者社區的搜尋,Code才會更有趣~
############################# |
|
回頂端 |
|
|
|
|
您 無法 在這個版面發表文章 您 無法 在這個版面回覆文章 您 無法 在這個版面編輯文章 您 無法 在這個版面刪除文章 您 無法 在這個版面進行投票 您 無法 在這個版面附加檔案 您 無法 在這個版面下載檔案
|
|