二、斷點(diǎn)和單步:
斷點(diǎn)——顧名思義就是中斷的地方,正常情況下,我們的代碼是連續(xù)執(zhí)行的,只有在遇到異常情況,發(fā)生了某些錯(cuò)誤,才會(huì)中斷跳出,而斷點(diǎn)是用戶手工設(shè)定的程序強(qiáng)制中斷點(diǎn),無(wú)論程序運(yùn)行正常與否,都將在斷點(diǎn)停止執(zhí)行。
斷點(diǎn)的使用便于用戶在有疑點(diǎn)的代碼行之前中斷代碼,然后使用單步來(lái)逐行檢查自己的代碼是否與自己的設(shè)計(jì)目標(biāo)一致,在那些語(yǔ)法沒(méi)有問(wèn)題,執(zhí)行沒(méi)有任何錯(cuò)誤,但是結(jié)果與我們預(yù)期不符的代碼中,斷點(diǎn)尤其重要。
在下圖中,我們可以看到代碼中有一個(gè)褐色的橫條,這個(gè)橫條就是我們?cè)O(shè)置的斷點(diǎn),程序?qū)⒃谶\(yùn)行到這行代碼之前中斷(而不是運(yùn)行完這行代碼之后,這一點(diǎn)尤其重要),設(shè)置或取消的這個(gè)斷點(diǎn)的方法有兩種,一種是光標(biāo)移動(dòng)到這行代碼上,然后選擇『調(diào)試』菜單中的『切換斷點(diǎn)』功能(熱鍵F9),更簡(jiǎn)單的方法就是在橫條前那個(gè)原點(diǎn)的位置用鼠標(biāo)單擊。
OK,下面讓我們來(lái)看看斷點(diǎn)的效果,我們打開(kāi)『企業(yè)資料』窗體,把當(dāng)前窗體上的數(shù)據(jù)修改一下,然后點(diǎn)擊『保存』按鈕來(lái)觸發(fā)這段代碼。這時(shí)如下圖所示,VBAIDE被自動(dòng)彈出了,而且光標(biāo)停在了我們?cè)O(shè)置的斷點(diǎn)上。這個(gè)時(shí)候,代碼處于被掛起狀態(tài),我們可以進(jìn)行各種其他的調(diào)試操作,例如查看掛起狀態(tài)下程序的狀態(tài),各個(gè)變量的當(dāng)前值等等,甚至我們還可以通過(guò)在立即窗口中輸入執(zhí)行代碼來(lái)改變代碼運(yùn)行的狀態(tài)等等。
處于掛起狀態(tài)下的代碼,我們只需要將鼠標(biāo)移動(dòng)到變量上,就能查看他的當(dāng)前值,我們將鼠標(biāo)移動(dòng)到STemp上,即可如上圖所示,看到Stemp的當(dāng)前值為:"INSERT INTO 企業(yè)",這一方便的功能有助于我們?cè)诖a執(zhí)行過(guò)程中,逐步檢查代碼是否在按照自己的預(yù)期來(lái)工作。
讓我們來(lái)嘗試一下改變Stemp,我們?cè)诹⒓创翱谥休斎氪a如下圖后按回車執(zhí)行。然后我們?cè)賹⑹髽?biāo)移動(dòng)到代碼中Stemp變量上,你發(fā)現(xiàn)了什么?當(dāng)然,我們所做的這個(gè)改動(dòng),僅僅影響當(dāng)前正在運(yùn)行的代碼內(nèi)存狀態(tài),一旦代碼執(zhí)行結(jié)束或者中斷,我們下載再運(yùn)行的時(shí)候,就不會(huì)繼續(xù)受到影響了。
現(xiàn)在我們已經(jīng)將代碼的執(zhí)行中斷了,接下來(lái)我們就要讓他按照我們的需要一步步地慢慢執(zhí)行,我們可以在『調(diào)試』菜單中選擇『逐語(yǔ)句』,當(dāng)然更簡(jiǎn)單的方法就是按F8,這時(shí)候,我們可以看到黃色標(biāo)記會(huì)隨著我們按F8,一行一行往下移動(dòng),這個(gè)時(shí)候,系統(tǒng)也正在逐行執(zhí)行我們的代碼。如下圖所示,當(dāng)我們執(zhí)行了下一行代碼后,我們?cè)俨榭碨temp的值,發(fā)現(xiàn)它已經(jīng)被改變了。同時(shí),我們剛才在立即窗口中對(duì)于變量狀態(tài)的“篡改”也對(duì)程序的執(zhí)行產(chǎn)生了影響。
如絕大多數(shù)語(yǔ)言的開(kāi)發(fā)環(huán)境一樣,VBAIDE也提供多種的單步執(zhí)行方式,包括:逐語(yǔ)句/逐過(guò)程/跳出/運(yùn)行到光標(biāo)處,其中逐語(yǔ)句我們已經(jīng)用過(guò),對(duì)于代碼中的函數(shù)調(diào)用等,逐語(yǔ)句將會(huì)嚴(yán)格遵循系統(tǒng)的執(zhí)行順序,一行代碼都不會(huì)拉下,而逐過(guò)程則僅對(duì)于當(dāng)前的代碼塊是逐語(yǔ)句的,對(duì)于當(dāng)前代碼塊中的調(diào)用,則視作一行代碼一次執(zhí)行完成,這一功能對(duì)于那些代碼中包含我們已經(jīng)確信沒(méi)有問(wèn)題的子程序的,是非常有用的。而跳出則是將當(dāng)前代碼塊執(zhí)行完,回到調(diào)用他的地方去。
除了以上四個(gè)單步調(diào)試功能外,還有一個(gè)最重要的功能就是『運(yùn)行』菜單中的『繼續(xù)』選項(xiàng),熱鍵F5,這一功能則是在我們調(diào)試完畢后,解除代碼的掛起狀態(tài),使代碼從掛起處繼續(xù)運(yùn)行。
下面讓我們來(lái)練習(xí)一下,在我們的例子中,修改功能并不能正常使用,讓我們用剛學(xué)到的方法來(lái)分析一下是什么原因。首先,我們?cè)谛薷陌粹o的代碼入口設(shè)置斷點(diǎn)如下:
然后我們選擇一條記錄,將法人代碼修改為:“00000000”,然后一步一步按F8往下執(zhí)行,代碼執(zhí)行很正常,先是作數(shù)據(jù)合法性判斷,然后尋找記錄,找到后進(jìn)行修改。當(dāng)我們執(zhí)行到如下圖所示行時(shí),問(wèn)題出現(xiàn)了,這行代碼明顯就是執(zhí)行修改法人代碼的功能,然而我們用鼠標(biāo)選中等號(hào)前后的部分,分別查看其值的時(shí)候,我們發(fā)現(xiàn)居然是完全一樣的,照理等式右邊的值應(yīng)該是“00000000”,而我們發(fā)現(xiàn)現(xiàn)在都是修改前的值,我們所做的修改根本沒(méi)有被記錄。再仔細(xì)分析代碼,我們發(fā)現(xiàn),“Me![企業(yè)資料 子窗體]![法人代碼]”實(shí)際上就是取子窗體中的法人代碼,而子窗體中的數(shù)據(jù)本來(lái)就是沒(méi)有被修改過(guò)的,我們的代碼錯(cuò)誤引用了窗體,導(dǎo)致程序完全忽略了主窗體中被修改的變量。
我們將代碼修正為“Rs("法人代碼") = 法人代碼.Value”,按F5繼續(xù)執(zhí)行,修改完成,其他的字段中也存在同樣的問(wèn)題,逐一修正后修改功能正常。
[此貼子已經(jīng)被作者于2006-5-20 1 |