VFP 6.0的十個(gè)實(shí)用技巧
出處:網(wǎng)絡(luò) 一.選擇網(wǎng)絡(luò)打印機(jī) 筆者單位里的局域網(wǎng)上安裝有多臺(tái)網(wǎng)絡(luò)打印機(jī),在使用VFP 6.0編制的程序進(jìn)行打印操作時(shí),是否可以選擇其中的某一臺(tái)空閑的網(wǎng)絡(luò)打印機(jī)進(jìn)行打印,而不一定非要從默認(rèn)打印機(jī)輸出,從而提高工作效率呢?經(jīng)筆者研究,在執(zhí)行命令:Report From … To Printer 之前,先執(zhí)行下列程序代碼:Set Printer To Name Getprinter(),就可以調(diào)用操作系統(tǒng)的"打印設(shè)定"對(duì)話(huà)框,用戶(hù)利用該窗口即可達(dá)到靈活選擇空閑打印機(jī)進(jìn)行打印輸出的功能。(注:可供選擇的打印機(jī)名是用戶(hù)計(jì)算機(jī)上已安裝好的打印機(jī)名。) 二.恢復(fù)丟失了的FPT文件
由于誤操作,將自由表的備注文件刪除,致使自由表無(wú)法打開(kāi)。遇到這種情況我們可采用下述方法解決: 1.創(chuàng)建一個(gè)新的自由表,且該自由表只含一個(gè)字段,其類(lèi)型為備注型。關(guān)閉該自由表,將其擴(kuò)展名為FPT的備注文件復(fù)制給誤刪除的自由表的備注文件,或?qū)⒃搨渥⑽募拿麨檎`刪除的自由表的備注文件即可。運(yùn)行下面的程序同樣也可以恢復(fù)丟失了的FPT 文件: accept '請(qǐng)輸入丟失了.FPT 文件的自由表名稱(chēng)(不帶擴(kuò)展名):' to namef
namef=trim(namef)+'.bbb'
crea dbf &namef (aa m)
use
dele file &namef
2.用VFP低級(jí)文件函數(shù)創(chuàng)建一個(gè)空的FPT文件,原自由表即可打開(kāi)。程序清單如下: accept '請(qǐng)輸入丟失了.FPT 文件的自由表名稱(chēng)(不帶擴(kuò)展名):' 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文件的自由表建立了一個(gè)新的FPT文件,原FPT文件中的內(nèi)容已經(jīng)丟失,無(wú)法恢復(fù)。在實(shí)際操作中若遇到這種情況,最好是恢復(fù)原來(lái)的FPT文件,若原FPT文件無(wú)法恢復(fù)時(shí)再采用上述方法。
三.脫離VFP運(yùn)行程序
利用VFP 6.0創(chuàng)建的應(yīng)用程序,被編譯成可執(zhí)行程序后,若要使其脫離VFP環(huán)境獨(dú)立運(yùn)行,除了我們所知道的在應(yīng)用程序目錄中需包含一個(gè)名為"CONFIG.FPW"的配置文件外,經(jīng)筆者試驗(yàn)發(fā)現(xiàn)還必須包含"VFP6R.DLL"、"VFP6RCHS.DLL"、"VFP6RENU.DLL"這三個(gè)動(dòng)態(tài)鏈接庫(kù)文件。這三個(gè)文件在"Windows\System"目錄下,用戶(hù)可直接將其復(fù)制到自己的應(yīng)用程序目錄中。最后再經(jīng)過(guò)編譯形成可執(zhí)行程序,運(yùn)行安裝向?qū)?chuàng)建發(fā)布磁盤(pán),我們開(kāi)發(fā)的小應(yīng)用程序就可以堂堂正正地在Win 98下安裝運(yùn)行了。 四.低級(jí)文件函數(shù)加密數(shù)據(jù)庫(kù) VFP有一個(gè)十分薄弱的環(huán)節(jié)就是數(shù)據(jù)庫(kù)的保密性差。由于.DBF文件都是敞開(kāi)式的,甚至用DOS中最簡(jiǎn)單的TYPE命令都可以瀏覽,因此,筆者從以下兩方面對(duì)數(shù)據(jù)進(jìn)行加密:
1.在向自由表中增加數(shù)據(jù)時(shí),就進(jìn)行加密,即更新自由表時(shí)就對(duì)數(shù)據(jù)進(jìn)行加密,在讀取數(shù)據(jù)時(shí)再解密。
2.用VFP提供的低級(jí)文件函數(shù)進(jìn)行加密,加密后的文件無(wú)法打開(kāi)、瀏覽,使用時(shí),再執(zhí)行該加密程序即可將加密的自由表還原。 **加密數(shù)據(jù)庫(kù)程序(同時(shí)也是解密程序)** set talk off
close all
clea
@10,10 say "請(qǐng)輸入要加密的
自由表名(含擴(kuò)展名):" get file1 defa ' '
read
handle=fopen("&file1",2)
if handle< 0
@14,10 say "不能打開(kāi)文件!"
=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
五.簡(jiǎn)易設(shè)置TextBox對(duì)象的輸入長(zhǎng)度 在以前的Xbase語(yǔ)法中,我們可以通過(guò)Picture參數(shù)定義某變量或文本欄的輸入長(zhǎng)度格式,而在VFP中的TextBox對(duì)象中則支持了Format和InputMask屬性來(lái)定義輸入的格式。我們可以使用比較原始的方法來(lái)進(jìn)行設(shè)定,比如當(dāng)要求輸入有20個(gè)欄位的文本框?qū)ο髸r(shí),我們可以在此對(duì)象的InputMask屬性中定義為InputMask="XXXXXXXXXXXXXXXXXXXX"。
但是這樣的設(shè)定方法非常麻煩,尤其是當(dāng)面對(duì)更長(zhǎng)的字符串輸入時(shí)更是不方便。其實(shí)我們完全可以用另外一種方法來(lái)把這樣的需求設(shè)計(jì)過(guò)程變得很簡(jiǎn)單,下面就具體介紹一下這種簡(jiǎn)易的快速設(shè)定輸入欄位的方法。 利用Replicate()函數(shù)設(shè)定輸入長(zhǎng)度這里我們同樣利用了對(duì)象的InputMask屬性來(lái)定義輸入格式和輸入長(zhǎng)度,但是當(dāng)對(duì)象的輸入比較長(zhǎng)時(shí),則可以借助算術(shù)表達(dá)式的方式來(lái)對(duì)其進(jìn)行設(shè)定。通過(guò)屬性窗口中的InputMask屬性建立表達(dá)式對(duì)話(huà)框,我們可以利用Replicate()函數(shù)設(shè)定重復(fù)的"X"的個(gè)數(shù)即可(本例為20)。完成后回到屬性設(shè)置窗口,我們可以看到在InputMask屬性欄中出現(xiàn)了"=Replicate(20)"位值的表達(dá)式,這樣,我們就輕松地完成了長(zhǎng)字符輸入的長(zhǎng)度控制。由此我們也可以體會(huì)到善于使用表達(dá)式給我們帶來(lái)的方便之處。 六.中文文本框的設(shè)計(jì)方法
在程序開(kāi)發(fā)過(guò)程中,我們經(jīng)常要設(shè)計(jì)一些文本框,而且這些文本框要求只能輸入中文。在這種情況下,通常需手工啟動(dòng)某一種中文輸入法。如果軟件能夠自動(dòng)啟動(dòng)缺省的中文輸入法,那么將會(huì)給編程人員帶來(lái)很大的方便。下面的類(lèi)便能實(shí)現(xiàn)這一功能,具體的設(shè)計(jì)步驟如下:
1.創(chuàng)建一個(gè)新類(lèi),其基類(lèi)是"TextBox",類(lèi)名為"中文TextBox",存儲(chǔ)于"myclass"類(lèi)庫(kù)中。
2.進(jìn)入類(lèi)設(shè)計(jì)器后,設(shè)置"中文TextBox"的各項(xiàng)屬性,如字體、顏色等。 3.設(shè)計(jì)GotFocus事件,代碼為: =IMESTATUS(1) 表示當(dāng)光標(biāo)移到此框后,自動(dòng)啟動(dòng)中文輸入法。 4.設(shè)計(jì)LostFocus事件,代碼為: =IMESTATUS(0) 表示當(dāng)光標(biāo)移開(kāi)此框后,自動(dòng)關(guān)閉中文輸入法。設(shè)計(jì)好后,保存到文件即可。 七.立體框類(lèi)的設(shè)計(jì)方法 在VFP的標(biāo)準(zhǔn)類(lèi)里提供了一個(gè)形狀控制類(lèi)(Shape),可以簡(jiǎn)單地將S hape的"SpecialEf fect"屬性設(shè)置為"0-3D",將"BackStyle"屬性設(shè)為 "0-透明",來(lái)設(shè)計(jì)三維立體框。 然而這樣的三維立體框太單調(diào),缺少變化。通過(guò)以下的設(shè)計(jì)方法, 我們可以作出類(lèi)似于VB中的Three_D Panel那樣的效果。具體設(shè)計(jì)步驟如下: 1.新建一個(gè)類(lèi),基類(lèi)是"Container",類(lèi)名為"Three_Panel",存儲(chǔ)于"myclass"類(lèi)庫(kù)中。 2.進(jìn)入類(lèi)設(shè)計(jì)器后,設(shè)置"Three_ panel"的各項(xiàng)屬性,如表1所示。屬性設(shè)計(jì)完畢后,存入文件,就可以得到凸起效果的邊框類(lèi)。 3.通過(guò)調(diào)整"SpecialEffect"的值為"1-凹下",可以設(shè)計(jì)凹下效果的邊框類(lèi)(three_p anel_ao)。 調(diào)整其余參數(shù)可以得到不同效果的邊框。 八.在程序中播放動(dòng)畫(huà) 我們知道,VFP只支持靜止的圖片,無(wú)法直接播放GIF動(dòng)畫(huà)。但網(wǎng)上許多有趣而華麗的GIF動(dòng)畫(huà)的確令人心動(dòng),如何將這些動(dòng)畫(huà)插入到你的VFP程序中,讓你的程序更吸引人呢?
其實(shí)很簡(jiǎn)單,將GIF動(dòng)畫(huà)分解成各單獨(dú)的靜止的GIF或BMP圖片,然后在VFP使用計(jì)時(shí)器讓這些靜止的圖片輪流出現(xiàn),就產(chǎn)生動(dòng)畫(huà)效果了。
將GIF動(dòng)畫(huà)分解為靜止圖片的軟件有很多,在網(wǎng)上很容易找到,如Animagic GIF 等。分解出來(lái)的圖片我們分別以a0.bmp、a1.bmp……這樣的形式保存。在表單中添加計(jì)時(shí)器TIMER1,TIMER1的Interval屬性設(shè)為100,Enabled屬性設(shè)為.T.,再添加Image1控件,其Backstyle屬性設(shè)為0(透明),Stretch也設(shè)為0(裁剪)。 在FORM的LOAD過(guò)程中寫(xiě)代碼:
Public I , N I=0
N=5(靜止圖片的總共數(shù)目)
在TIMER1的TIMER過(guò)程中寫(xiě)代碼:
Local j
i = mod (i+1,n)
j = alltrim( str(i) )
thisform.image1.picture="a"-j-".bmp"
運(yùn)行表單,我們就可以看到熟悉的GIF動(dòng)畫(huà)了。
九.粘貼VFP頂層表單 當(dāng)你將表單設(shè)置為頂層表單并獨(dú)立運(yùn)行于Windows下,就會(huì)發(fā)現(xiàn)表單中復(fù)制粘貼功能失效,給實(shí)際工作造成極大的不便,從而使編制的軟件達(dá)不到專(zhuān)業(yè)水準(zhǔn)。通過(guò)認(rèn)真分析與實(shí)踐,筆者認(rèn)為,造成這一問(wèn)題的原因是微軟設(shè)計(jì)VFP時(shí),只考慮了位于系統(tǒng)選單下的表單的復(fù)制和粘貼情況,即位于系統(tǒng)選單下的表單可使用復(fù)制及粘貼熱鍵,而處于Windows下的表單完全脫離了系統(tǒng)選單的控制,因此復(fù)制及粘貼熱鍵失效。
解決的辦法是可在表單的控件(本文舉例為文本框)中,為KeyPress
Event編寫(xiě)如下事件處理程序,該事件處理程序首先將選擇內(nèi)容復(fù)制到Windows剪貼板上,然后再將剪貼板上的內(nèi)容添加到控件中。 KeyPress Event LPARAMETERS nKeyCode, nShiftAltCtrl
if nkeycode=3
&& CTRL+C 復(fù)制
-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添加循環(huán)微調(diào)控件類(lèi) 在VFP編程中,微調(diào)控件是最常用的控件之一。按照微調(diào)控件提供的基本功能,通過(guò)單擊向上或向下箭頭,而達(dá)到微調(diào)控件的最大或最小值時(shí),如繼續(xù)單擊向上或向下箭頭,將保持最大或最小值不變。筆者通過(guò)對(duì)Spinner控件屬性和事件的分析,用編程的方法實(shí)現(xiàn)了循環(huán)微調(diào)控件功能。
循環(huán)微調(diào)控件(CycleSpinner)所實(shí)現(xiàn)的功能是:當(dāng)單擊向上箭頭而達(dá)到最大值時(shí),再單擊向上箭頭,能自動(dòng)跳到最小值;當(dāng)單擊向下箭頭而達(dá)到最小值時(shí),能自動(dòng)跳到最大值;其余功能均繼承Spinner基類(lèi)的功能。具體實(shí)現(xiàn)方法如下:利用表單控件,在表單中設(shè)計(jì)一個(gè)微調(diào)按鈕,并設(shè)置如下屬性: SpinnerHighValue=Max
&&Max應(yīng)小于Spinner基類(lèi)所
&&提供的最大默認(rèn)值
SpinnerLowValue=Min
&&Min應(yīng)大于Spinner基類(lèi)所
&&提供的最小默認(rèn)值
Value=1
Name='CycleSpinner'
在Init事件中寫(xiě)入如下代碼:
This.SpinnerHighValue=This.
SpinnerHighValue+This.Increment
This.SpinnerLowValue=This.
SpinnerLowValue-This.Increment
在InteractiveChange事件中寫(xiě)入如下代碼:
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
再將其作為類(lèi)保存起來(lái),添加到你的類(lèi)庫(kù)中。 若你在編程中,需用此功能,就可直接用此循環(huán)微調(diào)控件類(lèi)了。 本文來(lái)自編程入門(mén)網(wǎng):http://www./vfpwz/jyhz/hz9.htm |
|