王麗華
(黑龍江省海倫農(nóng)業(yè)機(jī)械化學(xué)校,黑龍江 海倫 152300)
在使用Visual FoxPro 6.0編程或?qū)W習(xí)過程中,經(jīng)常會(huì)出現(xiàn)或遇到這樣或那樣的問題,在不能解決的情況下,往往打擊了使用者的學(xué)習(xí)興趣,本文特將一些VFP使用技巧進(jìn)行歸納總結(jié),與廣大VFP學(xué)習(xí)愛好者交流探討。
出現(xiàn)“Cannot Quit Visual FoxPro”的原因有兩種情況,一是在執(zhí)行了read event后,read event事件處于活動(dòng)狀態(tài),此時(shí),試圖使用系統(tǒng)窗口的關(guān)閉按鈕退出Visual FoxPro(或Visual FoxPro編寫的應(yīng)用,以下同),則會(huì)出現(xiàn)“Cannot Quit Visual FoxPro”。二是在 Visual Fox-Pro6.0中,如果在還有活動(dòng)表單的情況下,無論使用系統(tǒng)窗口的關(guān)閉按鈕,還是調(diào)用Quit,都會(huì)出現(xiàn)“Cannot Quit Visual FoxPro”。這時(shí),要正常退出,必須先關(guān)閉活動(dòng)的表單。要避免出現(xiàn)“Cannot Quit Visual FoxPro”,在欲退出之前,要先執(zhí)行clear event。在Visual Fox-Pro5.0中還要先關(guān)閉活動(dòng)的表單。
在Visual FoxPro 6.0中,程序的開頭可以加上類似以下的程序
ON SHUTDOWN DO MyQuit
PROC MyQuit
CLEAR Event
IF-SCREEN.cFormCount>0
DIME TmpForm[-SCREEN.FormCount]
FOR i=1 TO-SCREEN.FormCount
TmpForm[i]=-SCREEN.Forms(i)
ENDFOR
FOR i=1 TO-SCREEN.FormCount
TmpForm[i].Release
ENDFOR
ENDIF
QUIT
這樣,在欲退出Visual FoxPro時(shí),程序先自動(dòng)清除read event事件,關(guān)閉所有的表單,然后調(diào)用Quit正常退出。
我們知道,編譯成 exe的 VFP程序要加載兩個(gè)運(yùn)行時(shí)庫,它們的缺省名稱為 VFP9r.dll和 VFP9rchs.dll。VFP在正常情況下查找和加載這兩個(gè) dll的方式是這樣的:
2.1 首先從注冊(cè)表中(位置:HKEY_CLA SSES_ROOTVisualFoxProRuntime.9ShellOpe nCommand)讀取運(yùn)行庫的文件路徑和名稱定義,通常是 C:Program FilesCommon FilesMi crosoft SharedVFPVFP9r.dll,然后加載它。
2.2 加載成功的 VFP9r.dll根據(jù) Windows確定要使用的語言資源文件 VFP9r???.dll,對(duì)于簡體中文,使用 VFP9rchs.dll
假定我們將這兩個(gè)運(yùn)行庫文件更名為aaa.dll和 aaa.chs.dll,并放到 c:windowssystem32下的話,如何讓我們的 exe仍能正常運(yùn)行,又不影響其他 VFP程序正常運(yùn)行呢?
首先,要使我們的 exe不使用 HKCRVi sualFoxProRuntime.9ShellOpenCommand 中的運(yùn)行庫缺省定義。先在注冊(cè)表中增加一項(xiàng)我們要使用的運(yùn)行庫定義:
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOTMyRuntimeShellOpenCommand]
@=“C:\WINDOWS\system32\aaa.dll”
打開記事本,貼入上面的內(nèi)容并保存為my.reg,然后雙擊這個(gè)文件導(dǎo)入到注冊(cè)表中。下面修改 exe讓它來讀取這個(gè)設(shè)置。
使用任何16進(jìn)制編輯器 (例如:UltraEdit),在 exe中查找 VisualFoxProRuntime.9,找到后將其改為我們剛定義的 MyRuntime(注意修改后的串不要超過原串長度,若長度小于原串的話,注意尾部要填一個(gè) 00)
保存修改后的 exe文件,現(xiàn)在我們的exe運(yùn)行時(shí)將加載這個(gè) aaa.dll而不會(huì)再找VFP9r.dll了。
接下來我們要讓 aaa.dll去找 aaa.chs.dll而不找原來的 VFP9rchs.dll,仍用16進(jìn)制編輯器,這次打開 aaa.dll,查找 VisualFoxproRuntime.9Resources,看到緊接著的VFP9R%s了嗎?就是它,將它改為 aaa.%s,由于我們的 aaa.%s比 VFP9r%s少一個(gè)字符,所以后面也要填一個(gè) 00。保存好修改后的aaa.dll。現(xiàn)在這個(gè) exe將加載 c:windowssystem32的運(yùn)行庫 aaa.dll和 aaa.chs.dll。
由于誤操作,將自由表的備注文件刪除,致使自由表無法打開。遇到這種情況我們可采用下述方法解決:
創(chuàng)建一個(gè)新的自由表,且該自由表只含一個(gè)字段,其類型為備注型。關(guān)閉該自由表,將其擴(kuò)展名為FPT的備注文件復(fù)制給誤刪除的自由表的備注文件,或?qū)⒃搨渥⑽募拿麨檎`刪除的自由表的備注文件即可。
運(yùn)行下面的程序同樣也可以恢復(fù)丟失了的FPT文件:
accept′請(qǐng)輸入丟失了.FPT文件的自由表名稱(不帶擴(kuò)展名):′to namef
namef=trim(namef)+′.bbb′
crea dbf&namef(aa m)
use
dele file&namef
用VFP低級(jí)文件函數(shù)創(chuàng)建一個(gè)空的FPT文件,原自由表即可打開。程序清單如下:
accept′請(qǐng)輸入丟失了.FPT文件的自由表名稱(不帶擴(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)丟失,無法恢復(fù)。在實(shí)際操作中若遇到這種情況,最好是恢復(fù)原來的FPT文件,若原FPT文件無法恢復(fù)時(shí)再采用上述方法。
綜上所述,只是個(gè)人在使用VFP軟件過程中的一點(diǎn)學(xué)習(xí)心得,敬請(qǐng)VFP廣大愛好者學(xué)習(xí)者批評(píng)指正。
[1]林波.《數(shù)據(jù)庫應(yīng)用基礎(chǔ)Visual FoxPro 6.0》北京郵電大學(xué)出版社
[2]王晟 王松 劉強(qiáng).《Visual FoxPro數(shù)據(jù)庫開發(fā)經(jīng)典案例解析》清華大學(xué)出版社
[3]李汝林.《中文Visual FoxPro 6.0實(shí)用教程》中職計(jì)算機(jī)技能緊缺人才培養(yǎng)規(guī)劃教材