VFP 愛用者社區 首頁 VFP 愛用者社區
本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.
 
 常見問題常見問題   搜尋搜尋   會員列表會員列表   會員群組會員群組   會員註冊會員註冊 
 個人資料個人資料   登入檢查您的私人訊息登入檢查您的私人訊息   登入登入

表單生成器精靈的改進(轉貼)

 
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區
上一篇主題 :: 下一篇主題  
發表人 內容
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才會更有趣~
#############################
回頂端
檢視會員個人資料 發送私人訊息
從之前的文章開始顯示:   
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區 所有的時間均為 台北時間 (GMT + 8 小時)
1頁(共1頁)

 
前往:  
無法 在這個版面發表文章
無法 在這個版面回覆文章
無法 在這個版面編輯文章
無法 在這個版面刪除文章
無法 在這個版面進行投票
無法 在這個版面附加檔案
無法 在這個版面下載檔案


Powered by phpBB © 2001, 2005 phpBB Group
正體中文語系由 phpbb-tw 維護製作