| 導購 | 订阅 | 在线投稿
分享
 
 
 

Visual FoxPro3.0經驗14條

來源:互聯網  2008-06-01 01:10:36  評論

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

程序員用面向對象編程都會涉及到類庫,但當對象的繼續關系達到兩層以上時(這是很平常的現象),只要一修改兩層以上某個對象中的內容,就會驚異地發現:盡管修改量極小(有時只是簡單的刪除),但每一次的存盤操作都會使類庫的容量(即用DIR看到的字節數)增加很多,有時一次存盤操作可使其「容量」增加幾十K!筆者有一個實際內容只有50K的類庫,當調試完成後,發現該類庫的「容量」是800多K。筆者曾在多台機器的多個版本上做過試驗,問題依舊。在排除了病毒騷擾的因素後,可以肯定:這是Visual FoXPro自身固有的缺陷。

顯然,這個問題給程序開發帶來了不小的麻煩。怎樣解決呢?筆者查過不少資料,做過多次試驗,都不得要領。後來在一次偶然的操作中,卻發現了一個簡單而有效的「類庫消腫」方法:

①.打開這個待處理的類庫,進入其中的一個繼續關系最複雜且最高層的對象(即最上層的父類);

②.修改一下該對象中的任一個方法或屬性(即增加一個字符,然後再刪除該字符);

③.保存並退出;

④.用Close all和Clear all徹底關閉類庫。

此時再觀察該類庫的字節數,可以發現該類庫的「容量」已恢複正常。

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

Visual FoxPro3.0不支持長度變化的要害字,但筆者在實驗後發現,假如所建索引的備注型字段的長度在建完索引後不再變化,那麽建立備注型字段的索引還是可行的。但在建索引時必須注重:索引的表達式不能直接用備注型的字段名,還要略加變通,如用TRIM()函數把備注型字段括起來,就能順利地爲備注型字段建索引。

3.建立索引的字符型字段答應的最大寬度

資料中對此沒做說明,經試驗發現,此時索引答應的最大寬度爲240個字符。

4.當某個對象(中的)方法的形參過多時,最好用屬性數組來代替形參

這種手段可以使主要處理過程的邏輯性更加清楚可讀。

爲了保證實質上的封閉性,屬性數組應該定義在主控方法所在的對象中;爲了保證「視覺」上的封閉性(即增強程序代碼的可性),可以讓屬性數組與主控方法同名。

爲了進一步加強主控方法的可讀性,可爲其專門增加一個附加方法只用于給做形參的屬性數組賦值。

5.怎樣在對象中定義屬性數組

在定義屬性時,直接用方括號給出行列值即可。如:A[5,9],即定義了一個5行9列的屬性數組。

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

在程序中使用過Grid表格的程序員都覺得這種表格的建立方法有些麻煩,非凡是當表格的個數及表格項很多的時候,甚至會産生「懼怕感」。其實,只要能靈活地利用VFP的「表單生成器」,就能大大提高Grid表格的制作效率。

這裏假設需要以TTT.DBF爲處理對象建立一個Grid表格,因爲字段很多,Grid表格的表格項數也相應的多,所以只能采用「變通」的方法,步驟如下:

①.建立一個只有兩個字段的自由表aa.dbf,並使其中的一個字段能與TTT.DBF中的某個字段相關;

②.啓動「表單生成器」,選擇「向導方式」中的「一對多表單向導」;

③.在「一對多表單向導」的操作引導下,以aa.dbf爲父表、TTT.DBF爲子表的基本模式制作表單。在選擇子表字段時,以未來Grid表格的需要來進行TTT.DBF字段的選取。

④.打開由第③步制作的表單,剪切表單上的Grid表格,然後再退出該表單;

⑤.打開您程序中需要使用Grid表格的表單,把在第④步上剪切的Grid表格複制到當前表單上。

至此,一個符合程序要求的Grid表格即制作完畢。無論Grid表格多麽大,用本方法都能在兩分鍾內做出一個符合要求的Grid表格。而用「手工」制作一個僅50個字段的Grid表格一般需要半個小時(而且還可能出錯)。顯然,Grid表格越大,本方法的效率就越高。

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

所謂讓對象的方法「浮」起來,是指讓該方法運行時,能不受工作區、變量、已打開的數據表等的限制(即不受「現場」的限制),而且不幹擾其它方法運行的一種手段。過去在教科書上學到的原則是:先保存「現場」,待處理工作完成後,再恢複「現場」。對VFP等數據庫系統來說,所謂「現場」多是指已經被占用的工作區、當前的磁盤目錄、已打開的數據表以及可能使用或正在使用的數據變量或對象的屬性等。

因此,我們完全可以用「避開」的方式來達到目的,以下是「避開」法的基本步驟:

①.在本方法的起點先聲明變量私有化,記錄好本方法啓動前的工作區及磁盤目錄;

②.尋找並返回一個還未被使用的工作區,在該工作打開一個需要的數據表;

③.做本方法的「本職工作」(包括調用其它方法);

④.恢複本方法啓動前的工作區及工磁盤目錄;

⑤.退出本方法。

由以上步驟可以看出,「避開」方式的基本要點是「單進單出」,以數據表爲例:同一方法打開的數據表必須在該方法退出時關閉。對于工作區、磁盤目錄亦有同樣思路。顯然,這種手段占用的內存要多一些,在DOS時代是不合適的,對于WINDOWS就不是什麽問題了。

8.必須「自造」的幾個通用的對象方法

以下是幾個用得最多,但在VFP中卻沒有現成可用的方法:

①.在盤上查找指定的數據庫

LPARAMETERS file_dbc

Private fff

fff=trim(file_dbc)

if len(fff)< 0.8

&&假如沒指定數據庫,就說明後面要用的那些數據表都是自由表,所以不用打開數據庫

return .t.

endif

IF .not.file('&fff')

wait windows '在這個目錄下沒找到您指定的數據庫!'

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

&&若提示信息的內容爲空則不做暫停顯示

wait windows Text

ENDIF

fff1=.f.

ENDIF

return fff1

③.尋找並返回一個還未被使用的工作區

Private ALL

for I=1 to 10

aaa_m=alias(I)

if len(trim(aaa_m))< 0.5

return I

endif

endfor

return 0

④.建立一個指定的目錄

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.快速查詢備注字段

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

10.最近匹配檢索

在使用索引查找命令之前先設置「SET NEAR ON」有時極有用處,該設置的含義爲:當查找失敗時,記錄號定位于最接近匹配的位置上,而不是在數據庫的末尾。比如對一個已打開日期字段索引的庫,想浏覽3月5日之後的記錄,但事先只知道庫中有許多不連續的日期記錄,並不知道庫中是否確有3月5日的記錄。假如設置了「SET NEAR ON」,當庫中不存在3月5日的記錄時,就會定位在離3月5日最接近的3月6日或7日記錄處,從而達到查詢浏覽目的。

11.檢測某類文件

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

12.保護屏幕畫面

當在數據庫環境下調用DOS命令時,命令執行後輸出的信息往往會破壞數據庫環境已有的屏幕畫面。當然用保存屏幕再恢複的方法可以解決,但不如使用Dos的輸出重定向功能爲好,這樣輸出的信息就不會向屏幕顯示。比如命令「RUN COPY ABC.* A:」可以改爲:

RUN COPY ABC.* A: >ttt.txt

此時可將本來要輸出到屏幕的信息改道輸入到臨時文件ttt.Txt中去,保持屏幕不變。

13.調用大尺寸外部程序

在FoxPro環境下可以用RUN()命令直接調用外部Dos命令,但有時剩下的內存已不多,而外部程序又很大時就可能調用失敗。在FoxPro中有個內存治理程序FoxSWAP可以解決這個問題。調用WP5的命令可以寫爲:

RUN/120 WPS

14.用覆差法更新數據

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

 1.怎樣解決不可視類庫操作中庫容量的「惡性膨漲」   程序員用面向對象編程都會涉及到類庫,但當對象的繼續關系達到兩層以上時(這是很平常的現象),只要一修改兩層以上某個對象中的內容,就會驚異地發現:盡管修改量極小(有時只是簡單的刪除),但每一次的存盤操作都會使類庫的容量(即用DIR看到的字節數)增加很多,有時一次存盤操作可使其「容量」增加幾十K!筆者有一個實際內容只有50K的類庫,當調試完成後,發現該類庫的「容量」是800多K。筆者曾在多台機器的多個版本上做過試驗,問題依舊。在排除了病毒騷擾的因素後,可以肯定:這是Visual FoXPro自身固有的缺陷。   顯然,這個問題給程序開發帶來了不小的麻煩。怎樣解決呢?筆者查過不少資料,做過多次試驗,都不得要領。後來在一次偶然的操作中,卻發現了一個簡單而有效的「類庫消腫」方法:   ①.打開這個待處理的類庫,進入其中的一個繼續關系最複雜且最高層的對象(即最上層的父類);   ②.修改一下該對象中的任一個方法或屬性(即增加一個字符,然後再刪除該字符);   ③.保存並退出;   ④.用Close all和Clear all徹底關閉類庫。   此時再觀察該類庫的字節數,可以發現該類庫的「容量」已恢複正常。   2.怎樣爲備注型字段建索引   Visual FoxPro3.0不支持長度變化的要害字,但筆者在實驗後發現,假如所建索引的備注型字段的長度在建完索引後不再變化,那麽建立備注型字段的索引還是可行的。但在建索引時必須注重:索引的表達式不能直接用備注型的字段名,還要略加變通,如用TRIM()函數把備注型字段括起來,就能順利地爲備注型字段建索引。   3.建立索引的字符型字段答應的最大寬度   資料中對此沒做說明,經試驗發現,此時索引答應的最大寬度爲240個字符。   4.當某個對象(中的)方法的形參過多時,最好用屬性數組來代替形參   這種手段可以使主要處理過程的邏輯性更加清楚可讀。   爲了保證實質上的封閉性,屬性數組應該定義在主控方法所在的對象中;爲了保證「視覺」上的封閉性(即增強程序代碼的可性),可以讓屬性數組與主控方法同名。   爲了進一步加強主控方法的可讀性,可爲其專門增加一個附加方法只用于給做形參的屬性數組賦值。   5.怎樣在對象中定義屬性數組   在定義屬性時,直接用方括號給出行列值即可。如:A[5,9],即定義了一個5行9列的屬性數組。   6.怎樣快速地建立Grid表格   在程序中使用過Grid表格的程序員都覺得這種表格的建立方法有些麻煩,非凡是當表格的個數及表格項很多的時候,甚至會産生「懼怕感」。其實,只要能靈活地利用VFP的「表單生成器」,就能大大提高Grid表格的制作效率。   這裏假設需要以TTT.DBF爲處理對象建立一個Grid表格,因爲字段很多,Grid表格的表格項數也相應的多,所以只能采用「變通」的方法,步驟如下:   ①.建立一個只有兩個字段的自由表aa.dbf,並使其中的一個字段能與TTT.DBF中的某個字段相關;   ②.啓動「表單生成器」,選擇「向導方式」中的「一對多表單向導」;   ③.在「一對多表單向導」的操作引導下,以aa.dbf爲父表、TTT.DBF爲子表的基本模式制作表單。在選擇子表字段時,以未來Grid表格的需要來進行TTT.DBF字段的選取。   ④.打開由第③步制作的表單,剪切表單上的Grid表格,然後再退出該表單;   ⑤.打開您程序中需要使用Grid表格的表單,把在第④步上剪切的Grid表格複制到當前表單上。   至此,一個符合程序要求的Grid表格即制作完畢。無論Grid表格多麽大,用本方法都能在兩分鍾內做出一個符合要求的Grid表格。而用「手工」制作一個僅50個字段的Grid表格一般需要半個小時(而且還可能出錯)。顯然,Grid表格越大,本方法的效率就越高。   7.用「避開」的手段使對象中的方法「浮」起來   所謂讓對象的方法「浮」起來,是指讓該方法運行時,能不受工作區、變量、已打開的數據表等的限制(即不受「現場」的限制),而且不幹擾其它方法運行的一種手段。過去在教科書上學到的原則是:先保存「現場」,待處理工作完成後,再恢複「現場」。對VFP等數據庫系統來說,所謂「現場」多是指已經被占用的工作區、當前的磁盤目錄、已打開的數據表以及可能使用或正在使用的數據變量或對象的屬性等。   因此,我們完全可以用「避開」的方式來達到目的,以下是「避開」法的基本步驟:   ①.在本方法的起點先聲明變量私有化,記錄好本方法啓動前的工作區及磁盤目錄;   ②.尋找並返回一個還未被使用的工作區,在該工作打開一個需要的數據表;   ③.做本方法的「本職工作」(包括調用其它方法);   ④.恢複本方法啓動前的工作區及工磁盤目錄;   ⑤.退出本方法。   由以上步驟可以看出,「避開」方式的基本要點是「單進單出」,以數據表爲例:同一方法打開的數據表必須在該方法退出時關閉。對于工作區、磁盤目錄亦有同樣思路。顯然,這種手段占用的內存要多一些,在DOS時代是不合適的,對于WINDOWS就不是什麽問題了。   8.必須「自造」的幾個通用的對象方法   以下是幾個用得最多,但在VFP中卻沒有現成可用的方法:   ①.在盤上查找指定的數據庫   LPARAMETERS file_dbc   Private fff   fff=trim(file_dbc)   if len(fff)< 0.8   &&假如沒指定數據庫,就說明後面要用的那些數據表都是自由表,所以不用打開數據庫   return .t.   endif   IF .not.file('&fff')   wait windows '在這個目錄下沒找到您指定的數據庫!'   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   &&若提示信息的內容爲空則不做暫停顯示   wait windows Text   ENDIF   fff1=.f.   ENDIF   return fff1   ③.尋找並返回一個還未被使用的工作區   Private ALL   for I=1 to 10   aaa_m=alias(I)   if len(trim(aaa_m))< 0.5   return I   endif   endfor   return 0   ④.建立一個指定的目錄   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.快速查詢備注字段   在對備往字段進行全文查找時,用ATC()函數比用AT-CLIEN()函數快數倍。   10.最近匹配檢索   在使用索引查找命令之前先設置「SET NEAR ON」有時極有用處,該設置的含義爲:當查找失敗時,記錄號定位于最接近匹配的位置上,而不是在數據庫的末尾。比如對一個已打開日期字段索引的庫,想浏覽3月5日之後的記錄,但事先只知道庫中有許多不連續的日期記錄,並不知道庫中是否確有3月5日的記錄。假如設置了「SET NEAR ON」,當庫中不存在3月5日的記錄時,就會定位在離3月5日最接近的3月6日或7日記錄處,從而達到查詢浏覽目的。   11.檢測某類文件   函數FIEL()只能檢測某特定文件是否存在,不能檢測某類文件是否存在,而系統函數SYS(2000,<文件名>)則可搜尋某類文件,只要參數「文件名」中含有通配符「*?」即可。用這個方法還可以判定某子目錄是否爲空,只要「文件名」用「路徑名」和「*.*」組成即可。   12.保護屏幕畫面   當在數據庫環境下調用DOS命令時,命令執行後輸出的信息往往會破壞數據庫環境已有的屏幕畫面。當然用保存屏幕再恢複的方法可以解決,但不如使用Dos的輸出重定向功能爲好,這樣輸出的信息就不會向屏幕顯示。比如命令「RUN COPY ABC.* A:」可以改爲:   RUN COPY ABC.* A: >ttt.txt   此時可將本來要輸出到屏幕的信息改道輸入到臨時文件ttt.Txt中去,保持屏幕不變。   13.調用大尺寸外部程序   在FoxPro環境下可以用RUN()命令直接調用外部Dos命令,但有時剩下的內存已不多,而外部程序又很大時就可能調用失敗。在FoxPro中有個內存治理程序FoxSWAP可以解決這個問題。調用WP5的命令可以寫爲:   RUN/120 WPS   14.用覆差法更新數據   假如一個很大的數據庫需要經常進行數據更新,是好不要用刪除舊記錄再增加新記錄的方法,因爲大數據庫的物理刪除PACK命令執行起來需要很長時間。此時最好用覆蓋的方法,即把新記錄的內容一一裝人舊記錄中。而這個過程最好用SCATTER命令和GATHER命令配合起來完成,前者的作用是把一條記錄的所有字段內容存人一個數組變量中,後者的作用則是把數組變量的內容存入一條記錄中。也就是說借用內存變量把新記錄的內容傳遞到舊記錄中,內存操作顯然比磁盤操作要快得多。
󰈣󰈤
王朝萬家燈火計劃
期待原創作者加盟
 
 
 
>>返回首頁<<
 
 
 
 
 熱帖排行
 
 
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有