---- 數(shù)據(jù)庫(kù)管理系統(tǒng)是目前在企事業(yè)、 商業(yè)單位中應(yīng)用最廣泛的一類軟件, 在國(guó)內(nèi)以 VFP最具代表性。 這里把筆者及同行在工作中所得到的一點(diǎn)經(jīng)驗(yàn)進(jìn)行了整理,希望能對(duì)大家有所幫助。 一.INSERT命令與APPEND命令 ---- 這兩個(gè)命令的基本作用都是往一個(gè)已經(jīng)打開的數(shù)據(jù)庫(kù)中添加新的記錄,不同點(diǎn)在于: INSERT命令可以在數(shù)據(jù)庫(kù)的任意位置插入新的記錄,而APPEND命令只能在數(shù)據(jù)庫(kù)的尾部添加新的記錄。本人在編程中,有一次為了保證一個(gè)數(shù)據(jù)庫(kù)記錄的順序按一定的要求排列,從而使用了INSERT命令在指定的位置插入新的記錄。然而在程序運(yùn)行過程中,卻發(fā)現(xiàn)新的記錄總是被添加在數(shù)據(jù)庫(kù)的尾部。經(jīng)過一番對(duì)程序的仔細(xì)檢查,本人想起為了實(shí)現(xiàn)對(duì)數(shù)據(jù)記錄的快速檢索,曾為該數(shù)據(jù)庫(kù)建立了一個(gè)結(jié)構(gòu)復(fù)合索引文件,此索引文件總是隨著該數(shù)據(jù)庫(kù)的打開而自動(dòng)打開,而在使用數(shù)據(jù)庫(kù)文件時(shí),如果與其相聯(lián)的索引文件同時(shí)打開了,則INSERT命令與APPEND命令的作用是相同的。解決的辦法是:在使用該數(shù)據(jù)庫(kù)時(shí),如果不苛求數(shù)據(jù)庫(kù)記錄的物理順序的話,可以用SET ORDER TO〈索引名〉來(lái)控制數(shù)據(jù)庫(kù)記錄的邏輯順序。否則,可以用SORT命令對(duì)其進(jìn)行物理位置排序。當(dāng)然,后者的情況比較少見,且費(fèi)時(shí)費(fèi)力。 二.實(shí)現(xiàn)組合框的記憶選擇 ---- 在編制管理系統(tǒng)時(shí),往往一個(gè)相同的系統(tǒng)要由好幾個(gè)部門使用,這樣,在進(jìn)入系統(tǒng)時(shí),就要選擇不同部門的名稱。作為一個(gè)使用者,我們希望選擇第一次,以后每次進(jìn)入就不用再選擇。以下方法將實(shí)現(xiàn)此功能。 ---- 新建一個(gè)表單,在上面創(chuàng)建一個(gè)“組合框”對(duì)象,對(duì)表單做如下設(shè)置: INIT EVENT: set safety off public z if .not.file(′mv.mem′) z=1 else restore from mv additive endif thisform.combo1.additem('第一個(gè)單位') … thisform.combo1.additem('第二個(gè)單位') thisform.combo1.listindex=z DESTROY EVENT: z=thisform.combo1.listindex save to mv all like z 三.聲音的播放 ---- 在程序的編制過程中, 適當(dāng)?shù)厥褂寐曇簦蛇_(dá)到意想不到的效果,下面是在VFP中加入聲音的幾種方法: ---- 1. 使用set bell to 命令 ---- 用set bell to 命令可以直接播放聲音,此方法主要適用于給按鈕加上聲音效果,比如有一個(gè)“開始”按鈕,要在按下它時(shí)能發(fā)聲,可在其CLICK EVENT中加入如下代碼: wav_name='sound.wav” set bell to wav_name,0 chr(7) 其中sound.wav為要播放的聲音文件。 ---- 2. 調(diào)用mplayer2.exe來(lái)播放 ---- Mplayer2.exe是Windows自帶的媒體播放器,在VFP中,可使用如下命令來(lái)播放聲音文件: Run /n7 c:\progra~1\micros~2\mplayer2.exe'sound.wav' ---- 若想在啟動(dòng)時(shí)播放聲音,可將該語(yǔ)句放入表單的init事件中。這種方法適宜于用來(lái)播放背景音樂,其缺點(diǎn)是播放時(shí),Windows工具欄上有一個(gè)最小化后的媒體播放器。 ---- 3. 使用OLE控件在表單中添加一個(gè)OLE對(duì)象可按如下順序: ---- ① 新建一個(gè)表單,選中表單控件工具欄的OLEcontrol; ---- ②在表單上按下鼠標(biāo)左鍵, 建立OLE對(duì)象,在出現(xiàn)的對(duì)話框中選擇聲音對(duì)象,選擇以“create form file”方式插入; ---- ③選擇要插入的聲音文件,確定退出; ---- ④用Doverb方法來(lái)執(zhí)行,其中Doverb(0)用來(lái)播放,Doverb(1)用來(lái)編輯。例如要在表單啟動(dòng)時(shí)同時(shí)啟動(dòng)聲音,可在表單的init事件中加入如下語(yǔ)句: thisform.olecontrol1.doverb(0) ---- 4. 使用Microsoft Media Player控件 ---- 在一個(gè)表單中加入聲音的順序如下: ---- ①在VFP中,選擇“工具”選單的“選項(xiàng)”; ---- ②在出現(xiàn)的界面中選擇“控件” , 選中“ActiveX控件” ,在選定對(duì)話框中選擇 “Microsoft media player”,確定退出該界面; ---- ③在工具欄中選擇“ActiveX控件” ,選中“Microsoft media player”控件,在表單上單擊鼠標(biāo)左鍵,這樣就創(chuàng)建了“Microsoft media player”對(duì)象; ---- ④以下語(yǔ)句可實(shí)現(xiàn)聲音的播放: thisform.olecontrol1.open(″sound.wav″) playcount 可用來(lái)控制播放的次數(shù); ---- 如想實(shí)現(xiàn)重復(fù)播放,可在EndOf Stream Event中加入語(yǔ)句:this.play。 ---- 這種方法也可以用來(lái)播放.avi、.mpeg等文件,只需把上面的“sound.wav”文件改為相應(yīng)類型的文件即可。 ---- 5. 使用MCI ---- MCI(media control interface: 媒體控制接口)是多媒體設(shè)備和文件的標(biāo)準(zhǔn)接口。多媒體應(yīng)用程序可以利用MCI控制各種各樣的多媒體設(shè)備和文件。 ---- 下面通過一個(gè)例子說(shuō)明如何用MCI實(shí)現(xiàn)對(duì)音頻的控制: ---- ①建立一個(gè)表單Form1,對(duì)表單作如下設(shè)置: Form1.load: &&聲明MCISendString命令。 Form1.Destroy: DECLARE LONG mciSendString IN C:\WINDOWS\SYSTEM\WINMM.DLL STRING sCom,STRING sReturnString,LONG lReturnLength,LONG lpWnd DECLARE LONG mciExecute IN C:\WINDOWS\SYSTEM\ WINMM.DLL STRING sCommand Form1.Destory: Clear dlls &&清除聲明的dll函數(shù); ---- ②新建四個(gè)按扭,其caption值分別為:“打開”,“播放”,“停止”,“關(guān)閉”,分別在各按扭的click事件中加入以下代碼: thisform.open.click: mciexecute('open c:\mywave\toolbird.wav alias cc') thiform.play.click: buffer=space(100) =mcisendstring('play cc',@buffer,80,0) thisform.stop.click: buffer=space(100) =mcisendstring('stop cc',@buffer,80,0) thisform.close.click: buffer=space(100) =mciSendString('close cc',@Buffer,80,0) 四.工具條的制作 ---- 工具條在Windows應(yīng)用系統(tǒng)中使用很廣泛,在VFP中也使用了很多工具條,如常用工具欄、表單控件、報(bào)表控件等。在VFP應(yīng)用系統(tǒng)中有兩種實(shí)現(xiàn)工具條使用的方法。其一,如果你不脫離VFP系統(tǒng)環(huán)境(應(yīng)用程序擴(kuò)展名為APP) ,可通過定制工具欄或“object. show” 指令,來(lái)使用VFP系統(tǒng)提供的各種工具欄。其二,當(dāng)你把應(yīng)用程序編譯成可執(zhí)行程序(EXE) 后,上述方法和命令會(huì)失效,因此需要通過程序來(lái)實(shí)現(xiàn)工具條的使用。下面是本人制作和顯示一常用工具欄的過程。 ---- (一)、 建立類庫(kù) 使用類設(shè)計(jì)器或“Create class'命令創(chuàng)建一個(gè)新類。設(shè)置類名為“常用工具欄”,派生于“Toolbar”,取類庫(kù)名為Appclass。 從表單控件工具欄添加各命令按鈕到程序窗口,中間可用分隔符按鈕分開。 設(shè)置各命令按鈕相應(yīng)的Picture(圖形)及ToolTipText(提示)屬性。 設(shè)置各命令按鈕被觸發(fā)的事件程序: [新建]Click Event: create [打開] Click Event: use getfile('dbf') [保存] Click Event: 略 [打印] Click Event: 略 [打印預(yù)覽] Click Event: 略 [剪切] Click Event: sys(1500,'—med—cut','—medit') [復(fù)制] Click Event: sys(1500,'—med—copy','—medit') [粘貼] Click Event: sys(1500,'—med—paste','—medit') [撤消[Click Event: sys(1500,'—med—undo','—medit') [重做] Click Event: sys(1500,'—med—redo','—medit') [幫助] Click Event: sys(1500,'—mst—help','—msystem') ---- (二)、 顯示工具條 ---- 在主程序或選單常規(guī)選項(xiàng)內(nèi)添加如下程序: set classlib to appclass toolbars = CREATEOBJECT(′appclass.常用工具欄′) toolbars.show toolbars.dock(0) ---- 在應(yīng)用中有時(shí)為了使窗口顯示更多的內(nèi)容,需關(guān)閉或隱藏工具欄,這時(shí)可通過指令 [Object.Show]、[Object.hide]來(lái)顯示和隱藏(可在選單欄通過程序控制)。同時(shí)工具欄可以浮動(dòng)在窗口中,也可以停放在應(yīng)用系統(tǒng)主窗口的上部、下部或兩邊。停放工具欄位置命令是:ToolBar.Dock[nLocation[,X,Y]]。根據(jù)nLocation參數(shù)確定工具欄位置,其中[- 1]為不停放工具欄(浮動(dòng));[0]在主窗口的頂部停放工具欄;[1]在主窗口的左邊停放工具欄;[2]在主窗口的右邊停放工具欄;[3]在主窗口的底部停放工具欄;X, Y指定工具欄停放位置的水平坐標(biāo)和垂直坐標(biāo)。 ---- 設(shè)計(jì)圖如圖所示(供參考)。(見T01.jpg) 五.“飛播字幕”的制作 創(chuàng)建一個(gè)新類, 名稱為FlyString,選擇派生于容器類(container),并存放于FlyString.vcx文件中。 將FlyString的大小調(diào)整為120×20大小,并設(shè)置SpecialEffect屬性為“凹下”。 新建屬性cOldFlyText, 其初始值為空,此屬性主要用于定時(shí)器的Timer事件,用戶不需設(shè)置,也不用改動(dòng),在過程中會(huì)自動(dòng)填入。 新建屬性cFlyTexy, 其初始值為空,也可輸入一些初始化信息,比如:“歡迎您使用本程序”,則當(dāng)建立一新對(duì)象后,默認(rèn)的將是此信息,使用者可將其改為所要顯示的具體信息。 新建屬性nCurPos,其初始值為1,用于指示當(dāng)前顯示到第幾個(gè)字符。 在FlyString上放置一個(gè)定時(shí)器控制Timer1, 將其屬性Interval設(shè)置為700,以取得較好的顯示結(jié)果,如果其值太小,則顯示過快,用戶可根據(jù)需要自行設(shè)置。 在Timer1的過程Timer中添加代碼(代碼在可視對(duì)象內(nèi)的右側(cè))。 ---- 這個(gè)控制的效果是讓字幕從左向右飛行,從右向左飛行的原理與此類似,讀者可參考自行編制。 六.巧用Grid對(duì)象 ---- 我們?cè)谟肰FP設(shè)計(jì)一個(gè)應(yīng)用系統(tǒng)時(shí), 信息的瀏覽是其中相當(dāng)重要的一個(gè)功能,通常其實(shí)現(xiàn)方法均采用Grid對(duì)象來(lái)顯示數(shù)據(jù)信息。但在使用過程中也存在一些不足,就是當(dāng)使用者在記錄之間移動(dòng)時(shí),只有獲得焦點(diǎn)的那條記錄的某一字段以不同于Grid背景的顏色顯示,給人一種非專業(yè)的軟件制作的感覺,如果不用Grid對(duì)象,就需要編制復(fù)雜的過程去實(shí)現(xiàn)這一功能。 ---- 其實(shí),利用Grid對(duì)象,我們完全可以實(shí)現(xiàn)當(dāng)數(shù)據(jù)記錄移動(dòng)時(shí),整條記錄均用同一種顏色突出顯示,即當(dāng)數(shù)據(jù)記錄移動(dòng)時(shí),用顏色動(dòng)態(tài)變化顯示相對(duì)光標(biāo)所在的位置。筆者在工作就成功地運(yùn)用了這一方法,從而使整個(gè)系統(tǒng)的信息瀏覽功能大為增色,顯示了與專業(yè)軟件同樣的魅力。 ---- 首先定義一個(gè)Grid對(duì)象, 并設(shè)置好其屬性,然后在其AfterRowColChange事件過程中寫下如下的內(nèi)容: LPARAMETERS nColIndex this.setall(″dynamicbackcolor″,″ iif(this.activerow〈〉recn(),rgb(255, 255,255),rgb(0,0,255))″,″column″) ---- 這樣一來(lái), 就能達(dá)到在數(shù)據(jù)記錄移動(dòng)時(shí),在相對(duì)的Row顯示動(dòng)態(tài)顏色變化。在上面的設(shè)計(jì)中首先使用了SetAll() 方法設(shè)定Grid中的Column層次的 DynamicBackColor(動(dòng)態(tài)背景顏色屬性),然后在第二個(gè)參數(shù)中使用了Grid 對(duì)象的ActiveRow反映相對(duì)的行數(shù),若不等于記錄編號(hào)時(shí),則通過 RGB(255,255,255) 送出白色背景,若相對(duì)行等于記錄編號(hào)時(shí),則通過 RGB(0,0,255)送出綠色背景色(讀者可根據(jù)個(gè)人愛好自行設(shè)定)。 ---- 另外,還要提醒讀者有兩點(diǎn)需要特別注意: 在AfterRowColChange事件過程中一定要使用DynamicBackColor屬性, 而不能用 BackColor屬性,因?yàn)檫@樣會(huì)將所有的數(shù)據(jù)記錄變?yōu)樵O(shè)定的顏色。 因?yàn)槭褂昧薃ctiveRow屬性與RECN0()函數(shù)配合使用,因此請(qǐng)不要在所顯示的記錄中設(shè)定主索引,因?yàn)锳ctiveRow屬性不會(huì)自動(dòng)配合索引值中的記錄編號(hào)(若設(shè)定主索引,則執(zhí)行之后將從當(dāng)前記錄開始直至第一條記錄均為設(shè)定的特顯顏色)。 七.改進(jìn)VFP的searchclass.vcx ---- 我們都知道利用VFP提供的WIZARDS類庫(kù)中的searchform.vcx和searchclass.vcx可 以創(chuàng)建一個(gè)通用查詢表單。這個(gè)查詢非常通用,操作界面也非常簡(jiǎn)單明了。但是,此表單有一個(gè)缺憾,就是此表單的字段對(duì)話框就只能顯示字段名,如果數(shù)據(jù)表的字段名為英文時(shí),顯示的字段名對(duì)操作人員而言就顯的不夠清楚。我們一般在設(shè)計(jì)數(shù)據(jù)庫(kù)時(shí)給每個(gè)字段加以中文標(biāo)題,用于對(duì)字段名的詳細(xì)說(shuō)明,就像用BROW命令時(shí),就可以用字段標(biāo)題代替字段名一樣, 我們也可以通過對(duì)searchclass.vcx的修改使其用字段標(biāo)題代替字段名顯示,這樣就使得整個(gè)界面非常友好。 ---- 打開WIZARDS類庫(kù),選擇searchclass.vcx。 ---- (一)、修改cbofield1的init事件 ---- 在下列語(yǔ)句 FOR m.i = FCOUNT() TO 1 STEP -1 IF INLIST(aWizFList[m.i,2],'G','M','U') &&Memo field =ADEL(aWizFList,m.i) DIMENSION aWizFList[MAX(1,ALEN (aWizFList,1)-1),NUM_AFIELDS] ENDIF ENDFOR 后加上以下程序段: *獲取當(dāng)前的數(shù)據(jù)表名 tname=alias() *獲取數(shù)據(jù)庫(kù)名 dname=cursorgetprop('database') set database to (dname) *獲取字段標(biāo)題 for m.i=1 to alen(awizflist,1) fname=tname+′.′+awizflist[m.i,1] *將字段名保存 awizflist[m.i,16]=awizflist[m.i,1] if !empty(dname) fcaption=dbgetprop(fname,′field′,′caption′) *用字段標(biāo)題代替字段名 awizflist[m.i,1]=iif(!empty (fcaption),fcaption,awizflist[m.i,1]) endif endfor THIS.RowSourceType = 5 THIS.RowSource = 'aWizFList' THIS.VALUE = THIS.LIST[1,1] 將原最后一句THIS.VALUE=THIS.LIST[1]刪除 ---- (二)、修改cbofield2的init 事件 THIS.RowSourceType = 5 THIS.RowSource = 'aWizFList' THIS.VALUE = THIS.LIST[1,1] ---- (三)、修改searchitem方法程序 ---- 在語(yǔ)句m.cFldName = ALLTRIM(m.oField.Value)后加上以下程序段: *查找對(duì)應(yīng)顯示標(biāo)題的字段名 for m.i=1 to alen(aWizflist,1) if m.cfldname=alltrim(aWizflist[m.i,1]) *用字段名代替字段標(biāo)題 m.cfldname=alltrim(aWizflist[m.i,16]) endif endfor ---- 這樣通過對(duì)以上二個(gè)字段組合框的init事件和searchclass方法程序的修改就可以完成在字段組合框顯示字段標(biāo)題,而非字段名,只要我們?cè)跀?shù)據(jù)表中設(shè)置好每個(gè)字段的標(biāo)題, 就可以在字段組合框中顯示運(yùn)用。其實(shí)WIZARDS類庫(kù)中類都可根據(jù)我們的實(shí)際需要進(jìn)行改進(jìn),在程序中直接引用,這樣就減少了我們重新設(shè)計(jì)類的麻煩。 八.制作影視字幕 ---- 在影視劇中,我們經(jīng)常見到這樣的字幕效果:在黑色的背景畫面下,紅色(或白色)文字漸漸顯現(xiàn)出來(lái),然后又漸漸消失在背景中。要實(shí)現(xiàn)這個(gè)效果并不難,今天我們就用中文版Visual FoxPro 3.0的表單來(lái)模仿一下這個(gè)文字漸入漸出的動(dòng)畫過程。 ---- (一)、添加控件,制作表單 ---- 1.在新建的空白表單中添加一個(gè)“標(biāo)簽”控件并選中它,然后在其對(duì)應(yīng)的“屬性” 窗口中依次進(jìn)行如下設(shè)置: AutoSize .T. BackStyle 透明 Caption 漸入漸出效果演示 FontBold .T. FontName 幼圓 FontSize 18 FontUnderline .T. ForeColor 0,0,0 ---- 其它沒有提及的設(shè)置保留默認(rèn)值,以下同此。 ---- 2.在表單中添加一個(gè)“命令按鈕” 控件并選中它,然后在其對(duì)應(yīng)的“屬性”窗口中依次進(jìn)行如下設(shè)置: Caption 演示開始 FontName 仿宋_GB2312 FontSize 14 Height 30 Width 217 ---- 3.在表單中添加一個(gè)“計(jì)時(shí)器”控件 ,它可以放在表單中的任何位置,表單運(yùn)行時(shí)是不可見的。選中它,然后在其對(duì)應(yīng)的“屬性”窗口中進(jìn)行如下設(shè)置: Enabled .F. Interval 100(ms) ---- 經(jīng)過上面的步驟,再對(duì)控件的位置做些調(diào)整后,即得到如圖(見t02.jpg文件) 所示的表單。 ---- (二)、為控件添加代碼 ---- 1進(jìn)入“演示開始”(Command1)按鈕的“Click”事件代碼窗,輸入以下代碼: if thisform.timer1.enabled=. F. thisform.timer1.enabled=. T. endif ---- 用鼠標(biāo)單擊該按鈕后,計(jì)時(shí)器開始運(yùn)行,并啟動(dòng)Timer事件。 ---- 2.進(jìn)入“計(jì)時(shí)器”的“Timer”事件代碼窗,輸入以下代碼: i=i+10 if i>=255*2 thisform.timer1.enabled=. F. i=0 endif if i>=255 thisform.label1.forecolor=RGB (255*2- i, 0,0) else thisform.label1.forecolor=RGB (i, 0,0) endif ---- Timer事件的作用是, 當(dāng)計(jì)時(shí)器開始運(yùn)行時(shí)(enabled值為.T.),就以Interval所規(guī)定的值為時(shí)間間隔不斷運(yùn)行Timer中的代碼,直到計(jì)時(shí)器的enabled值為.F.為止。 ---- RGB(red,green,blue) 函數(shù)通過其中紅、綠、藍(lán)三個(gè)參數(shù)的值(0~255)的不同組合可得到不同顏色。上面代碼的作用即是通過逐漸改變標(biāo)簽(Lable1)中文字“淡入淡出效果演示”的顏色,使其從黑色(0,0,0)變?yōu)榧t色(255,0,0),再?gòu)募t色變回黑色,因?yàn)榍懊鎸?biāo)簽背景已設(shè)為透明,即與表單的顏色相同,所以當(dāng)表單的顏色也為黑色時(shí),就實(shí)現(xiàn)了文字的漸入漸出效果。 ---- 具體實(shí)現(xiàn)的代碼很簡(jiǎn)單: ---- (1) 當(dāng)i>255*2,表示文字已經(jīng)過了由黑變紅再返回黑色的過程,于是停止定時(shí)器運(yùn)行。 ---- (2)當(dāng)i>255,文字處于由紅轉(zhuǎn)黑的漸隱過程,此時(shí)紅色值255*2-i由255逐漸減為0。 ---- (3)當(dāng)i<255,文字處于由黑轉(zhuǎn)紅的漸現(xiàn)過程,此時(shí)紅色值i由0逐漸增至255。 ---- 要注意的是, 如果變量i每次循環(huán)的增量和計(jì)時(shí)器中Interval的值設(shè)置不當(dāng),會(huì)出現(xiàn)文字一現(xiàn)即逝或半天顯不出來(lái)的情況。 ---- 3.在表單空白處右擊鼠標(biāo)進(jìn)入“Form1” 的“Activate”事件代碼窗,為在計(jì)時(shí)器中使用的變量i進(jìn)行定義和初始化: Public i i=0 |
|