明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

Visual FoxPro3.0經(jīng)驗(yàn)14條

[摘要]1.怎樣解決不可視類庫操作中庫容量的“惡性膨漲”程序員用面向?qū)ο缶幊潭紩?huì)涉及到類庫,但當(dāng)對象的繼承關(guān)系達(dá)到兩層以上時(shí)(這是很平常的現(xiàn)象),只要一修改兩層以上某個(gè)對象中的內(nèi)容,就會(huì)驚奇地發(fā)現(xiàn):盡管修改量極小(有時(shí)只是簡單的刪除),但每一次的存盤操作都會(huì)使類庫的容量(即用DIR看到的字節(jié)數(shù))增加很多,...

1.怎樣解決不可視類庫操作中庫容量的“惡性膨漲”

程序員用面向?qū)ο缶幊潭紩?huì)涉及到類庫,但當(dāng)對象的繼承關(guān)系達(dá)到兩層以上時(shí)(這是很平常的現(xiàn)象),只要一修改兩層以上某個(gè)對象中的內(nèi)容,就會(huì)驚奇地發(fā)現(xiàn):盡管修改量極小(有時(shí)只是簡單的刪除),但每一次的存盤操作都會(huì)使類庫的容量(即用DIR看到的字節(jié)數(shù))增加很多,有時(shí)一次存盤操作可使其“容量”增加幾十K!筆者有一個(gè)實(shí)際內(nèi)容只有50K的類庫,當(dāng)調(diào)試完成后,發(fā)現(xiàn)該類庫的“容量”是800多K。筆者曾在多臺(tái)機(jī)器的多個(gè)版本上做過試驗(yàn),問題依舊。在排除了病毒騷擾的因素后,可以肯定:這是Visual FoxPro自身固有的缺陷。
顯然,這個(gè)問題給程序開發(fā)帶來了不小的麻煩。怎樣解決呢?筆者查過不少資料,做過多次試驗(yàn),都不得要領(lǐng)。后來在一次偶然的操作中,卻發(fā)現(xiàn)了一個(gè)簡單而有效的“類庫消腫”方法:
①.打開這個(gè)待處理的類庫,進(jìn)入其中的一個(gè)繼承關(guān)系最復(fù)雜且最高層的對象(即最上層的父類);
②.修改一下該對象中的任一個(gè)方法或?qū)傩?即增加一個(gè)字符,然后再刪除該字符);
③.保存并退出;
④.用Close all和Clear all徹底關(guān)閉類庫。
此時(shí)再觀察該類庫的字節(jié)數(shù),可以發(fā)現(xiàn)該類庫的“容量”已恢復(fù)正常。

2.怎樣為備注型字段建索引

Visual FoxPro3.0不支持長度變化的關(guān)鍵字,但筆者在實(shí)驗(yàn)后發(fā)現(xiàn),如果所建索引的備注型字段的長度在建完索引后不再變化,那么建立備注型字段的索引還是可行的。但在建索引時(shí)必須注意:索引的表達(dá)式不能直接用備注型的字段名,還要略加變通,如用TRIM()函數(shù)把備注型字段括起來,就能順利地為備注型字段建索引。

3.建立索引的字符型字段允許的最大寬度

資料中對此沒做說明,經(jīng)試驗(yàn)發(fā)現(xiàn),此時(shí)索引允許的最大寬度為240個(gè)字符。

4.當(dāng)某個(gè)對象(中的)方法的形參過多時(shí),最好用屬性數(shù)組來代替形參

這種手段可以使主要處理過程的邏輯性更加清楚可讀。
為了保證實(shí)質(zhì)上的封閉性,屬性數(shù)組應(yīng)該定義在主控方法所在的對象中;為了保證“視覺”上的封閉性(即增強(qiáng)程序代碼的可性),可以讓屬性數(shù)組與主控方法同名。
為了進(jìn)一步加強(qiáng)主控方法的可讀性,可為其專門增加一個(gè)附加方法只用于給做形參的屬性數(shù)組賦值。

5.怎樣在對象中定義屬性數(shù)組

在定義屬性時(shí),直接用方括號(hào)給出行列值即可。如:A[5,9],即定義了一個(gè)5行9列的屬性數(shù)組。

6.怎樣快速地建立Grid表格

在程序中使用過Grid表格的程序員都覺得這種表格的建立方法有些麻煩,特別是當(dāng)表格的個(gè)數(shù)及表格項(xiàng)很多的時(shí)候,甚至?xí)a(chǎn)生“恐懼感”。其實(shí),只要能靈活地利用VFP的“表單生成器”,就能大大提高Grid表格的制作效率。
這里假設(shè)需要以TTT.DBF為處理對象建立一個(gè)Grid表格,因?yàn)樽侄魏芏,Grid表格的表格項(xiàng)數(shù)也相應(yīng)的多,所以只能采用“變通”的方法,步驟如下:
①.建立一個(gè)只有兩個(gè)字段的自由表aa.dbf,并使其中的一個(gè)字段能與TTT.DBF中的某個(gè)字段相關(guān);
②.啟動(dòng)“表單生成器”,選擇“向?qū)Х绞健敝械摹耙粚Χ啾韱蜗驅(qū)А保?br>③.在“一對多表單向?qū)А钡牟僮饕龑?dǎo)下,以aa.dbf為父表、TTT.DBF為子表的基本模式制作表單。在選擇子表字段時(shí),以未來Grid表格的需要來進(jìn)行TTT.DBF字段的選取。
④.打開由第③步制作的表單,剪切表單上的Grid表格,然后再退出該表單;
⑤.打開您程序中需要使用Grid表格的表單,把在第④步上剪切的Grid表格復(fù)制到當(dāng)前表單上。
至此,一個(gè)符合程序要求的Grid表格即制作完畢。無論Grid表格多么大,用本方法都能在兩分鐘內(nèi)做出一個(gè)符合要求的Grid表格。而用“手工”制作一個(gè)僅50個(gè)字段的Grid表格一般需要半個(gè)小時(shí)(而且還可能出錯(cuò))。顯然,Grid表格越大,本方法的效率就越高。

7.用“避開”的手段使對象中的方法“浮”起來

所謂讓對象的方法“浮”起來,是指讓該方法運(yùn)行時(shí),能不受工作區(qū)、變量、已打開的數(shù)據(jù)表等的限制(即不受“現(xiàn)場”的限制),而且不干擾其它方法運(yùn)行的一種手段。過去在教科書上學(xué)到的原則是:先保存“現(xiàn)場”,待處理工作完成后,再恢復(fù)“現(xiàn)場”。對VFP等數(shù)據(jù)庫系統(tǒng)來說,所謂“現(xiàn)場”多是指已經(jīng)被占用的工作區(qū)、當(dāng)前的磁盤目錄、已打開的數(shù)據(jù)表以及可能使用或正在使用的數(shù)據(jù)變量或?qū)ο蟮膶傩缘取?br>因此,我們完全可以用“避開”的方式來達(dá)到目的,以下是“避開”法的基本步驟:
①.在本方法的起點(diǎn)先聲明變量私有化,記錄好本方法啟動(dòng)前的工作區(qū)及磁盤目錄;
②.尋找并返回一個(gè)還未被使用的工作區(qū),在該工作打開一個(gè)需要的數(shù)據(jù)表;
③.做本方法的“本職工作”(包括調(diào)用其它方法);
④.恢復(fù)本方法啟動(dòng)前的工作區(qū)及工磁盤目錄;
⑤.退出本方法。
由以上步驟可以看出,“避開”方式的基本要點(diǎn)是“單進(jìn)單出”,以數(shù)據(jù)表為例:同一方法打開的數(shù)據(jù)表必須在該方法退出時(shí)關(guān)閉。對于工作區(qū)、磁盤目錄亦有同樣思路。顯然,這種手段占用的內(nèi)存要多一些,在DOS時(shí)代是不合適的,對于WINDOWS就不是什么問題了。

8.必須“自造”的幾個(gè)通用的對象方法

以下是幾個(gè)用得最多,但在VFP中卻沒有現(xiàn)成可用的方法:

①.在盤上查找指定的數(shù)據(jù)庫
LPARAMETERS file_dbc
Private fff
fff=trim(file_dbc)
if len(fff)< 0.8
&&如果沒指定數(shù)據(jù)庫,就說明后面要用的那些數(shù)據(jù)表都是自由表,所以不用打開數(shù)據(jù)庫

return .t.
endif
IF .not.file('&fff')
wait windows '在這個(gè)目錄下沒找到您指定的數(shù)據(jù)庫!'
fff=.F.
ELSE
OPEN DATABASE &fff EXCLUSIVE
fff=.T.
ENDIF
return fff

②.在指定的(子)目錄中查找指定的文件

LPARAMETERS file,Text &&即:文件名,提示信息
Private All
****** Like f*
fff=trim(file)
fff1=.t.
IF .not.file('&fff')
IF Len(Trim(Text)) >0.5
&&若提示信息的內(nèi)容為空則不做暫停顯示
wait windows Text
ENDIF
fff1=.f.
ENDIF
return fff1

③.尋找并返回一個(gè)還未被使用的工作區(qū)

Private ALL
for I=1 to 10
aaa_m=alias(I)
if len(trim(aaa_m))< 0.5
return I
endif
endfor
return 0

④.建立一個(gè)指定的目錄

LPARAMETERS dire &&待建的目錄名
Private All Like f*
fff='set Library to '+trim(This.path_FTS)
+'\Foxtools.FLL Additive'
&fff
*set Library to Foxtools.FLL Additive
fff1=.f.
fff=trim(dire)
if mkdir(fff)=0
fff1=.t. &&建立成功
endif
set Library to
return fff1

9.快速查詢備注字段

在對備往字段進(jìn)行全文查找時(shí),用ATC()函數(shù)比用AT-CLIEN()函數(shù)快數(shù)倍。

10.最近匹配檢索

在使用索引查找命令之前先設(shè)置“SET NEAR ON”有時(shí)極有用處,該設(shè)置的含義為:當(dāng)查找失敗時(shí),記錄號(hào)定位于最接近匹配的位置上,而不是在數(shù)據(jù)庫的末尾。比如對一個(gè)已打開日期字段索引的庫,想瀏覽3月5日之后的記錄,但事先只知道庫中有許多不連續(xù)的日期記錄,并不知道庫中是否確有3月5日的記錄。如果設(shè)置了“SET NEAR ON”,當(dāng)庫中不存在3月5日的記錄時(shí),就會(huì)定位在離3月5日最接近的3月6日或7日記錄處,從而達(dá)到查詢?yōu)g覽目的。

11.檢測某類文件

函數(shù)FIEL()只能檢測某特定文件是否存在,不能檢測某類文件是否存在,而系統(tǒng)函數(shù)SYS(2000,<文件名>)則可搜尋某類文件,只要參數(shù)“文件名”中含有通配符“*?”即可。用這個(gè)方法還可以判斷某子目錄是否為空,只要“文件名”用“路徑名”和“*.*”組成即可。

12.保護(hù)屏幕畫面

當(dāng)在數(shù)據(jù)庫環(huán)境下調(diào)用DOS命令時(shí),命令執(zhí)行后輸出的信息往往會(huì)破壞數(shù)據(jù)庫環(huán)境已有的屏幕畫面。當(dāng)然用保存屏幕再恢復(fù)的方法可以解決,但不如使用Dos的輸出重定向功能為好,這樣輸出的信息就不會(huì)向屏幕顯示。比如命令“RUN COPY ABC.* A:”可以改為:

RUN COPY ABC.* A: >ttt.txt
此時(shí)可將本來要輸出到屏幕的信息改道輸入到臨時(shí)文件ttt.Txt中去,保持屏幕不變。

13.調(diào)用大尺寸外部程序

在FoxPro環(huán)境下可以用RUN()命令直接調(diào)用外部Dos命令,但有時(shí)剩下的內(nèi)存已不多,而外部程序又很大時(shí)就可能調(diào)用失敗。在FoxPro中有個(gè)內(nèi)存管理程序FoxSWAP可以解決這個(gè)問題。調(diào)用WP5的命令可以寫為:

RUN/120 WPS

14.用覆差法更新數(shù)據(jù)

如果一個(gè)很大的數(shù)據(jù)庫需要經(jīng)常進(jìn)行數(shù)據(jù)更新,是好不要用刪除舊記錄再增加新記錄的方法,因?yàn)榇髷?shù)據(jù)庫的物理刪除PACK命令執(zhí)行起來需要很長時(shí)間。此時(shí)最好用覆蓋的方法,即把新記錄的內(nèi)容一一裝人舊記錄中。而這個(gè)過程最好用SCATTER命令和GATHER命令配合起來完成,前者的作用是把一條記錄的所有字段內(nèi)容存人一個(gè)數(shù)組變量中,后者的作用則是把數(shù)組變量的內(nèi)容存入一條記錄中。也就是說借用內(nèi)存變量把新記錄的內(nèi)容傳遞到舊記錄中,內(nèi)存操作顯然比磁盤操作要快得多。