設(shè)計(jì)事件驅(qū)動(dòng)與模塊程序課件_第1頁(yè)
設(shè)計(jì)事件驅(qū)動(dòng)與模塊程序課件_第2頁(yè)
設(shè)計(jì)事件驅(qū)動(dòng)與模塊程序課件_第3頁(yè)
設(shè)計(jì)事件驅(qū)動(dòng)與模塊程序課件_第4頁(yè)
設(shè)計(jì)事件驅(qū)動(dòng)與模塊程序課件_第5頁(yè)
已閱讀5頁(yè),還剩56頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第10章設(shè)計(jì)模塊與事件驅(qū)動(dòng)程序模塊化程序設(shè)計(jì)類模塊與標(biāo)準(zhǔn)模塊模塊與過(guò)程的關(guān)系Sub子過(guò)程與Function子過(guò)程的定義過(guò)程調(diào)用與參數(shù)傳遞事件與事件驅(qū)動(dòng)常用的事件過(guò)程

學(xué)習(xí)目標(biāo)理解類模塊、標(biāo)準(zhǔn)模塊及其區(qū)別了解描述模塊與過(guò)程的相互關(guān)系理解Sub子過(guò)程及Function子過(guò)程掌握過(guò)程定義、調(diào)用與參數(shù)傳遞的方法理解變量的作用范圍及生命周期理解事件及事件驅(qū)動(dòng)

概述實(shí)際上我們?cè)诔绦蛟O(shè)計(jì)時(shí),首先將整個(gè)系統(tǒng)分解成若干個(gè)獨(dú)立的子系統(tǒng),然后對(duì)子系統(tǒng)進(jìn)行編程、調(diào)試,這種設(shè)計(jì)方法充分體現(xiàn)了模塊化程序設(shè)計(jì)的思想。在Access中,模塊是一個(gè)重要的對(duì)象,它是用戶開(kāi)發(fā)應(yīng)用程序的基本手段。

過(guò)程與模塊過(guò)程是VBA代碼的容器,在Access中有三種類型的容器,它們分別是子程序、函數(shù)過(guò)程和屬性過(guò)程。雖然它們的功能可以組合,但是每種過(guò)程都有其獨(dú)特的功能。一個(gè)模塊由若干個(gè)函數(shù)過(guò)程或子過(guò)程組成。另外,在學(xué)習(xí)窗體或報(bào)表時(shí),經(jīng)常要從工具欄中選取某些控件,放置在窗體或報(bào)表上。這些控件就是對(duì)象,其中封裝了一些屬性或方法,用戶可以根據(jù)設(shè)定使用。對(duì)于同一種控件,設(shè)定的屬性不同,其表現(xiàn)的形式就不同,從而產(chǎn)生的實(shí)例也就不同。模塊和宏的使用很相似,宏的每一個(gè)操作都有其對(duì)應(yīng)的VBA代碼。因此,我們可以將宏轉(zhuǎn)化為等效的模塊,從而提高運(yùn)行速度。雖然模塊和宏的使用很相似,但是宏的使用有一定的局限性,有些復(fù)雜的條件或程序結(jié)構(gòu),只能利用模塊來(lái)實(shí)現(xiàn)。將宏轉(zhuǎn)化為模塊的操作如下。在Access數(shù)據(jù)庫(kù)窗口對(duì)象中單擊宏對(duì)象,選中要轉(zhuǎn)化為模塊的宏,使用工具菜單下的“將宏轉(zhuǎn)化為VisualBasic代碼”命令來(lái)實(shí)現(xiàn)轉(zhuǎn)化。將宏轉(zhuǎn)化為VBA代碼子過(guò)程的定義與參數(shù)傳遞一個(gè)模塊中通常包含一個(gè)或多個(gè)過(guò)程,模塊功能的實(shí)現(xiàn)就是通過(guò)執(zhí)行具體的過(guò)程來(lái)完成的,在本節(jié)中,我們將結(jié)合實(shí)例介紹過(guò)程創(chuàng)建、過(guò)程調(diào)用和參數(shù)傳遞的使用。VBA程序中的過(guò)程分為兩種類型,Sub子過(guò)程和Function函數(shù)過(guò)程。例題其中Int_Mul子過(guò)程求兩個(gè)整數(shù)的積,并將其輸出到立即窗口,在Demo子過(guò)程中調(diào)用Int_Mul子過(guò)程求5與8的積。

在數(shù)據(jù)庫(kù)窗口中,選中模塊對(duì)象,單擊“新建”,在打開(kāi)的VBE中輸入如下代碼:SubDemo()CallInt_Mul(5,8)‘調(diào)用Int_Mul子過(guò)程求5與8的積EndSubSubInt_Mul(aasInteger,basInteger)DimResultAsIntegerResult=a*bDebug.PrintResultEndSub

代碼編輯窗口命令按鈕向?qū)?duì)話框在這里我們選擇了查找下一項(xiàng)記錄的操作,則生成了如下的子過(guò)程代碼:PrivateSub命令_Click()OnErrorGoToErr-命令_ClickDoCmd.FindnextFindnext-命令_Click:ExitSubErr-命令_Click:MsgBoxErr.DescriptionResumeFindnext-命令_ClickEndSub在Access窗體視圖中瀏覽窗體時(shí),單擊此按鈕,窗體就會(huì)顯示下一個(gè)記錄。此時(shí)這個(gè)過(guò)程的執(zhí)行是通過(guò)單擊按鈕事件而進(jìn)行的。這就是在本章后面要介紹的事件驅(qū)動(dòng)機(jī)制。函數(shù)過(guò)程的定義和調(diào)用如果希望一組單一功能的VBA代碼返回一個(gè)數(shù)值,就用函數(shù)來(lái)表示。Function函數(shù)過(guò)程是由Function語(yǔ)句開(kāi)始來(lái)聲明一個(gè)函數(shù),并使用EndFunction語(yǔ)句結(jié)束。Function函數(shù)執(zhí)行一系列操作,有返回值。定義格式如下:[Public/Private][static]Function函數(shù)過(guò)程名([<行參表>])[As數(shù)據(jù)類型][〈函數(shù)過(guò)程語(yǔ)句〉][ExitFuncion][〈函數(shù)過(guò)程語(yǔ)句〉][函數(shù)過(guò)程名=〈表達(dá)式〉]EndFunction使用Public關(guān)鍵字,則所有模塊的所有其他過(guò)程都可以調(diào)用它。使用Private關(guān)鍵字,則該函數(shù)只適用于同一個(gè)模塊中的其他過(guò)程。包括Static關(guān)鍵字時(shí),只要含有這個(gè)過(guò)程的模塊是打開(kāi)的,則所有在這個(gè)過(guò)程中無(wú)論是顯示還是隱含說(shuō)明的變量值都將被保留。可以在函數(shù)過(guò)程名末尾使用一個(gè)類型聲明字符或使用As子句來(lái)聲明被這個(gè)函數(shù)過(guò)程返回的變量數(shù)據(jù)類型。否則VBA將自動(dòng)賦予該函數(shù)過(guò)程一個(gè)最合適的數(shù)據(jù)類型。函數(shù)過(guò)程的調(diào)用形式為:函數(shù)過(guò)程名[<實(shí)參表>]函數(shù)過(guò)程的調(diào)用會(huì)返回一個(gè)值,函數(shù)過(guò)程的調(diào)用形式與標(biāo)準(zhǔn)函數(shù)的使用完全相同。函數(shù)代碼FunctionInt_Sum(aasInteger,basInteger)DimResultAsIntegerInt_Sum=a+bEndFunction例調(diào)用子函數(shù)作為表達(dá)式的一部分參與運(yùn)算。要求:在標(biāo)準(zhǔn)模塊中輸入如下3個(gè)過(guò)程,CircleArea函數(shù)和SquareArea函數(shù)分別用于求圓和正方形的面積,主過(guò)程Max1用于比較半徑和邊長(zhǎng)相同的圓和正方形的面積的大小。

‘利用半徑求圓面積PrivateFunctionCircleArea(rAsInteger)Constpi=3.14‘定義pi為常數(shù)

CircleArea=pi*r*rEndFunction‘求正方形的面積PrivateFunctionSquareArea(lineAsInteger)SquareArea=line*lineEndFunction‘比較半徑和邊長(zhǎng)相同的圓和正方形的面積的大小PrivateSubMax1()DimsAsIntegerS=InputBox(“請(qǐng)輸入測(cè)試數(shù)據(jù)”)‘利用對(duì)話框接收測(cè)試數(shù)據(jù)

IfCircleArea(s)>SquareArea(s)Then‘函數(shù)作為表達(dá)式參與運(yùn)算

MsgBox“半徑和邊長(zhǎng)相同的圓和正方形,圓的面積更大!”

EndIfEndSub

參數(shù)傳遞由上面的過(guò)程定義可以看到,過(guò)程定義時(shí)可以設(shè)置一個(gè)或多個(gè)形參(形式參數(shù)的簡(jiǎn)稱),形參之間用逗號(hào)分隔。其中,每個(gè)形參的完整定義格式為:[Optional][ByVal|ByRef][ParamArray]varname[()][AsType][=Defaultvalue]各項(xiàng)含義如下:VarName,必選項(xiàng),形參名稱。遵循標(biāo)準(zhǔn)的變量命名規(guī)則。Type,可選項(xiàng),傳遞給過(guò)程參數(shù)的數(shù)據(jù)類型。Optional,可選項(xiàng),如果使用了ParamArray,則任何參數(shù)都不能使用Optional.ByVal,可選項(xiàng),表示該參數(shù)按值傳遞。ByRef,可選項(xiàng),表示該參數(shù)按地址傳遞。Byref是VBA的缺省選項(xiàng)。ParamArray,可選項(xiàng)。只用于形參的最后一個(gè)參數(shù),指明最后這個(gè)參數(shù)是一個(gè)Variant元素的Optional數(shù)組。但ParamArray關(guān)鍵字不能與Byval,ByRef或Optional一起使用。Defaultvalue,可選項(xiàng),任何常數(shù)或常數(shù)表達(dá)式。只對(duì)Optional參數(shù)合法。如果類型為Object,則顯示的缺省值是Nothing。代碼的編輯窗口

例11.5如果把主調(diào)過(guò)程命令1_Click()不做任何改變,將被調(diào)函數(shù)GetData的定義做如下修改,參數(shù)傳遞改為按值傳遞,代碼如下所示:PrivateFunctionGetData(ByValmAsInteger)‘形參m被說(shuō)明為ByVal傳值形式的整型量m=m+6GetData=mEndFunction通過(guò)同樣的方法調(diào)用GetData函數(shù),執(zhí)行結(jié)果如圖所示,m值沒(méi)有發(fā)生變化,仍為5。傳值調(diào)用的結(jié)果變量的作用域和生命周期變量作用域的分為三個(gè)層次,局部范圍、模塊范圍和全局范圍。1.局部范圍如果變量定義在過(guò)程或函數(shù)體內(nèi),只有在過(guò)程代碼執(zhí)行時(shí)變量才發(fā)生作用。這樣的變量稱為局部變量,只能在過(guò)程或函數(shù)內(nèi)才有效。不同的過(guò)程或函數(shù)中,可以定義具有相同名字的變量,它們之間是互相獨(dú)立的。這種變量一般是在過(guò)程內(nèi)使用Dim定義或通過(guò)直接使用一個(gè)新變量名,即為隱式定義。例有如下程序PrivateMyNameAsStringPublicYourNameAsStringPrivateSub命令0_Click()DimHisNameAsString…EndSubPrivateSub命令1_Click()DimHerName=”王芳”

…EndSub

說(shuō)明上面程序中定義了4個(gè)變量,其中MyName變量是用Private定義在模塊的所有過(guò)程前,所以是模塊級(jí)變量,在本模塊的所有過(guò)程中均有效,在“命令0_Click”和“命令1_Click”中都可以使用此變量;YourName是用Public定義在模塊的所有過(guò)程前,是一個(gè)全局變量,不僅在本模塊中的任何一個(gè)過(guò)程中可以使用,而且在本模塊所在的工程中的其它代碼中也可使用;HisName和HerName都只是定義在各自的過(guò)程中,所以都是局部變量。注意:盡管在“命令0_Click”過(guò)程中沒(méi)有定義HerName變量,如果直接給HerName變量賦值,也不會(huì)出錯(cuò)。但是這個(gè)HerName變量是在“命令0_Click”過(guò)程中隱式定義的一個(gè)變量,和“命令1_Click”中的HerName變量不是同一個(gè)變量。例新建一個(gè)窗體,窗體上放置命令按鈕Command1和Command2。PublicaAsInteger,bAsIntegerPrivateSubCommand1_Click()DimaAsIntegerMsgBox“變量a:”&aMsgBox“變量b:”&bEndSubPrivateSubCommand2_Click()MsgBox“變量a:”&aMsgBox“變量b:”&bEndSubPrivateSubForm_Load()a=1b=1EndSub分析程序運(yùn)行即定義了a,b兩個(gè)全局變量,窗體運(yùn)行時(shí)執(zhí)行了Load事件后兩個(gè)變量都為1,當(dāng)點(diǎn)擊了Command1,在Command1_Click過(guò)程中定義了一個(gè)局部變量a,根據(jù)規(guī)定這個(gè)a變量自動(dòng)初始化為0,并且在本過(guò)程內(nèi)部屏蔽了全局變量a,所以此時(shí)的MsgBox函數(shù)顯示出a,b的值分別為0和1;當(dāng)點(diǎn)擊了Command2,Command2_Click過(guò)程MsgBox函數(shù)顯示出a,b的值均為1。變量的生命周期變量的生命周期是指變量值的有效存活期。對(duì)于模塊級(jí)和全局變量,其生命周期與應(yīng)用程序的生命周期相同,也就是說(shuō),應(yīng)用程序運(yùn)行時(shí),該變量總是起作用的。局部變量的生命周期又分為兩種情況:1.用Dim定義的局部變量用Dim定義的局部變量或直接使用一個(gè)新變量名,其值只能在所屬過(guò)程或函數(shù)的活動(dòng)期間有效。當(dāng)退出該過(guò)程或函數(shù)時(shí),該變量和它的值都將被清除。當(dāng)該過(guò)程或函數(shù)被再次調(diào)用執(zhí)行時(shí),將重新創(chuàng)建和初始化該變量。2.用Static定義的靜態(tài)變量用Static定義的變量稱為靜態(tài)變量,在所屬的過(guò)程或函數(shù)執(zhí)行結(jié)束后,其值仍然存在。在下次調(diào)用該過(guò)程時(shí),其值不被重置,仍保留原來(lái)(上次運(yùn)行結(jié)束時(shí))的結(jié)果,直到模塊被復(fù)位或重新啟動(dòng)。

例如,在一個(gè)函數(shù)中編寫(xiě)如下代碼:StaticaAsIntegera=a+1說(shuō)明由于用Static定義的變量a是一個(gè)靜態(tài)變量,所以在第一次執(zhí)行該函數(shù)時(shí),a的結(jié)果是1。函數(shù)執(zhí)行完畢后,變量a仍然保存在內(nèi)存中。第二次再執(zhí)行該函數(shù)時(shí)就在原來(lái)1的基礎(chǔ)上再次加1,所以第二次運(yùn)行完畢后變量a的結(jié)果為2。如果要清除過(guò)程中的靜態(tài)變量,選擇“運(yùn)行”菜單的“重新設(shè)置”命令。

10.2Access常用的對(duì)象事件在前面的章節(jié)中我們已經(jīng)學(xué)習(xí)了事件和事件過(guò)程,在本節(jié)中我們將主要討論Access中的對(duì)象事件。我們知道VBA是面向?qū)ο蟮母呒?jí)程序語(yǔ)言,在VBA中有一類特殊的過(guò)程,它們的執(zhí)行是通過(guò)動(dòng)作來(lái)觸發(fā)執(zhí)行的。這就是一種事件驅(qū)動(dòng)機(jī)制。那么我們?cè)鯓觼?lái)理解呢?其實(shí)在日常生活中,我們無(wú)時(shí)無(wú)刻不處在事件以及對(duì)事件的處理中。例如,交通路口指示燈的變化、電話鈴響、有人喊我們的名字等等,這些都是事件。當(dāng)這些事件發(fā)生時(shí),我們會(huì)采取相應(yīng)的行動(dòng);如果交通燈是紅色的,就要停下來(lái);電話鈴響了,就要接電話。由此可以看出,作為客體的我們也可以叫做一個(gè)被事件驅(qū)動(dòng)的人。在Access中通過(guò)對(duì)窗體或報(bào)表上的控件等對(duì)象施加某種動(dòng)作,例如,用鼠標(biāo)單擊按鈕、窗體或報(bào)表的打開(kāi)等,這樣就發(fā)生了事件。如何處理、響應(yīng)這些事件呢?在Access中是通過(guò)兩種方式來(lái)處理窗體、報(bào)表或控件的事件響應(yīng)。一是使用宏對(duì)象來(lái)設(shè)置事件屬性;二是為某個(gè)事件編寫(xiě)VBA代碼過(guò)程,這樣的代碼過(guò)程稱為事件過(guò)程或事件響應(yīng)代碼。編寫(xiě)事件過(guò)程是最常用的事件處理方法。在VBA中,使用一種特殊的命名方式來(lái)命名事件過(guò)程,這種格式的一般形式是:“對(duì)象名_事件”。當(dāng)該對(duì)象發(fā)生事件時(shí),系統(tǒng)就去尋找相應(yīng)的處理過(guò)程來(lái)處理它,也就是說(shuō),每個(gè)事件都可以由一段程序驅(qū)動(dòng)來(lái)響應(yīng)。Access窗體、報(bào)表和控件的事件有很多,下面我們將介紹一些常用的事件過(guò)程。鍵盤(pán)事件鍵盤(pán)事件是用戶操作鍵盤(pán)所引發(fā)的事件,常用的鍵盤(pán)事件有鍵按下(KeyDown)、鍵釋放(KeyUp)、擊鍵(KeyPress)等。1.鍵按下事件當(dāng)在某對(duì)象上按下鍵盤(pán)上的任意鍵時(shí)都會(huì)觸發(fā)該事件,其事件定義格式如下:PrivateSub對(duì)象_KeyDown(KeyCodeAsInteger,ShiftAsInteger)參數(shù):KeyCode為按鍵的位置碼,Shift為3個(gè)狀態(tài)鍵(Shift、Ctrl和Alt)的狀態(tài)。2.鍵釋放事件當(dāng)在某對(duì)象上釋放鍵盤(pán)上的任意鍵時(shí)都會(huì)觸發(fā)該事件,其事件定義格式如下:PrivateSub對(duì)象_KeyUp(KeyCodeAsInteger,ShiftAsInteger)3.擊鍵事件當(dāng)在某對(duì)象上按下鍵盤(pán)上的任意字符按鍵時(shí)都會(huì)觸發(fā)該事件,其事件定義格式如下:PrivateSub對(duì)象_KeyPress(KeyAsciiAsInteger)參數(shù):KeyAscii為返回按鍵的Ascii碼值。例以下示例確定是否已經(jīng)按下Shift、Ctrl或Alt按鍵。要求:新建一個(gè)窗體名稱為Form1,在窗體上放置一個(gè)文本框?qū)ο螅Q為ytest1,顯示內(nèi)容為“鍵盤(pán)事件的測(cè)試”,然后打開(kāi)文本框的屬性對(duì)話框,在事件選項(xiàng)卡下選擇“鍵按下”事件過(guò)程。其代碼如下:PrivateSubytest_KeyDown(KeyCodeAsInteger,ShiftAsInteger)DimintShiftDownAsInteger,intAltDownAsIntegerDimintCtrlDownAsInteger‘使用位掩碼確定按下了哪個(gè)鍵intShiftDown=(ShiftAndacShiftMask)>0intAltDown=(ShiftAndacAltMask)>0intCtrlDown=(ShiftAndacCtrlMask)>0‘顯示消息,表示用戶按下的鍵IfintShiftDownThenMsgBox“您按下了SHIFT鍵!”

EndifIfintAltDownThenMsgBox“您按下了ALT鍵!”EndifIfintCtrlDownThenMsgBox“您按下了CTRL鍵!”EndifEndSub運(yùn)行結(jié)果如下:將窗體切換到窗體視圖,在文本框中單擊Shift、Alt或Ctrl鍵查看顯示結(jié)果。結(jié)果如圖11.11所示。圖鍵盤(pán)KeyDown事件的測(cè)試?yán)韵率纠菔荆?dāng)文本框獲取焦點(diǎn)時(shí),接收按下的鍵盤(pán)上的字母鍵并將其轉(zhuǎn)化為大寫(xiě)字母顯示在文本框中。要求:在上例的窗體Form1上放置一個(gè)文本框?qū)ο螅Q為ytest2,顯示內(nèi)容為“鍵盤(pán)事件的測(cè)試2”,然后打開(kāi)文本框的屬性對(duì)話框,在事件選項(xiàng)卡下選擇“擊鍵”事件過(guò)程。其代碼如下:PrivateSubytest2_KeyPress(KeyAsciiAsInteger)Char=Chr(KeyAscii)KeyAsch=Asc(UCase(Char))EndSub運(yùn)行結(jié)果如下:將窗體切換到窗體視圖,在文本框中輸入字符student查看顯示結(jié)果。結(jié)果如圖11.12所示。圖鍵盤(pán)KeyPress事件的測(cè)試鼠標(biāo)事件鼠標(biāo)事件即在操作鼠標(biāo)所引發(fā)的事件,常用的鼠標(biāo)事件有單擊(Click)、雙擊(DblClick)、鼠標(biāo)按下(MouseDown)、鼠標(biāo)釋放(MouseUp)和鼠標(biāo)移動(dòng)(MouseMove)等。1.單擊事件當(dāng)在某對(duì)象上單擊鼠標(biāo)左鍵時(shí)觸發(fā)該事件,其事件定義格式如下:PrivateSub對(duì)象_Click()2.雙擊事件當(dāng)在某對(duì)象上雙擊鼠標(biāo)左鍵時(shí)觸發(fā)該事件,其事件定義格式如下:PrivateSub對(duì)象_DblClick(CancelAsInteger)參數(shù):Cancel決定該操作是否能夠有效。3.鼠標(biāo)按下事件當(dāng)在某對(duì)象上按下鼠標(biāo)左鍵時(shí)觸發(fā)該事件,其事件定義格式如下:PrivateSub對(duì)象_MouseDown(ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle)參數(shù):Button為按鍵的信息,Shift為3個(gè)狀態(tài)鍵(Shift、Ctrl和Alt)的狀態(tài),參數(shù)X,Y為按下鼠標(biāo)按鍵時(shí)鼠標(biāo)所在的位置。4.鼠標(biāo)釋放事件當(dāng)在某對(duì)象上釋放鼠標(biāo)左鍵時(shí)觸發(fā)事件,其事件定義格式如下:PrivateSub對(duì)象_MouseUp(ButtonAsInteger,ShiftAsIneger,XAsSingle,YAsSingle)參數(shù):Button為按鍵的信息,Shift為3個(gè)狀態(tài)鍵(Shift、Ctrl和Alt)的狀態(tài),參數(shù)X,Y為按下鼠標(biāo)按鍵時(shí)鼠標(biāo)所在的位置。5.鼠標(biāo)移動(dòng)事件當(dāng)在某對(duì)象移鼠標(biāo)時(shí)觸發(fā)該事件,其事件定義格式如下:PrivateSub對(duì)象_MouseMove(ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle)參數(shù):Button為按鍵的信息,Shift為3個(gè)狀態(tài)鍵(Shift、Ctrl和Alt)的狀態(tài),參數(shù)X,Y為按下鼠標(biāo)按鍵時(shí)鼠標(biāo)所在的位置。例以下示例確定鼠標(biāo)位置,以及是否按下了鼠標(biāo)左鍵或Shift按鍵。當(dāng)移動(dòng)鼠標(biāo)時(shí),鼠標(biāo)指針位置的X和Y坐標(biāo)將顯示在標(biāo)簽控件中。測(cè)試此示例,請(qǐng)將下列事件過(guò)程添加到窗體Formycx1中,窗體標(biāo)題為“MouseEvent”,并使該窗體含有一個(gè)名為ycx0的標(biāo)簽。PrivateSubFormycx1_MuseMove(ButtonAsInteger,ShiftAsInteger,XAsInteger,YAsInteger)DimintShiftDownAsInteger,intLeftButtonAsIntegerMe!ycx0.Caption=X&”,”&Y‘使用位掩碼確定‘Shift鍵和鼠標(biāo)左按鈕的狀態(tài)intShiftDown=ShiftAndacShiftMaskintLeftButton=ButtonAndacLeftButton‘檢查是否同時(shí)按下Shift鍵和鼠標(biāo)左按鈕IfintShiftDownAndintLeftButton>0ThenMsgBox””EndIfEndSub運(yùn)行結(jié)果如下:將窗體切換到窗體視圖,并且同時(shí)單擊Shift鍵和鼠標(biāo)左鍵,注意查看標(biāo)簽控件的變化及提示框,結(jié)果如圖11.13所示。圖MouseMove鼠標(biāo)事件的測(cè)試窗口事件窗口事件是指操作窗口時(shí)引發(fā)的事件。常用的窗口事件有打開(kāi)(Open)、關(guān)閉(Close)、調(diào)整大小(Resize)、激活(Activate)、停用(Deactivate)、加載(Load)和卸載(Unload)等。1.打開(kāi)事件在打開(kāi)一個(gè)窗體和報(bào)表時(shí)觸發(fā)該事件,其事件定義格式如下:PrivateSub對(duì)象_Open(CancelAsInteger)參數(shù):Cancel決定該操作是否能夠有效地進(jìn)行。當(dāng)Cancel的值為0時(shí)窗口被打開(kāi);當(dāng)Cancel的值為1時(shí)窗口將不被打開(kāi)。2.關(guān)閉事件當(dāng)關(guān)閉一個(gè)窗體和報(bào)表時(shí)觸發(fā)該事件,其事件定義格式如下:PrivateSub對(duì)象_Close()3.加載事件當(dāng)一個(gè)窗體被別載時(shí)觸發(fā)該事件,其事件定義格式如下:PrivateSub對(duì)象_Load()在該事件中可以進(jìn)行一些窗體的初始化工作。4.卸載事件當(dāng)一個(gè)窗體被卸載觸發(fā)該事件,其事件定義格式如下:PrivateSub對(duì)象_Unload(CancelAsInteger)例以下示例測(cè)試窗體的打開(kāi)事件。示例顯示在用戶單擊“否”按鈕時(shí),如何取消窗體的打開(kāi)事件。如果用戶單擊“否”,F(xiàn)orm1窗體將不打開(kāi)如果要試驗(yàn)此示例,請(qǐng)將下列事件代碼添加到窗體中。PrivateSubForm1_Open(CancelAsInteger)DimintReturnAsIntegerintReturn=MsgBox(“現(xiàn)在打開(kāi)form1窗體嗎?”,vbYesNo)SelectCaseintReturnCasevbYesDoCmd.OpenForm”form1”‘打開(kāi)form1窗體

CasevbNoMsgBox”RemembertoenterForm1by5P.M.”Cancel=True‘取消Open事件EndSelectEndSub運(yùn)行結(jié)果如下:將窗體切換到窗體視圖,即打開(kāi)窗體時(shí),顯示如下結(jié)果,如圖11.14所示。圖窗口事件的測(cè)試對(duì)象事件對(duì)象事件是指當(dāng)對(duì)對(duì)象進(jìn)行操作時(shí)所引發(fā)的事件。常用的對(duì)象事件有獲得焦點(diǎn)(GetFocus)、失去焦點(diǎn)(LostFocus)、更新前(BeforeUpdate)、更新后(AfterUpdate)和更改(Change)等。1.獲得焦點(diǎn)事件當(dāng)一個(gè)對(duì)象由沒(méi)有焦點(diǎn)的狀態(tài)變?yōu)橛薪裹c(diǎn)的狀態(tài)時(shí)觸發(fā)的事件,其事件定義格式如下:PrivateSub對(duì)象_GetFocus()2.失去焦點(diǎn)事件當(dāng)一個(gè)對(duì)象由有焦點(diǎn)的狀態(tài)變?yōu)闆](méi)有焦點(diǎn)的狀態(tài)時(shí)的事件,其事件定義格式如下:PrivateSub對(duì)象_GetFocus()3.更新前事件對(duì)象中的數(shù)據(jù)被修改時(shí),當(dāng)按下鍵,或?qū)⒔裹c(diǎn)從該對(duì)象上移開(kāi)時(shí)觸發(fā)該事件,其事件定義格式如下:PrivateSub對(duì)象_BeforeUpdate(CancelAsInteger)該事件可以用于檢驗(yàn)數(shù)據(jù)輸入的有效性,當(dāng)輸入無(wú)效數(shù)據(jù)時(shí),可以將參數(shù)Cancel設(shè)置為1,此時(shí)就無(wú)法將焦點(diǎn)從該對(duì)象上移開(kāi)。例要求對(duì)學(xué)生信息窗體上的學(xué)生編號(hào)文本框控件ycx3中輸入的數(shù)據(jù)進(jìn)行驗(yàn)證。要求:該文本框中只接受200到400之間的數(shù)值數(shù)據(jù),提示取消不合法的數(shù)據(jù)。PrivateSuby3_BeforeUpdate(CancelAsInteger)IfMe!Y3=””O(jiān)rIsNull(Me!Y3)Then‘?dāng)?shù)據(jù)為空時(shí)的驗(yàn)證MsgBox”學(xué)生編號(hào)不能為

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論