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

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

圖2
事件是某個(gè)特定時(shí)刻所發(fā)生的事情,它是引起對(duì)象從一種狀態(tài)轉(zhuǎn)換到另一種狀態(tài)的現(xiàn)實(shí)世界中的事件的抽象。事件是瞬間完成的,設(shè)有特定時(shí)間,是引起對(duì)象狀態(tài)轉(zhuǎn)換的控制信息。在Visual FoxPro中,可以編寫(xiě)相應(yīng)的代碼對(duì)此事件進(jìn)行響應(yīng)。在多數(shù)情況下,事件是通過(guò)用戶(hù)的交互操作產(chǎn)生的。如果在程序設(shè)計(jì)中,事件選擇不當(dāng),會(huì)使程序運(yùn)行達(dá)不到預(yù)定的目的。如圖2,Text5的值來(lái)自Text1-Text4數(shù)值的運(yùn)算,Text4數(shù)值的運(yùn)算,Text5項(xiàng)為連動(dòng)數(shù)據(jù)項(xiàng),即在程序運(yùn)行時(shí)Text1-Text4項(xiàng)中某一項(xiàng)值改變了,Text5項(xiàng)中顯示值根據(jù)計(jì)算也立即發(fā)生相應(yīng)的變化。Text1~Text4項(xiàng)中數(shù)據(jù)寬度根據(jù)實(shí)際情況進(jìn)行了限制,如Text1項(xiàng)可輸入數(shù)值最大為9999,為了程序運(yùn)行時(shí)實(shí)現(xiàn)連動(dòng)數(shù)據(jù)項(xiàng)數(shù)據(jù)實(shí)時(shí)顯示,在Text1~Text4的文本框中失去焦點(diǎn)時(shí)執(zhí)行過(guò)程代碼,來(lái)得到Text5項(xiàng)的數(shù)值。如果把程序代碼
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事件,結(jié)果出現(xiàn)這些文本框中輸入數(shù)值只能輸入一位數(shù)值,如Text1輸入欄不能輸入兩位到四位的數(shù)值。而Text1文本框的InputMask屬性值確實(shí)已設(shè)置為9999,產(chǎn)生這一現(xiàn)象的原因就是控件的事件選擇有問(wèn)題。如果將上述過(guò)程代碼放入Text1~Text4各自的Valid事件,問(wèn)題就不復(fù)存在。事實(shí)上,Valid事件在控件失去焦點(diǎn)發(fā)生,InteractiveChange事件在使用鍵盤(pán)或鼠標(biāo)更改控件的值時(shí)發(fā)生,并且在每次交互地更改文本框中的值時(shí),都要發(fā)生事件,即當(dāng)用戶(hù)在文本框中輸入數(shù)字時(shí),每單擊一次都會(huì)引發(fā)Interactive Change事件。因此,在處理實(shí)際問(wèn)題時(shí),要根據(jù)具體情況,選取適當(dāng)?shù)氖录r(shí)機(jī),編寫(xiě)完成特定功能的程序代碼。
3 隱含的數(shù)據(jù)不具備完整性問(wèn)題
數(shù)據(jù)是計(jì)算機(jī)管理和操作的對(duì)象,設(shè)計(jì)程序就是用一系列指令存儲(chǔ)數(shù)據(jù)并操作數(shù)據(jù)。Visual FoxPro使用戶(hù)能夠方便使用和管理數(shù)據(jù),Visual FoxPro中的數(shù)據(jù)都有一定的數(shù)據(jù)類(lèi)型,每一種數(shù)據(jù)類(lèi)型決定了這一類(lèi)型數(shù)據(jù)的取值方式和運(yùn)算方式。數(shù)據(jù)的完整性是指數(shù)據(jù)的有效性、一致性和兼容性,用Visual FoxPro開(kāi)發(fā)的程序必須保證管理和操作的數(shù)據(jù)具備完整性,程序設(shè)計(jì)人員需編寫(xiě)相應(yīng)的代碼或利用系統(tǒng)提供的功能實(shí)現(xiàn)數(shù)據(jù)的完整性約束條件及完整性檢驗(yàn)。程序設(shè)計(jì)人員如果沒(méi)有周全考慮到這一問(wèn)題,盡管有些數(shù)據(jù)的處理在程序運(yùn)行中沒(méi)有表現(xiàn)出明顯的錯(cuò)誤,但由于存在著隱含的數(shù)據(jù)不具備完整性問(wèn)題,影響了程序的嚴(yán)密性和軟件的整體質(zhì)量。如圖3所示。

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