摘要:Visual FoxPro是一個功能強大的數據庫管理系統,它以其獨到的特點和優勢贏得了開發者的青睞。本文指出了Visual FoxPro程序設計中應避免的幾個問題,并對此給出了具體的處理方法。
關鍵詞:數據;控件;事件;程序
中圖分類號:TP311文獻標識碼:A文章編號:1009-3044(2008)05-10ppp-0c
1 引言
Visual FoxPro中文版是為數據庫管理和應用程序開發而設計的功能強大的面向對象的環境。對于組織信息、查詢、創建集成的關系型數據庫系統與為最終用戶編寫功能全面的數據管理應用程序,Visual FoxPro可以提供管理數據需要的所有工具,它不僅支持客戶/服務模式,而且具有與其他軟件共享和交換數據的能力,提供了新的對象和事件處理模式,利用面向對象編程(OOP)的功能使用戶能夠方便、快捷地建立和修改應用程序,并與其他的數據庫管理系統具有更快速、更有效、更靈活的特點。因此,利用Visual FoxPro中文版數據庫管理系統(DBMS)來開發數據庫系統軟件,受到廣大軟件研制人員的青睞。但是,Visual FoxPro 不是一個十全十美的數據庫開發平臺,也有美中不足之處。特別是內容極其復雜,技術難點多,軟件設計人員要熟練而合理地運用這一新的可視化開發工具,并不是一件容易的事情,往往在軟件設計中要走不少彎路,對一些重要內容與技術要通過較多的軟件研制實踐才能培養起較強的實際應用能力,在實踐中積累經驗,常常會遇到程序代碼正確、測試通過,但沒有達到系統運行要求的模塊。實質上Visual FoxPro程序設計中應該避免出現這些問題。下面提出幾個在教學實踐中積累起來的Visual FoxPro 程序設計中應避免的問題及其處理方法,供大家借鑒。
1 表單中控件制作次序不當,造成鼠標點擊失效的問題

圖1
Visual FoxPro中的控件對象是用戶和程序交互的主要工具。通過在Visual FoxPro表單上移動、拖放和單擊適當的控件,用戶可以操作數據,并執行封裝在控件對象中的方法代碼程序。但是,在表單創建中,添加了合適的控件,在各自的控件中所選取的事件與其代碼編寫都正確,只是控件制作次序不同,在表單運行后會出現兩種不同的現象:一種是達到了預期的教果,可在表單上移動、拖放和單擊適當的控件,響應相應事件的代碼,完成表單設計的任務;另一種出現鼠標移動、拖放和單擊適當的控件后,沒有任何反應,不執行封裝在控件對象中的程序代碼,只能通過Tab鍵或光標移動鍵來定位,進行用戶數據操作,按回車鍵來完成“下一個”和“返回”控件操作。如圖1所示的修改錄入人員庫中錄入人員姓名表單,如果在創建如圖1的表單時,先制作標簽、文本框、命令按鈕,再進行表單控件屬性設置,編寫過程代碼,運行表單后,對表單上的控件操作運行正常,也就是可以用鼠標單擊定位到控件Text3,進行錄入人員姓名修改,單擊“下一個”或“返回”按鈕,來執行各自控件的相應事件的代碼程序。在這一前提下,返回到表單編輯界面,給“錄入人員姓名:”這一標簽控件與Text3文本框添加一個形狀控件組成一組,將其BackStyle屬性設置為“0-透明”,SpecialEffect屬性設置為“0-3維”。同樣,給“下一個”與“返回”控件,添加一個形狀控件組成一組,也將其BackStyle屬性設置為“0-透明”,SpecialEffect屬性設置為“0-3維”.這樣,再運行表單后,“錄入人員姓名:”右側的文本框、“下一個”與“返回”命令按鈕就不能用鼠標定位和單擊來執行相應事件的代碼程序,也即不能完成相應的操作,不能完成表單設計的任務。產生這種現象的原因在于控件制作次序不當。只要在創建表單時,將前面所述的兩個形狀控件先添加,并設置好屬性,再在各自的形狀框中制作好文本框與命令按鈕,其余的屬性設置、事件的代碼程序與前述正常執行表單操作時一樣。另外,有一點值得提醒的是添加好形狀控件后,不能簡單地將表單上已有的控件拖入形狀框內,不然,運行表單后鼠標還是定位不到或不能操作這一控件。當然,有些控件不需要鼠標定位或對其進行操作,只是起到說明或顯示數據的作用,可以添加相應控件,設置屬性,編寫程序代碼,再來修飾表單界面,使得表單運行后操作達到理想的效果。例如圖1表單中,可先添加標簽“共有錄入人員”和“當前是第”,文本框Textl和Text2,設置它們的屬性,再添加形狀框,并相應屬性設置為“0-透明”與“0-3維”,運行表單后,不需要也不能用鼠標單擊定位到文本框Text1和Text2,這也是表單設計中的一個應用技術。
2 事件選擇不當,導致操作達不到預定目的的問題

圖2
事件是某個特定時刻所發生的事情,它是引起對象從一種狀態轉換到另一種狀態的現實世界中的事件的抽象。事件是瞬間完成的,設有特定時間,是引起對象狀態轉換的控制信息。在Visual FoxPro中,可以編寫相應的代碼對此事件進行響應。在多數情況下,事件是通過用戶的交互操作產生的。如果在程序設計中,事件選擇不當,會使程序運行達不到預定的目的。如圖2,Text5的值來自Text1-Text4數值的運算,Text4數值的運算,Text5項為連動數據項,即在程序運行時Text1-Text4項中某一項值改變了,Text5項中顯示值根據計算也立即發生相應的變化。Text1~Text4項中數據寬度根據實際情況進行了限制,如Text1項可輸入數值最大為9999,為了程序運行時實現連動數據項數據實時顯示,在Text1~Text4的文本框中失去焦點時執行過程代碼,來得到Text5項的數值。如果把程序代碼
V1=val(thisform.text1.value)*val(thisform.text2.value )
V1=v1+val(thisform.text3.value)*val(thisform.text4.value)
Thisform.text5.value=str(v1)
Thisform.refresh
放入Text1~Text4各自的InterActiveChange事件,結果出現這些文本框中輸入數值只能輸入一位數值,如Text1輸入欄不能輸入兩位到四位的數值。而Text1文本框的InputMask屬性值確實已設置為9999,產生這一現象的原因就是控件的事件選擇有問題。如果將上述過程代碼放入Text1~Text4各自的Valid事件,問題就不復存在。事實上,Valid事件在控件失去焦點發生,InteractiveChange事件在使用鍵盤或鼠標更改控件的值時發生,并且在每次交互地更改文本框中的值時,都要發生事件,即當用戶在文本框中輸入數字時,每單擊一次都會引發Interactive Change事件。因此,在處理實際問題時,要根據具體情況,選取適當的事件時機,編寫完成特定功能的程序代碼。
3 隱含的數據不具備完整性問題
數據是計算機管理和操作的對象,設計程序就是用一系列指令存儲數據并操作數據。Visual FoxPro使用戶能夠方便使用和管理數據,Visual FoxPro中的數據都有一定的數據類型,每一種數據類型決定了這一類型數據的取值方式和運算方式。數據的完整性是指數據的有效性、一致性和兼容性,用Visual FoxPro開發的程序必須保證管理和操作的數據具備完整性,程序設計人員需編寫相應的代碼或利用系統提供的功能實現數據的完整性約束條件及完整性檢驗。程序設計人員如果沒有周全考慮到這一問題,盡管有些數據的處理在程序運行中沒有表現出明顯的錯誤,但由于存在著隱含的數據不具備完整性問題,影響了程序的嚴密性和軟件的整體質量。如圖3所示。

圖3
程序要求輸入起止日期,設計時就要考慮起止日期輸入欄中輸入的數據具備完整性,輸入的數據不符合實際的,要求或允許用戶重新輸入。處理方法:
(1)要求Textl文本框輸入欄輸入的起始年份不小于2004,在Text2的GotFocus事件中編寫過程代碼為:
if val(thisform.text1.value)<2004
messagebox(“請重新輸入,年份必須不小于2004”,1+48+256,“出錯信息”)
thisform.text1.value=“ ”
thisform.text1.setfocus
thisform.refresh
endif
(2)由于月份介于1-12,這樣在Text3的GotFocus事件的過程代碼為:
if val(thisform.text2.value)>12 or val(thisform.text2.value)<1
messagebox(“請重新輸入月份1-12”,1+48+256,“出錯信息”)
thisform.text2.value=“ ”
thisform.text2.setfocus
endif
對于text5的要求一樣,只要在Text6的GotFocus事件編寫相似的過程代碼。
(3)對于Text3文本框輸入欄輸入的某一日,必須考慮到兩點,一是介于1-31,二是某年某月是否有這一日,這一要求可在Text4的GotFocus事件的過程代碼中編寫為:
if val(thisform.text5.value)>31 or val(thisform.text5.value)<1
messagebox(“請重新輸入日期”,1+48+256,“出錯信息”)
thisform.text5.value=“ ”
thisform.text5.setfocus
endif
thisform.refresh
Text6的要求與Text3一樣,可在“確定”按鈕的GotFocus事件中編寫相應的過程代碼。另外,在這過程代碼中考慮到起始日期要比終止日期早。否則有提示信息。要求用戶重輸入起止日期。
3.4 圖3中文本框的初始值以字符型放在表單的Init事件中,Text1與Text4的InputMask屬性設置為9999,其余文本框的InputMask屬性設為99,所有文本框的Format屬性設為x,按起始日期、終止日期輸入的年、月、日、“確定”與“取消”命令按鈕的順序設置好Tab鍵次序。
4 結束語
Visual FoxPro程序設計中應避免的問題不僅僅只涉及到這些,處理方法也不唯一。本文的目的是Visual FoxPro程序設計人員在程序設計中積累經驗,少走彎路,使程序運行正常。管理和操作的數據具有完整性。Visual FoxPro以及應用程序能發揮最佳性能.
參考文獻:
[1]李雁翎.Visual Foxpm應用基礎與面向對象程序設計教程[M].北京:高等教育出版社,2002.
[2]任明漢.編程中值得注意的幾個問題[N].電腦報,2001.2:2-3.
[3]史濟民,湯觀全.Visual Foxpro及其應用系統開發[M].北京: 清華大學出版社,2002.
收稿日期:2007-12-27