1.怎樣解決不可視類庫(kù)操作中庫(kù)容量的“惡性膨漲”
程序員用面向?qū)ο缶幊潭紩?huì)涉及到類庫(kù),但當(dāng)對(duì)象的繼承關(guān)系達(dá)到兩層以上時(shí)(這是很平常的現(xiàn)象),只要一修改兩層以上某個(gè)對(duì)象中的內(nèi)容,就會(huì)驚奇地發(fā)現(xiàn):盡管修改量極小(有時(shí)只是簡(jiǎn)單的刪除),但每一次的存盤操作都會(huì)使類庫(kù)的容量(即用DIR看到的字節(jié)數(shù))增加很多,有時(shí)一次存盤操作可使其“容量”增加幾十K!筆者有一個(gè)實(shí)際內(nèi)容只有50K的類庫(kù),當(dāng)調(diào)試完成后,發(fā)現(xiàn)該類庫(kù)的“容量”是800多K。筆者曾在多臺(tái)機(jī)器的多個(gè)版本上做過試驗(yàn),問題依舊。在排除了病毒騷擾的因素后,可以肯定:這是Visual FoxPro自身固有的缺陷。 顯然,這個(gè)問題給程序開發(fā)帶來(lái)了不小的麻煩。怎樣解決呢?筆者查過不少資料,做過多次試驗(yàn),都不得要領(lǐng)。后來(lái)在一次偶然的操作中,卻發(fā)現(xiàn)了一個(gè)簡(jiǎn)單而有效的“類庫(kù)消腫”方法: ①.打開這個(gè)待處理的類庫(kù),進(jìn)入其中的一個(gè)繼承關(guān)系最復(fù)雜且最高層的對(duì)象(即最上層的父類); ②.修改一下該對(duì)象中的任一個(gè)方法或?qū)傩?即增加一個(gè)字符,然后再刪除該字符); ③.保存并退出; ④.用Close all和Clear all徹底關(guān)閉類庫(kù)。 此時(shí)再觀察該類庫(kù)的字節(jié)數(shù),可以發(fā)現(xiàn)該類庫(kù)的“容量”已恢復(fù)正常。
2.怎樣為備注型字段建索引
Visual FoxPro3.0不支持長(zhǎng)度變化的關(guān)鍵字,但筆者在實(shí)驗(yàn)后發(fā)現(xiàn),如果所建索引的備注型字段的長(zhǎng)度在建完索引后不再變化,那么建立備注型字段的索引還是可行的。但在建索引時(shí)必須注意:索引的表達(dá)式不能直接用備注型的字段名,還要略加變通,如用TRIM()函數(shù)把備注型字段括起來(lái),就能順利地為備注型字段建索引。
3.建立索引的字符型字段允許的最大寬度
資料中對(duì)此沒做說(shuō)明,經(jīng)試驗(yàn)發(fā)現(xiàn),此時(shí)索引允許的最大寬度為240個(gè)字符。
4.當(dāng)某個(gè)對(duì)象(中的)方法的形參過多時(shí),最好用屬性數(shù)組來(lái)代替形參
這種手段可以使主要處理過程的邏輯性更加清楚可讀。 為了保證實(shí)質(zhì)上的封閉性,屬性數(shù)組應(yīng)該定義在主控方法所在的對(duì)象中;為了保證“視覺”上的封閉性(即增強(qiáng)程序代碼的可性),可以讓屬性數(shù)組與主控方法同名。 為了進(jìn)一步加強(qiáng)主控方法的可讀性,可為其專門增加一個(gè)附加方法只用于給做形參的屬性數(shù)組賦值。
5.怎樣在對(duì)象中定義屬性數(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為處理對(duì)象建立一個(gè)Grid表格,因?yàn)樽侄魏芏啵珿rid表格的表格項(xiàng)數(shù)也相應(yīng)的多,所以只能采用“變通”的方法,步驟如下: ①.建立一個(gè)只有兩個(gè)字段的自由表aa.dbf,并使其中的一個(gè)字段能與TTT.DBF中的某個(gè)字段相關(guān); ②.啟動(dòng)“表單生成器”,選擇“向?qū)Х绞健敝械摹耙粚?duì)多表單向?qū)А保?br>③.在“一對(duì)多表單向?qū)А钡牟僮饕龑?dǎo)下,以aa.dbf為父表、TTT.DBF為子表的基本模式制作表單。在選擇子表字段時(shí),以未來(lái)Grid表格的需要來(lái)進(jìn)行TTT.DBF字段的選取。 ④.打開由第③步制作的表單,剪切表單上的Grid表格,然后再退出該表單; ⑤.打開您程序中需要使用Grid表格的表單,把在第④步上剪切的Grid表格復(fù)制到當(dāng)前表單上。 至此,一個(gè)符合程序要求的Grid表格即制作完畢。無(wú)論Grid表格多么大,用本方法都能在兩分鐘內(nèi)做出一個(gè)符合要求的Grid表格。而用“手工”制作一個(gè)僅50個(gè)字段的Grid表格一般需要半個(gè)小時(shí)(而且還可能出錯(cuò))。顯然,Grid表格越大,本方法的效率就越高。
7.用“避開”的手段使對(duì)象中的方法“浮”起來(lái)
所謂讓對(duì)象的方法“浮”起來(lái),是指讓該方法運(yùn)行時(shí),能不受工作區(qū)、變量、已打開的數(shù)據(jù)表等的限制(即不受“現(xiàn)場(chǎng)”的限制),而且不干擾其它方法運(yùn)行的一種手段。過去在教科書上學(xué)到的原則是:先保存“現(xiàn)場(chǎng)”,待處理工作完成后,再恢復(fù)“現(xiàn)場(chǎng)”。對(duì)VFP等數(shù)據(jù)庫(kù)系統(tǒng)來(lái)說(shuō),所謂“現(xiàn)場(chǎng)”多是指已經(jīng)被占用的工作區(qū)、當(dāng)前的磁盤目錄、已打開的數(shù)據(jù)表以及可能使用或正在使用的數(shù)據(jù)變量或?qū)ο蟮膶傩缘取?br>因此,我們完全可以用“避開”的方式來(lái)達(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)閉。對(duì)于工作區(qū)、磁盤目錄亦有同樣思路。顯然,這種手段占用的內(nèi)存要多一些,在DOS時(shí)代是不合適的,對(duì)于WINDOWS就不是什么問題了。
8.必須“自造”的幾個(gè)通用的對(duì)象方法
以下是幾個(gè)用得最多,但在VFP中卻沒有現(xiàn)成可用的方法:
①.在盤上查找指定的數(shù)據(jù)庫(kù) LPARAMETERS file_dbc Private fff fff=trim(file_dbc) if len(fff)< 0.8 &&如果沒指定數(shù)據(jù)庫(kù),就說(shuō)明后面要用的那些數(shù)據(jù)表都是自由表,所以不用打開數(shù)據(jù)庫(kù)
return .t. endif IF .not.file('&fff') wait windows '在這個(gè)目錄下沒找到您指定的數(shù)據(jù)庫(kù)!' 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.快速查詢備注字段
在對(duì)備往字段進(jìn)行全文查找時(shí),用ATC()函數(shù)比用AT-CLIEN()函數(shù)快數(shù)倍。
10.最近匹配檢索
在使用索引查找命令之前先設(shè)置“SET NEAR ON”有時(shí)極有用處,該設(shè)置的含義為:當(dāng)查找失敗時(shí),記錄號(hào)定位于最接近匹配的位置上,而不是在數(shù)據(jù)庫(kù)的末尾。比如對(duì)一個(gè)已打開日期字段索引的庫(kù),想瀏覽3月5日之后的記錄,但事先只知道庫(kù)中有許多不連續(xù)的日期記錄,并不知道庫(kù)中是否確有3月5日的記錄。如果設(shè)置了“SET NEAR ON”,當(dāng)庫(kù)中不存在3月5日的記錄時(shí),就會(huì)定位在離3月5日最接近的3月6日或7日記錄處,從而達(dá)到查詢?yōu)g覽目的。
11.檢測(cè)某類文件
函數(shù)FIEL()只能檢測(cè)某特定文件是否存在,不能檢測(cè)某類文件是否存在,而系統(tǒng)函數(shù)SYS(2000,<文件名>)則可搜尋某類文件,只要參數(shù)“文件名”中含有通配符“*?”即可。用這個(gè)方法還可以判斷某子目錄是否為空,只要“文件名”用“路徑名”和“*.*”組成即可。
12.保護(hù)屏幕畫面
當(dāng)在數(shù)據(jù)庫(kù)環(huán)境下調(diào)用DOS命令時(shí),命令執(zhí)行后輸出的信息往往會(huì)破壞數(shù)據(jù)庫(kù)環(huán)境已有的屏幕畫面。當(dāng)然用保存屏幕再恢復(fù)的方法可以解決,但不如使用Dos的輸出重定向功能為好,這樣輸出的信息就不會(huì)向屏幕顯示。比如命令“RUN COPY ABC.* A:”可以改為:
RUN COPY ABC.* A: >ttt.txt 此時(shí)可將本來(lái)要輸出到屏幕的信息改道輸入到臨時(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ù)庫(kù)需要經(jīng)常進(jìn)行數(shù)據(jù)更新,是好不要用刪除舊記錄再增加新記錄的方法,因?yàn)榇髷?shù)據(jù)庫(kù)的物理刪除PACK命令執(zhí)行起來(lái)需要很長(zhǎng)時(shí)間。此時(shí)最好用覆蓋的方法,即把新記錄的內(nèi)容一一裝人舊記錄中。而這個(gè)過程最好用SCATTER命令和GATHER命令配合起來(lái)完成,前者的作用是把一條記錄的所有字段內(nèi)容存人一個(gè)數(shù)組變量中,后者的作用則是把數(shù)組變量的內(nèi)容存入一條記錄中。也就是說(shuō)借用內(nèi)存變量把新記錄的內(nèi)容傳遞到舊記錄中,內(nèi)存操作顯然比磁盤操作要快得多。
|
溫馨提示:喜歡本站的話,請(qǐng)收藏一下本站!