VFP 6.0的十個實用技巧 - 中國WEB開發者網絡 (http://www.webasp.net) -- 技術教程 (http://www.webasp.net/article/) --- VFP 6.0的十個實用技巧 (http://www.webasp.net/article/19/18323.htm) |
| -- 作者:未知 -- 發佈日期: 2005-04-29 |
| 朱運喜(河北省.任丘市) ---- 一.選擇網絡打印機 ---- 筆者單位裡的局域網上安裝有多台網絡打印機,在使用VFP 6.0編製的程序進行打印操作時,是否可以選擇其中的某一台空閒的網絡打印機進行打印,而不一定非要從默認打印機輸出,從而提高工作效率呢?經筆者研究,在執行命令:Report From … To Printer 之前,先執行下列程序代碼:Set Printer To Name Getprinter(),就可以調用操作系統的"打印設定"對話框,用戶利用該窗口即可達到靈活選擇空閒打印機進行打印輸出的功能。(註:可供選擇的打印機名是用戶計算機上已安裝好的打印機名。) ---- 二.恢復丟失了的FPT文件 ---- 由於誤操作,將自由表的備註文件刪除,致使自由表無法打開。遇到這種情況我們可採用下述方法解決: ---- 1.創建一個新的自由表,且該自由表只含一個字段,其類型為備註型。關閉該自由表,將其擴展名為FPT的備註文件複製給誤刪除的自由表的備註文件,或將該備註文件改名為誤刪除的自由表的備註文件即可。運行下面的程序同樣也可以恢復丟失了的FPT 文件: accept '請輸入丟失了.FPT 文件的自由表名稱(不帶擴展名):' to namef namef=trim(namef)+'.bbb' crea dbf &namef (aa m) use dele file &namef ---- 2.用VFP低級文件函數創建一個空的FPT文件,原自由表即可打開。程序清單如下: accept '請輸入丟失了.FPT 文件的自由表名稱(不帶擴展名):' to namef namef=trim(namef)+'.FPT' hand=fcreate(namef) abc=repl(chr(0),3)+chr(8)+ repl(chr(0),3)+'@'+repl(chr(0),504) =fwrite(hand,abc) =fclose(hand) return ---- 上述方法只是為丟失了FPT文件的自由表建立了一個新的FPT文件,原FPT文件中的內容已經丟失,無法恢復。在實際操作中若遇到這種情況,最好是恢復原來的FPT文件,若原FPT文件無法恢復時再採用上述方法。 ---- 三.脫離VFP運行程序 ---- 利用VFP 6.0創建的應用程序,被編譯成可執行程序後,若要使其脫離VFP環境獨立運行,除了我們所知道的在應用程序目錄中需包含一個名為"CONFIG.FPW"的配置文件外,經筆者試驗發現還必須包含"VFP6R.DLL"、"VFP6RCHS.DLL"、"VFP6RENU.DLL"這三個動態鏈接庫文件。這三個文件在"Windows ystem"目錄下,用戶可直接將其複製到自己的應用程序目錄中。最後再經過編譯形成可執行程序,運行安裝嚮導創建發佈磁盤,我們開發的小應用程序就可以堂堂正正地在Win 98下安裝運行了。 ---- 四.低級文件函數加密數據庫 ---- VFP有一個十分薄弱的環節就是數據庫的保密性差。由於.DBF文件都是敞開式的,甚至用DOS中最簡單的TYPE命令都可以瀏覽,因此,筆者從以下兩方面對數據進行加密: ---- 1.在向自由表中增加數據時,就進行加密,即更新自由表時就對數據進行加密,在讀取數據時再解密。 ---- 2.用VFP提供的低級文件函數進行加密,加密後的文件無法打開、瀏覽,使用時,再執行該加密程序即可將加密的自由表還原。 **加密數據庫程序(同時也是解密程序)** set talk off close all clea @10,10 say "請輸入要加密的 自由表名(含擴展名):" get file1 defa ' ' read handle=fopen("&file1",2) if handle< 0 @14,10 say "不能打開文件!" =inkey(0) retu endif j=0 do while .not.feof(handle) bb=fread(handle,1) cc=chr(mod(asc(bb)+128,256)) =fseek(handle,j) =fwrite(handle,cc) ?asc(bb),asc(cc) j=j+1 enddo =fclose(handle) close all retu ---- 五.簡易設置TextBox對象的輸入長度 ---- 在以前的Xbase語法中,我們可以通過Picture參數定義某變量或文本欄的輸入長度格式,而在VFP中的TextBox對像中則支持了Format和InputMask屬性來定義輸入的格式。我們可以使用比較原始的方法來進行設定,比如當要求輸入有20個欄位的文本框對像時,我們可以在此對象的InputMask屬性中定義為InputMask="XXXXXXXXXXXXXXXXXXXX"。 ---- 但是這樣的設定方法非常麻煩,尤其是當面對更長的字符串輸入時更是不方便。其實我們完全可以用另外一種方法來把這樣的需求設計過程變得很簡單,下面就具體介紹一下這種簡易的快速設定輸入欄位的方法。 ---- 利用Replicate()函數設定輸入長度這裡我們同樣利用了對象的InputMask屬性來定義輸入格式和輸入長度,但是當對象的輸入比較長時,則可以借助算術表達式的方式來對其進行設定。通過屬性窗口中的InputMask屬性建立表達式對話框,我們可以利用Replicate()函數設定重複的"X"的個數即可(本例為20)。完成後回到屬性設置窗口,我們可以看到在InputMask屬性欄中出現了"=Replicate(20)"位值的表達式,這樣,我們就輕鬆地完成了長字符輸入的長度控制。由此我們也可以體會到善於使用表達式給我們帶來的方便之處。 ---- 六.中文文本框的設計方法 ---- 在程序開發過程中,我們經常要設計一些文本框,而且這些文本框要求只能輸入中文。在這種情況下,通常需手工啟動某一種中文輸入法。如果軟件能夠自動啟動缺省的中文輸入法,那麼將會給編程人員帶來很大的方便。下面的類便能實現這一功能,具體的設計步驟如下: ---- 1.創建一個新類,其基類是"TextBox",類名為"中文TextBox",存儲於"myclass"類庫中。 ---- 2.進入類設計器後,設置"中文TextBox"的各項屬性,如字體、顏色等。 ---- 3.設計GotFocus事件,代碼為: =IMESTATUS(1) 表示當光標移到此框後,自動啟動中文輸入法。 ---- 4.設計LostFocus事件,代碼為: =IMESTATUS(0) 表示當光標移開此框後,自動關閉中文輸入法。設計好後,保存到文件即可。 ---- 七.立體框類的設計方法 ---- 在VFP的標準類裡提供了一個形狀控制類(Shape),可以簡單地將S hape的"SpecialEf fect"屬性設置為"0-3D",將"BackStyle"屬性設為 "0-透明",來設計三維立體框。 ---- 然而這樣的三維立體框太單調,缺少變化。通過以下的設計方法, 我們可以作出類似於VB中的Three_D Panel那樣的效果。具體設計步驟如下: ---- 1.新建一個類,基類是"Container",類名為"Three_Panel",存儲於"myclass"類庫中。 ---- 2.進入類設計器後,設置"Three_ panel"的各項屬性,如表1所示。屬性設計完畢後,存入文件,就可以得到凸起效果的邊框類。 ---- 3.通過調整"SpecialEffect"的值為"1-凹下",可以設計凹下效果的邊框類(three_p anel_ao)。 調整其餘參數可以得到不同效果的邊框。 ---- 八.在程序中播放動畫 ---- 我們知道,VFP只支持靜止的圖片,無法直接播放GIF動畫。但網上許多有趣而華麗的GIF動畫的確令人心動,如何將這些動畫插入到你的VFP程序中,讓你的程序更吸引人呢? ---- 其實很簡單,將GIF動畫分解成各單獨的靜止的GIF或BMP圖片,然後在VFP使用計時器讓這些靜止的圖片輪流出現,就產生動畫效果了。 ---- 將GIF動畫分解為靜止圖片的軟件有很多,在網上很容易找到,如Animagic GIF 等。分解出來的圖片我們分別以a0.bmp、a1.bmp……這樣的形式保存。在表單中添加計時器TIMER1,TIMER1的Interval屬性設為100,Enabled屬性設為.T.,再添加Image1控件,其Backstyle屬性設為0(透明),Stretch也設為0(裁剪)。 ---- 在FORM的LOAD過程中寫代碼: Public I , N I=0 N=5(靜止圖片的總共數目) 在TIMER1的TIMER過程中寫代碼: Local j i = mod (i+1,n) j = alltrim( str(i) ) thisform.image1.picture="a"-j-".bmp" 運行表單,我們就可以看到熟悉的GIF動畫了。 ---- 九.粘貼VFP頂層表單 ---- 當你將表單設置為頂層表單並獨立運行於Windows下,就會發現表單中複製粘貼功能失效,給實際工作造成極大的不便,從而使編製的軟件達不到專業水準。通過認真分析與實踐,筆者認為,造成這一問題的原因是微軟設計VFP時,只考慮了位於系統選單下的表單的複製和粘貼情況,即位於系統選單下的表單可使用複製及粘貼熱鍵,而處於Windows下的表單完全脫離了系統選單的控制,因此複製及粘貼熱鍵失效。 ---- 解決的辦法是可在表單的控件(本文舉例為文本框)中,為KeyPress Event編寫如下事件處理程序,該事件處理程序首先將選擇內容複製到Windows剪貼板上,然後再將剪貼板上的內容添加到控件中。 KeyPress Event LPARAMETERS nKeyCode, nShiftAltCtrl if nkeycode=3 && CTRL+C 複製 -cliptext=this.seltext endif if nkeycode=22 && CTRL+V 粘貼 do case case this.selstart=0 this.value=-cliptext+this.value case this.selstart〉=1 and this.selstart〈=len(this.value) this.value=subs(this.value,1,this.selstart)+ -cliptext+subs(this.value,this.selstart+1) endcase endif thisform.grid1.column1.setfocus() sele recetem if not eof() skip endif thisform.refresh ---- 十.為VFP添加循環微調控件類 ---- 在VFP編程中,微調控件是最常用的控件之一。按照微調控件提供的基本功能,通過單擊向上或向下箭頭,而達到微調控件的最大或最小值時,如繼續單擊向上或向下箭頭,將保持最大或最小值不變。筆者通過對Spinner控件屬性和事件的分析,用編程的方法實現了循環微調控件功能。 ---- 循環微調控件(CycleSpinner)所實現的功能是:當單擊向上箭頭而達到最大值時,再單擊向上箭頭,能自動跳到最小值;當單擊向下箭頭而達到最小值時,能自動跳到最大值;其餘功能均繼承Spinner基類的功能。具體實現方法如下:利用表單控件,在表單中設計一個微調按鈕,並設置如下屬性: SpinnerHighValue=Max &&Max應小於Spinner基類所 &&提供的最大默認值 SpinnerLowValue=Min &&Min應大於Spinner基類所 &&提供的最小默認值 Value=1 Name='CycleSpinner' 在Init事件中寫入如下代碼: This.SpinnerHighValue=This. SpinnerHighValue+This.Increment This.SpinnerLowValue=This. SpinnerLowValue-This.Increment 在InteractiveChange事件中寫入如下代碼: If This.Value=This.SpinnerHighValue This.Value=Int(This. SpinnerLowValue+This.Increment) Endif If This.Value=This.SpinnerLowhValue This.Value=Int(This. SpinnerHighValue-This.Increment) Endif Thisform.Refresh ---- 再將其作為類保存起來,添加到你的類庫中。 ---- 若你在編程中,需用此功能,就可直接用此循環微調控件類了。 |
| webasp.net |