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