l 如何給表單填加背景圖片? Ø 不要直接用表單的picture來填加背景圖片,圖片的大小不可控制。 Ø 解決辦法:用圖像控件:image, 來顯示背景圖片(縮放方式為:變比填充),并在表單的activate事件中用代碼方式對(duì)image 控件的位置(top=0、 left=0) 和大?。╤eight、width)屬性做適當(dāng)?shù)脑O(shè)置,讓image 控件的大小等于表單的大小。 Ø 若想實(shí)現(xiàn)表單的尺寸大小改變時(shí),背景圖片同步改變大小,請(qǐng)?jiān)诒韱蔚膔esize事件中做上述同樣的代碼設(shè)置即可。 l 為什么回不到設(shè)計(jì)狀態(tài)? Ø 程序掛起了,參看教材12章:程序的調(diào)試部分---掛起suspend命令。 Ø 解決辦法:在命令窗口中輸入命令:cancel回車;或者單擊“程序”菜單中的“取消”命令。 l 怎樣快速找到出錯(cuò)的命令行代碼? Ø 出錯(cuò)時(shí),點(diǎn)“掛起”來打開調(diào)試器,看到出錯(cuò)的行,找到原因; Ø 在調(diào)試器中單擊,“跳出”工具按鈕,來回到錯(cuò)誤狀態(tài); Ø 單擊“取消”按鈕,回到設(shè)計(jì)狀態(tài)修改錯(cuò)誤代碼。 l 為什么數(shù)據(jù)類型不匹配? Ø 請(qǐng)注意表中字段的數(shù)據(jù)類型與你寫的表達(dá)式的數(shù)據(jù)類型一致,數(shù)據(jù)類型不一致不能運(yùn)算。如表達(dá)式:123>”1000” Ø 解決辦法:用轉(zhuǎn)換函數(shù)(推薦用前者)或者改表中的字段類型。 l 如何在一個(gè)頂層表單中調(diào)用一般菜單? 1、建立一般菜單 Ø 文件/新建/菜單-----存成菜單定義文件.MNX Ø 顯示/常規(guī)選項(xiàng)/選中“頂層表單” (告訴系統(tǒng)將來這個(gè)菜單要在一個(gè)頂層表單中調(diào)用) Ø 生成.MPR菜單程序文件 2、在一個(gè)“頂層表單”的表單文件中調(diào)用上面的菜單 Ø 將表單設(shè)置為頂層表單:將表單的showwindow設(shè)置為2。 Ø 頂層表單的init事件代碼如下:DO xx.MPR WITH THIS, .T. l 如何在一個(gè)表單中調(diào)用快捷菜單? Ø 新建/菜單/快捷菜單(同一般菜單) Ø 保存文件MNX-----生成文件MPR Ø 在表單(控件)的右擊事件(Rightclick)來調(diào)用,輸入代碼:Do XX.mpr l 如何書寫主程序? **main.prg** _screen.visible=.f. do form xx.scx read events quit l 用VFP編寫管理系統(tǒng)的一般模式是什么? 主程序(main.prg) 調(diào)用 密碼驗(yàn)證表單(頂層表單) 調(diào)用 主控表單(頂層表單) 調(diào)用 菜單(xtcd.mpr)— 調(diào)用 其他功能表單(showwindow屬性設(shè)置為1:在頂層表單中) 注:頂層表單:showwindow屬性設(shè)置為2:作為頂層表單 l 瀏覽功能表單的設(shè)計(jì)思路? 是一個(gè)數(shù)據(jù)表單,表單上可以有相應(yīng)的控件(從數(shù)據(jù)環(huán)境中直接拖入即可),要求控件只讀,還要有一些按鈕來移動(dòng)記錄指針。還可以增加簡單的查詢功能,來實(shí)現(xiàn)按查詢的條件來瀏覽表中的記錄信息。 注:若用到表格(grid)控件,請(qǐng)去掉表格控件的刪除列,即修改deletemark屬性:deletemark=.f. l 查詢功能表單的設(shè)計(jì)思路? Ø 用set filter to實(shí)現(xiàn): 是 一個(gè)數(shù)據(jù)表單,表單上有相應(yīng)的表格(grid)控件,(表格控件要求只讀),用文本框來接收用戶的查詢關(guān)鍵字段的值,再用set filter to命令來對(duì)表格控件的數(shù)據(jù)源表進(jìn)行條件過濾,來模擬查詢的效果。若是多關(guān)鍵字查詢,請(qǐng)用選項(xiàng)按鈕組來讓用戶選擇要查詢的關(guān)鍵字類別,如:按姓名或按學(xué)號(hào) 等。 Ø 用SQL語句Select實(shí)現(xiàn): 是一個(gè)數(shù)據(jù)表單,表單上有相應(yīng)的表格 (grid)控件,(表格控件要求只讀),用文本框來接收用戶的查詢條件,填加一個(gè)“查詢”按鈕,單擊該按鈕時(shí),執(zhí)行select查詢語句,查詢語句的結(jié) 果放到表格(grid)控件中顯示(該表格控件的數(shù)據(jù)源用代碼方式設(shè)置為:thisform.grid1.recordsourcetype=4,即 SQL說明;thisform.gird1.recordsource=“select * from 表 where 條件 into cursor temp”。) 注:若用到表格(grid)控件,請(qǐng)去掉表格控件的刪除列,即修改deletemark屬性:deletemark=.f. l 打印功能表單的設(shè)計(jì)思路? Ø 先做有關(guān)數(shù)據(jù)表的報(bào)表格式文件(frx)。 Ø 做一個(gè)表單,上有按鈕控件,單擊該按鈕,執(zhí)行預(yù)覽報(bào)表的命令: report form xx.frx preview Ø 若想實(shí)現(xiàn)條件打印預(yù)覽,只需在上面的命令中加上for條件語句: report form xx.frx preview for <條件> l 修改功能表單的設(shè)計(jì)思路? 實(shí) 質(zhì)是一個(gè)數(shù)據(jù)表單,表單上有相應(yīng)的表格(grid)控件(表格控件要求只讀),或相應(yīng)的ole綁定控件(從數(shù)據(jù)環(huán)境中直接拖入表單中產(chǎn)生的控件,控件要求 只讀),還有“修改”按鈕,單擊該按鈕,去掉上述控件的只讀屬性,允許用戶來修改表單中顯示的記錄數(shù)據(jù)。還有一個(gè)“確定”按鈕,單擊該按鈕,設(shè)置相應(yīng)控件 的只讀屬性為真,不允許用戶修改數(shù)據(jù),表示數(shù)據(jù)修改結(jié)束。 注:若用到表格(grid)控件,請(qǐng)去掉表格控件的刪除列,即修改deletemark屬性:deletemark=.f. l 刪除功能表單的設(shè)計(jì)思路? Ø 假刪除方法:建一個(gè)數(shù)據(jù)表單,表單上有相應(yīng)的表格(grid)控件(表格控件要求只讀)顯示數(shù)據(jù)表中的記錄,并且去掉表格(grid)控件的刪除列,即 修改deletemark屬性:deletemark=.f.;由用戶在表格中選擇一個(gè)要?jiǎng)h除的記錄,單擊“刪除”按鈕,給記錄加上刪除標(biāo)記,即邏輯刪除 記錄;然后執(zhí)行set deleted on 命令來屏蔽(不顯示)有刪除標(biāo)記的記錄,來模擬刪除的效果。最后,在“退出”按鈕中,執(zhí)行物理刪除命令:pack,來真正刪除表中的記錄。 注:表必須以獨(dú)占方式打開(可用命令:use 表 exclusive;也可在設(shè)置表單數(shù)據(jù)環(huán)境的屬性:exclusive=.t.),否則會(huì)刪除失敗。 l 刪除表單中的恢復(fù)刪除功能實(shí)現(xiàn)? 表單中增加一個(gè)接收“記錄號(hào)”的文本框和一個(gè)“恢復(fù)刪除”按扭,單擊該按鈕,首先不屏蔽(顯示)有刪除標(biāo)記的記錄,然后執(zhí)行recall命令來恢復(fù)相應(yīng)的記錄,最后再設(shè)置系統(tǒng)狀態(tài)為:屏蔽(不顯示)有刪除標(biāo)記的記錄。 l 增加記錄功能表單的設(shè)計(jì)思路? 方法1:是一個(gè)數(shù)據(jù)表單,表單上可以有相應(yīng)的控件(從數(shù)據(jù)環(huán)境中直接拖入即可),要求控件只讀。增加一個(gè)“增加記錄”按鈕,單擊該按鈕,實(shí)現(xiàn)在表的末尾增加一條空記錄,并去掉相應(yīng)字段的綁定控件只讀屬性,允許用戶來修改新記錄的內(nèi)容。 注:如果數(shù)據(jù)庫表中設(shè)置了主索引,上述方法會(huì)失敗。原因是主索引的關(guān)鍵字是不許為空的。解決辦法是:去掉表的主索引或者用SQL中的insert into 命令來實(shí)現(xiàn)。 方法2:建一個(gè)表單,表單上填加相應(yīng)的控件,來接收用戶輸入的相應(yīng)字段的值,然后用SQL中的insert into 命令來把新記錄的值追加到表中即可。 insert into 表名(字段1, 字段2..) values( 值1,值2…) l 為什么我的程序編譯后一閃而過? 這 個(gè)問題有兩種可能性,第一種是程序執(zhí)行完成并退出,第二種是程序正在執(zhí)行,但界面被隱藏。對(duì)于第二種情況,可直接按"Ctrl- Alt-Del"鍵觀察到。造成這兩種情況的原因如下:我們先看下面的一段示例程序,假如下面的示例程序是項(xiàng)目的主程序,并且應(yīng)用項(xiàng)目 以VFP主窗口做為自己的主窗口。 *環(huán)境設(shè)置 Do Form myScreen &&啟動(dòng)封面表單 _ Screen.Show &&顯示VFP主窗口 Do myMenu.mpr &&安裝菜單系統(tǒng) RETURN 為 達(dá)到在顯示啟動(dòng)封面之前不顯示VFP主窗口的目的,在Config.fpw中已寫Screen=off,當(dāng)程序執(zhí)行到Do Form myScreen這一句時(shí),如果表單myScreen的ShowWindows屬性被設(shè)為"在屏幕中",則不管是在 開發(fā)環(huán)境還是在編譯環(huán)境下,程序都將停下來,表單被顯示在_Screen中,而_Screen被隱藏了,因此表單跟著也被隱藏了,所以在屏幕上什么也看不 見。這就是第二種情況的產(chǎn)生原因。為了避免這種錯(cuò)誤的出現(xiàn),必須將myScreen表單的ShowWindow的屬性設(shè)為"做為頂層表 單",這樣就可使在_Screen被隱藏的情況下,myScreen仍然可以被顯示出來。但請(qǐng)注意,在此情況下,Do Form myScreen這句話執(zhí)行后,程序并不能停下來,而是順序地執(zhí)行下去,一直到執(zhí)行到RETURN后程序退出,這也就是著名的"一閃而 過"現(xiàn)象了。為此必須在程序中包含事件處理命令Read Events使程序停下來,如下: *環(huán)境設(shè)置 Do Form myScreen &&啟動(dòng)封面表單 Read Events &&開始事件處理:使啟動(dòng)封面停下來 _ Screen.Show &&顯示VFP主窗口 Do myMenu.mpr &&安裝菜單系統(tǒng) Read Events &&開始事件處理 RETURN 程 序執(zhí)行Do Form myScreen后,將啟動(dòng)封面顯示在屏幕上,然后向下執(zhí)行到Read Events開始事件處理,此時(shí)啟動(dòng)封面表單必須由用戶關(guān)閉或由表單事件關(guān)閉,否則程序?qū)⒁恢蓖T赗ead Events這一句上。不管myScreen表單由誰關(guān)閉,在關(guān)閉代碼中必須包含一句Clear Events的停止事件處理命令,以便開始執(zhí)行Read Events的下一句指令,順序執(zhí)行完成_Screen.Show及Do myMenu.mpr后,用戶的主界面就建立完成,同理,此處還需要一個(gè)事件處理命令讓程序再次停下來,開始菜單系統(tǒng)的命令處理,一般情況,菜單系統(tǒng)中將 包含的"退出"項(xiàng),其中有"Clear Events"清除事件處理代碼,從而停止第二條"Read Events"事件處理命令,退出整個(gè)系統(tǒng)。 以上經(jīng)驗(yàn)恐有謬誤,敬請(qǐng)批評(píng)! 最后,VFP是個(gè)所謂"讓我歡喜讓我憂"的東東,有時(shí)百依百順,有時(shí)莫名其妙。未曾戀愛過的男性最適合習(xí)之,以便為今后的戀愛打下堅(jiān)實(shí)的心理基礎(chǔ)。 在梅子那邊看到經(jīng)典問題里面有這個(gè)題目,話說了一堆,卻沒說到點(diǎn)子上。 說實(shí)話,以前也從來沒看到過說到點(diǎn)子上的文章。大多數(shù)人也就是知道在主程序里面加了Read events 后能夠避免一閃而過的問題而已,到底是什么原理還是不清除。 其實(shí)很簡單,主程序是個(gè)什么文件?它就是一個(gè)PRG。 普通的PRG文件執(zhí)行情況是怎么樣的?從頭到尾,每一行代碼執(zhí)行下去,然后立即退出。 OK,現(xiàn)在,再想一想,我們想要做的,是怎么樣一個(gè)程序?是一個(gè)會(huì)出現(xiàn)菜單、主窗口,等待我們選擇某個(gè)功能去執(zhí)行的程序。也就是說,程序應(yīng)該打開菜單、主窗口以后就中途停下來,等待我們操作的程序。 好,現(xiàn)在再想一下,怎么在PRG中間的某個(gè)地方讓程序停下來進(jìn)入那么一種狀態(tài)?Wait window 可以做到,不過一按鼠標(biāo)馬上就又繼續(xù)執(zhí)行了,要讓程序一直等著,即使進(jìn)行了幾個(gè)操作也不會(huì)退出,就只有用Read events了。 隨便建一個(gè)PRG,不用把它設(shè)置成主程序,只要這個(gè)PRG中間有Read events,那么程序就會(huì)停下來等著,MSDN里面的許多示例就是這么干的。 現(xiàn)在,一閃而過的問題應(yīng)該清楚了吧?你的菜單是打開了、主窗口是打開了,但是,因?yàn)闆]有進(jìn)入這個(gè)等待狀態(tài),所以,程序馬上繼續(xù)執(zhí)行到末尾然后退出,菜單、主窗口都馬上又被關(guān)閉了。這些,都是一瞬間就執(zhí)行完的,結(jié)果,看起來就是一閃而過。 再 看看Clear events,它的意思,就是從這種等待狀態(tài)中退出。許多人把 Clear events 誤會(huì)成一個(gè)退出程序的命令。不對(duì),Clear events只是退出這種等待狀態(tài)而已,如果你在它的后面再加上一個(gè) Read events,那么程序就又會(huì)進(jìn)入一種等待狀態(tài)而不會(huì)結(jié)束。由于Clear events并不是立即退出程序,因此,在Clear events 后面的代碼還是會(huì)繼續(xù)執(zhí)行,比如我們用來關(guān)閉數(shù)據(jù)庫、恢復(fù)系統(tǒng)環(huán)境設(shè)置等等的命令之類的,都可以放在Clear events后面去執(zhí)行。 這個(gè)解釋,應(yīng)該是【一閃而過】和【Read events】的最終解釋了吧! |
|