《VB》課件-第8章過(guò)程_第1頁(yè)
《VB》課件-第8章過(guò)程_第2頁(yè)
《VB》課件-第8章過(guò)程_第3頁(yè)
《VB》課件-第8章過(guò)程_第4頁(yè)
《VB》課件-第8章過(guò)程_第5頁(yè)
已閱讀5頁(yè),還剩58頁(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)介

第八章過(guò)程8.1過(guò)程概述8.2子程序過(guò)程(Sub過(guò)程)8.3函數(shù)(Fountion過(guò)程)8.4過(guò)程之間的參數(shù)傳遞8.5過(guò)程和變量的作用域8.1過(guò)程概述過(guò)程:一個(gè)實(shí)際應(yīng)用程序可分解成多個(gè)具有獨(dú)立功能的邏輯程序段來(lái)實(shí)現(xiàn)程序的完整功能,這些邏輯程序段被稱為過(guò)程。VisualBasic中的過(guò)程:內(nèi)部過(guò)程和外部過(guò)程。內(nèi)部過(guò)程是由系統(tǒng)提供的程序段,用戶在編寫(xiě)程序時(shí),可以使用內(nèi)部過(guò)程名直接調(diào)用內(nèi)部過(guò)程。外部過(guò)程是用戶根據(jù)需要自己定義編寫(xiě)的程序段。外部過(guò)程可分為事件過(guò)程和通用過(guò)程。事件過(guò)程附加在窗體或控件上,是當(dāng)某事件發(fā)生時(shí),對(duì)象對(duì)該事件做出響應(yīng)的程序代碼。通用過(guò)程:在實(shí)際編程中,有時(shí)會(huì)有多個(gè)不同的事件過(guò)程需要使用同一段程序代碼。這時(shí)把這段代碼獨(dú)立出來(lái),編寫(xiě)成為一個(gè)共用的過(guò)程,即通用過(guò)程,它可供其他事件過(guò)程調(diào)用。通用過(guò)程根據(jù)是否返回值,可分為子程序過(guò)程(Sub過(guò)程)和函數(shù)過(guò)程(Function過(guò)程)。子程序過(guò)程不返回值,函數(shù)過(guò)程返回函數(shù)值?!鲎映绦蜻^(guò)程的定義定義子程序過(guò)程有兩種方法:一種是使用“添加過(guò)程”對(duì)話框,另一種是直接在代碼窗口中輸入過(guò)程代碼。8.2子程序過(guò)程(Sub過(guò)程)1.使用“添加過(guò)程”對(duì)話框創(chuàng)建■子程序過(guò)程的定義8.2子程序過(guò)程(Sub過(guò)程)2.直接在代碼窗口中定義在窗體或標(biāo)準(zhǔn)模塊的代碼窗口中,按以下格式輸入相應(yīng)的代碼:[Public|Private][Static]Sub<過(guò)程名>([形參列表])[語(yǔ)句塊1][ExitSub][語(yǔ)句塊2]EndSub■子程序過(guò)程的定義8.2子程序過(guò)程(Sub過(guò)程)說(shuō)明:Private:表示Sub過(guò)程是一個(gè)私有過(guò)程,只限于本模塊內(nèi)的其他過(guò)程調(diào)用。Public:表示Sub過(guò)程是一個(gè)公有過(guò)程,可在整個(gè)應(yīng)用程序范圍調(diào)用。Static:表示Sub過(guò)程中的所有局部變量的存儲(chǔ)空間只分配一次,且這些變量的值在整個(gè)程序運(yùn)行期間都存在。過(guò)程名:用戶為Sub過(guò)程起的名字。命名規(guī)則與變量命名規(guī)則相同。同一模塊內(nèi),Sub過(guò)程不能和Function過(guò)程同名。形參列表:類(lèi)似于變量聲明,它指明了從調(diào)用過(guò)程傳遞給過(guò)程的參量個(gè)數(shù)、類(lèi)型和位置,形參可以是變量名或數(shù)組名。各參數(shù)之間用“,”隔開(kāi)。參數(shù)定義格式:[ByVal|ByRef]變量名[()][As數(shù)據(jù)類(lèi)型][,…]ByVal表示該過(guò)程被調(diào)用時(shí),參數(shù)是按值傳遞的;默認(rèn)或ByRef表示該過(guò)程被調(diào)用時(shí),參數(shù)是按地址傳遞的。ExitSub:表示退出Sub過(guò)程,常常是與選擇結(jié)構(gòu)聯(lián)用,即當(dāng)滿足一定條件時(shí),退出Sub過(guò)程?!鲎映绦蜻^(guò)程的定義8.2子程序過(guò)程(Sub過(guò)程)例【8-1】編一個(gè)交換兩個(gè)整型變量值的Sub過(guò)程。PrivateSubswap(aAsInteger,bAsInteger)DimtAsIntegert=a:a=b:b=tEndSub■子程序過(guò)程的調(diào)用8.2子程序過(guò)程(Sub過(guò)程)子程序過(guò)程的調(diào)用有兩種方法。1.使用Call語(yǔ)句Call[窗體名|模塊名.]<過(guò)程名>[(實(shí)參列表)]如:Callswap(m,n)或CallForm1.swap(m,n)2.直接使用過(guò)程名[窗體名|模塊名.]<過(guò)程名>[<實(shí)參列表>]如:swapm,n

或Form1.swapm,n說(shuō)明:直接使用過(guò)程名調(diào)用時(shí)必須省略參數(shù)兩邊的括號(hào)。使用Call語(yǔ)句調(diào)用時(shí),沒(méi)有參數(shù),()也能省,否則參數(shù)必須在括號(hào)內(nèi)。在調(diào)用時(shí)實(shí)參和形參的數(shù)據(jù)類(lèi)型、順序、個(gè)數(shù)必須匹配。■子程序過(guò)程的調(diào)用8.2子程序過(guò)程(Sub過(guò)程)例【8-2】調(diào)用前面的交換兩個(gè)整數(shù)的Sub過(guò)程。PrivateSubForm_Click()DimfirstAsInteger,secondAsIntegerfirst=Val(InputBox("請(qǐng)輸入第一個(gè)整數(shù)"))second=Val(InputBox("請(qǐng)輸入第二個(gè)整數(shù)"))Print"交換前first=";first,"second=";secondswapfirst,secondPrint"交換后first=";first,"second=";secondEndSubPrivateSubswap(aAsInteger,bAsInteger)DimtAsIntegert=a:a=b:b=tEndSub形參實(shí)參■子程序過(guò)程的調(diào)用8.2子程序過(guò)程(Sub過(guò)程)例【8-3】編寫(xiě)一個(gè)程序,在文本框(Text1)中輸入一個(gè)正整數(shù),當(dāng)單擊命令按鈕(Command1)時(shí),調(diào)用Sub過(guò)程輸出其階乘。

■子程序過(guò)程的調(diào)用8.2子程序過(guò)程(Sub過(guò)程)創(chuàng)建步驟:(1)新建一個(gè)工程,在窗體中添加兩個(gè)標(biāo)簽,一個(gè)文本框和一個(gè)命令按鈕,并按圖8-3設(shè)置它們的屬性。(2)在代碼窗口輸入下列代碼:PrivateSubCommand1_Click()DimjiAsLong,aAsIntegera=Val(Text1.Text)facta,jiLabel2.Caption="其階乘為:"&jiEndSubPrivateSubfact(nAsInteger,fAsLong)DimiAsIntegerf=1Fori=1Tonf=f*iNextEndSub■函數(shù)過(guò)程(Function過(guò)程)的定義

8.3函數(shù)(Function過(guò)程)函數(shù)過(guò)程是用戶根據(jù)需要用Function關(guān)鍵字定義的過(guò)程,與Sub過(guò)程不同的是函數(shù)過(guò)程返回一個(gè)值。格式:[Public|Private][Static]Function<函數(shù)名>([形參列表])As<類(lèi)型>[語(yǔ)句塊1][函數(shù)名=返回值][ExitFunction][語(yǔ)句塊2][函數(shù)名=返回值]EndFunction說(shuō)明:As<類(lèi)型>:是指函數(shù)的返回值類(lèi)型,若省略,則函數(shù)返回Variant類(lèi)型。ExitFunction:常常是與選擇結(jié)構(gòu)聯(lián)用,即當(dāng)滿足一定條件時(shí),退出Function過(guò)程。在函數(shù)體內(nèi),函數(shù)名可以當(dāng)變量名使用,函數(shù)值通過(guò)函數(shù)名返回,因此在函數(shù)過(guò)程中至少要對(duì)函數(shù)名賦值一次?!龊瘮?shù)過(guò)程(Function過(guò)程)的定義

8.3函數(shù)(Function過(guò)程)例【8-4】編寫(xiě)一個(gè)函數(shù)過(guò)程,當(dāng)調(diào)用該過(guò)程時(shí),能求出一個(gè)正整數(shù)的階乘值。PrivateFunction

fact(nAsInteger)AsLongDimiAsIntegerf=1Fori=1Tonf=f*iNextfact=fEndFunction

■函數(shù)過(guò)程的調(diào)用

8.3函數(shù)(Function過(guò)程)例【8-5】利用例【8-4】的函數(shù)過(guò)程,編寫(xiě)一個(gè)與例【8-3】一樣功能的程序。在文本框(Text1)中輸入一個(gè)正整數(shù),當(dāng)單擊命令按鈕(Command1)時(shí),調(diào)用例【8-4】函數(shù)過(guò)程輸出其階乘。編寫(xiě)程序代碼PrivateSubCommand1_Click()DimjiAsLong,aAsIntegera=Val(Text1.Text)

ji=fact(a)Label2.Caption="其階乘為:"&jiEndSub例【8-5】PrivateFunctionfact(nAsInteger)AsLongDimiAsIntegerf=1Fori=1Tonf=f*iNextfact=fEndFunction■函數(shù)過(guò)程的調(diào)用

8.3函數(shù)(Function過(guò)程)例【8-6】編寫(xiě)一個(gè)求兩個(gè)數(shù)中較大數(shù)的函數(shù)過(guò)程。然后調(diào)用該函數(shù)過(guò)程求任意兩個(gè)數(shù)中較大的數(shù)。PrivateFunctionmax(aAsSingle,bAsSingle)AsSinglemax=IIf(a>=b,a,b)EndFunctionPrivateSubCommand1_Click()DimmAsSingle,nAsSinglem=Text1.Text:n=Text2.TextLabel3.Caption="大數(shù)為:"&max(m,n)EndSub■形式參數(shù)和實(shí)際參數(shù)

8.4過(guò)程之間的參數(shù)傳遞1.形式參數(shù)形式參數(shù)簡(jiǎn)稱形參,是指在定義通用過(guò)程時(shí),出現(xiàn)在Sub或Function語(yǔ)句中過(guò)程名后面圓括號(hào)內(nèi)的變量名,是用來(lái)接收傳送給過(guò)程的數(shù)據(jù),形參列表中的各形式參數(shù)之間用逗號(hào)分隔。2.實(shí)際參數(shù)實(shí)際參數(shù)簡(jiǎn)稱實(shí)參,是指在調(diào)用Sub或Function過(guò)程時(shí),寫(xiě)入過(guò)程名后面圓括號(hào)內(nèi)的參數(shù)。其作用是將它們的數(shù)據(jù)(數(shù)值或地址)傳送給Sub或Function過(guò)程與其對(duì)應(yīng)的形參變量。實(shí)參列表可由常量、表達(dá)式、有效的變量名、數(shù)組名(后加左右圓括號(hào),如Arr())組成,實(shí)參表中的各實(shí)際參數(shù)之間用逗號(hào)分隔?!鲂问絽?shù)和實(shí)際參數(shù)

8.4過(guò)程之間的參數(shù)傳遞在過(guò)程調(diào)用時(shí)必須先完成“實(shí)參列表”與“形參列表”的結(jié)合,即把實(shí)參傳遞給形參,參數(shù)的傳遞是按實(shí)參與形參對(duì)應(yīng)位置進(jìn)行的,不是按同名的原則進(jìn)行的,這就要求實(shí)參與形參在類(lèi)型、個(gè)數(shù)、位置上要一一對(duì)應(yīng);然后按實(shí)參執(zhí)行調(diào)用的過(guò)程。■參數(shù)傳遞方式

8.4過(guò)程之間的參數(shù)傳遞在調(diào)用過(guò)程時(shí),參數(shù)的傳遞有兩種方式:按地址傳遞(即傳址)和按值傳遞(傳值),其中按地址傳遞方式是默認(rèn)方式。按值傳遞(傳值):當(dāng)定義過(guò)程時(shí)在形參前加上ByVal關(guān)鍵字或在傳遞實(shí)參時(shí)實(shí)參為常量或表達(dá)式。按地址傳遞(即傳址):當(dāng)定義過(guò)程時(shí)在形參前加上ByRef關(guān)鍵字時(shí)參數(shù)的傳遞方式就是傳址方式或缺省沒(méi)有關(guān)鍵字“ByVal”。VB6.0中參數(shù)的傳遞方式默認(rèn)為傳址方式。1.傳值將實(shí)參的數(shù)值傳遞給過(guò)程中對(duì)應(yīng)的形參變量。按值傳遞參數(shù)時(shí),VisualBasic給傳遞的形參分配一個(gè)臨時(shí)的內(nèi)存單元,將實(shí)參的值傳遞到這個(gè)臨時(shí)單元中去。按值傳遞是單向的。如果在被調(diào)用過(guò)程中改變了形參變量的值,則只是變動(dòng)了臨時(shí)單元的值,不會(huì)影響實(shí)參變量的值。當(dāng)被調(diào)過(guò)程結(jié)束返回調(diào)用過(guò)程時(shí),VisualBasic釋放形參變量的臨時(shí)單元,實(shí)參變量的值不變。■參數(shù)傳遞方式

8.4過(guò)程之間的參數(shù)傳遞2.傳址(默認(rèn)方式)是一種將實(shí)參的地址傳遞給過(guò)程中對(duì)應(yīng)形參變量的方式,形參變量和實(shí)參變量具有相同的地址,即形參、實(shí)參共用一存儲(chǔ)單元。按地址傳遞是雙向的。如果在被調(diào)用過(guò)程中改變了形參變量的值,當(dāng)被調(diào)過(guò)程結(jié)束返回調(diào)用過(guò)程時(shí),實(shí)參變量的值也改變。

實(shí)參的使用形式?jīng)Q定數(shù)據(jù)的傳遞方式。

在過(guò)程調(diào)用時(shí),如果實(shí)參是常量或表達(dá)式,無(wú)論過(guò)程定義時(shí)使用按地址傳遞(即傳址)還是按值傳遞(即傳值),此時(shí)都是按值傳遞方式將常量或表達(dá)式計(jì)算的值傳遞給形參變量。如果在定義時(shí)是按地址傳遞(即傳址),但調(diào)用時(shí)想使實(shí)參按值傳遞,可以把實(shí)參變量加上圓括號(hào),將其轉(zhuǎn)換為表達(dá)式。

■參數(shù)傳遞方式

8.4過(guò)程之間的參數(shù)傳遞例【8-7】傳址和傳值方式的比較。編寫(xiě)交換兩個(gè)數(shù)的過(guò)程程序代碼Swap1和Swap2。Swap1按地址傳遞參數(shù),Swap2按值傳遞參數(shù)。運(yùn)行程序,觀察它們的區(qū)別。

創(chuàng)建過(guò)程:(1)新建一個(gè)工程,在窗體中添加兩個(gè)命令按鈕,并按圖設(shè)置有關(guān)的對(duì)象屬性?!鰠?shù)傳遞方式

8.4過(guò)程之間的參數(shù)傳遞(2)編寫(xiě)兩個(gè)過(guò)程Swap1和Swap2:SubSwap1(xAsInteger,yAsInteger)DimtAsIntegert=x:x=y:y=tEndSubSubSwap2(ByValxAsInteger,ByValyAsInteger)DimtAsIntegert=x:x=y:y=tEndSub(3)編寫(xiě)兩個(gè)命令按鈕單擊事件過(guò)程如下:PrivateSubCommand1_Click()Print"按地址傳遞"DimaAsInteger,bAsIntegera=10:b=20Print"兩數(shù)交換前:a=";a;"b=";bSwap1a,bPrint"兩數(shù)交換后:a=";a;"b=";bEndSubPrivateSubCommand2_Click()Print"按值傳遞"DimaAsInteger,bAsIntegera=10:b=20Print"兩數(shù)交換前:a=";a;"b=";bSwap2a,bPrint"兩數(shù)交換后:a=";a;"b=";bEndSub■參數(shù)傳遞方式

8.4過(guò)程之間的參數(shù)傳遞實(shí)參ab實(shí)參ab

形參xy形參xy

改變前改變后

圖8-10按地址傳遞參數(shù)示意圖

10202010實(shí)參ab實(shí)參ab

形參xy形參xy

改變前改變后

圖8-11按數(shù)值傳遞參數(shù)示意圖1020201010201020形參、實(shí)參一塊變形參變、實(shí)參不變■參數(shù)傳遞方式

8.4過(guò)程之間的參數(shù)傳遞例【8-8】下面程序是在窗體單擊事件中,五次調(diào)用子過(guò)程Sxyz,每次使用了不同的實(shí)際參數(shù)。請(qǐng)認(rèn)真閱讀此程序,分析程序的輸出結(jié)果。

PrivateSubSxyz(aAsInteger)a=a+5Print"a=";a,EndSubPrivateSubForm_Click()DimxAsInteger,yAsInteger,zAsIntegerx=10:y=20Print“1:x=";x;‘x=10Sxyzx+y‘實(shí)參是用表達(dá)式,按值傳遞方式傳遞參數(shù),a=35Print“x=";x‘x=10Printz=x+yPrint"2:z=";z;‘z=30Sxyzz‘實(shí)參是用變量,按地址傳遞方式傳遞參數(shù),a=35■參數(shù)傳遞方式

8.4過(guò)程之間的參數(shù)傳遞Print"z=";z‘z=35PrintPrint"3:x=";x;‘x=10Sxyzx+5‘實(shí)參是用表達(dá)式,按值傳遞方式傳遞參數(shù),a=20Print"x=";x‘x=10PrintPrint"4:x=";x;‘x=10Sxyz(x)

‘實(shí)參是用括號(hào)強(qiáng)行轉(zhuǎn)換表達(dá)式,按值傳遞方式傳遞參數(shù),a=15Print"x=";x‘x=10PrintPrint"5:x=";x;‘x=10Sxyzx

‘實(shí)參是用變量,按地址傳遞方式傳遞參數(shù),a=15Print"x=";x‘x=15EndSub■參數(shù)傳遞方式

8.4過(guò)程之間的參數(shù)傳遞例【8-9】編寫(xiě)程序,求任意兩個(gè)正整數(shù)的最大公約數(shù)和最小公倍數(shù)。編程思路:求最大公約數(shù)可以使用“輾轉(zhuǎn)相除法”其步驟是:(1)以大數(shù)m作為被除數(shù),小數(shù)n作為除數(shù),相除后余數(shù)為r。(2)若r不為零,則mn,nr,繼續(xù)相除得到新的r。若r不為零,則重復(fù)此過(guò)程,直到r=0。(3)最后的n(除數(shù))就是最大公約數(shù)。思考m、n為何值?■參數(shù)傳遞方式

8.4過(guò)程之間的參數(shù)傳遞流程圖■參數(shù)傳遞方式

8.4過(guò)程之間的參數(shù)傳遞編程步驟:(1)新建一工程,在窗體上添加四個(gè)標(biāo)簽、兩個(gè)文本框和一個(gè)命令按鈕并設(shè)置有關(guān)對(duì)象屬性如圖所示。(2)根據(jù)編程思路,編寫(xiě)如下求最大公約數(shù)的函數(shù)過(guò)程:FunctionHef(ByValmAsLong,ByValnAsLong)AsLongDimrAsLong,tAsLongIfm<nThent=m:m=n:n=tEndIfr=mModn

DoWhiler<>0m=nn=rr=mModnLoopHef=n’函數(shù)返回最大公約數(shù)EndFunction■參數(shù)傳遞方式

8.4過(guò)程之間的參數(shù)傳遞(3)編寫(xiě)命令按鈕的單擊事件過(guò)程如下:PrivateSubCommand1_Click()DimaAsLong,bAsLongDimcAsLong,dAsLonga=Val(Text1.Text)b=Val(Text2.Text)c=Hef(a,b)Label3="最大公約數(shù):"&Str(c)d=a*b/cLabel4="最小公倍數(shù):"&Str(d)EndSub請(qǐng)注意:如果使用按地址傳遞參數(shù)方法定義函數(shù),在計(jì)算最小公倍數(shù)時(shí),就得不到正確的結(jié)果,為什么??!鰯?shù)組作過(guò)程參數(shù)

8.4過(guò)程之間的參數(shù)傳遞VisualBasic允許參數(shù)是數(shù)組,數(shù)組只能通過(guò)傳址的方式進(jìn)行傳遞。在傳遞數(shù)組時(shí)要注意:(1)在實(shí)參列表和形參列表中放入數(shù)組名,忽略維數(shù)的定義,但圓括號(hào)不能省略。(2)如果被調(diào)用過(guò)程不知道實(shí)參數(shù)組的上下界,可用LBound和UBound函數(shù)來(lái)確定實(shí)參的下界和上界。(3)實(shí)參數(shù)組和形參數(shù)組類(lèi)型必須一致。實(shí)參和形參的結(jié)合是按地址傳遞,即形參數(shù)組和實(shí)參數(shù)組共用一段內(nèi)存單元?!鰯?shù)組作過(guò)程參數(shù)

8.4過(guò)程之間的參數(shù)傳遞例【8-10】改寫(xiě)上章例【7-5】排序程序。用子過(guò)程Sort()來(lái)排序(流程圖見(jiàn)圖),用子過(guò)程GetData產(chǎn)生N個(gè)隨機(jī)整數(shù),用子過(guò)程PrintData()輸出N個(gè)數(shù)據(jù)元素。子過(guò)程Sort()的流程圖■數(shù)組作過(guò)程參數(shù)

8.4過(guò)程之間的參數(shù)傳遞PrivateSubForm_Click()Dimx(1To10)AsIntegerGetDatax()Print"排序前的數(shù)據(jù):"PrintDatax()PrintSortx()Print"排序后的數(shù)據(jù):"PrintDatax()EndSubPrivateSubSort(a()AsInteger)DimiAsInteger,jAsInteger,nAsInteger,tempAsIntegern=UBound(a)k=LBound(a)Fori=kTon-1'i控制輪次

Forj=kTon-i'對(duì)N-i個(gè)元素兩兩比較

Ifa(j)>a(j+1)Then'若次序不對(duì),則馬上交換位置

temp=a(j)

a(j)=a(j+1)

a(j+1)=tempEndIfNextjNextiEndSub■數(shù)組作過(guò)程參數(shù)

8.4過(guò)程之間的參數(shù)傳遞PrivateSubGetData(a()AsInteger)DimiAsInteger,nAsIntegern=UBound(a)k=LBound(a)Fori=kTona(i)=Int(Rnd*90)+10NextEndSubPrivateSubPrintData(a()AsInteger)DimiAsInteger,nAsIntegern=UBound(a)k=LBound(a)Fori=kTonPrinta(i);"";NextEndSub■可選參數(shù)和不確定參數(shù)*8.4過(guò)程之間的參數(shù)傳遞1.可選參數(shù)用戶在定義子過(guò)程或函數(shù)時(shí)可以定義可選參數(shù)。要指定某個(gè)形參為可選參數(shù),在形參變量前加入關(guān)鍵字Optional即可。如果一個(gè)過(guò)程某個(gè)形參為可選參數(shù),則在調(diào)用此過(guò)程時(shí)可以不提供對(duì)應(yīng)于這個(gè)形參的實(shí)參,并可以使用VisualBasic的內(nèi)部函數(shù)IsMissing來(lái)測(cè)試過(guò)程被調(diào)用時(shí)某個(gè)參數(shù)是否被省略。還可以指定可選參數(shù)的默認(rèn)取值。如果一個(gè)過(guò)程有多個(gè)形參,當(dāng)它的一個(gè)形參被設(shè)定為可選參數(shù),則這個(gè)參數(shù)后面的其他參數(shù)也必是可選的,并且要用Optional關(guān)鍵字來(lái)聲明?!隹蛇x參數(shù)和不確定參數(shù)*8.4過(guò)程之間的參數(shù)傳遞1.可選參數(shù)例【8-11】可選參數(shù)的使用。PrivateFunctionSum(aAsInteger,bAsInteger,OptionalcAsInteger)AsIntegerDimsAsIntegerIfIsMissing(c)Then‘參數(shù)c被省略則執(zhí)行s=a=bs=a+bElses=a+b+cEndIfSum=sEndFunctionPrivateSubForm_Click()PrintSum(1,2,3)‘提供了可選參數(shù),輸出結(jié)果為6PrintSum(1,2)‘未提供可選參數(shù),輸出結(jié)果為3

EndSub■可選參數(shù)和不確定參數(shù)*8.4過(guò)程之間的參數(shù)傳遞1.可選參數(shù)例【8-12】指定可選參數(shù)的默認(rèn)值。PrivateFunctionSum(aAsInteger,bAsInteger,OptionalcAsInteger=5)AsIntegerDimsAsIntegers=a+b+cSum=sEndFunctionPrivateSubForm_Click()PrintSum(1,2,3)'提供了可選參數(shù)PrintSum(1,2)'未提供可選參數(shù),用默認(rèn)值5EndSub程序運(yùn)行后,單擊窗體的輸出結(jié)果為:

68■可選參數(shù)和不確定參數(shù)*8.4過(guò)程之間的參數(shù)傳遞2.不確定參數(shù)一般說(shuō)來(lái),過(guò)程調(diào)用中的參數(shù)個(gè)數(shù)應(yīng)等于過(guò)程定義的參數(shù)個(gè)數(shù)。如果使用ParamArray關(guān)鍵字,則過(guò)程可以接受任意個(gè)數(shù)的參數(shù)。例【8-13】編寫(xiě)一個(gè)計(jì)算任意多個(gè)數(shù)據(jù)總和的Sum函數(shù),然后進(jìn)行簡(jiǎn)單應(yīng)用。PrivateSubForm_Click()PrintSum(1,2,3)PrintSum(1,2,3,4,5)EndSubPrivateFunctionSum(ParamArraya())AsIntegerDimiAsInteger,sAsIntegers=0Fori=LBound(a)ToUBound(a)s=s+a(i)NextSum=sEndFunction■代碼模塊

8.5過(guò)程和變量的作用域各種控件函數(shù)過(guò)程(Functionn)Sub過(guò)程事件過(guò)程一個(gè)或若干個(gè)窗體模塊文件(.frm)一個(gè)或若干個(gè)標(biāo)準(zhǔn)模塊文件(.bas)類(lèi)模塊文件(.cls)VB工程(*.Vbp)1.Sub過(guò)程2.事件過(guò)程圖8-18VisualBasic的應(yīng)用程序的結(jié)構(gòu)■代碼模塊

8.5過(guò)程和變量的作用域1.窗體模塊每個(gè)窗體對(duì)應(yīng)一個(gè)窗體模塊,窗體模塊包含窗體及其控件的屬性設(shè)置、窗體變量的說(shuō)明、事件過(guò)程、窗體內(nèi)的通用過(guò)程、外部過(guò)程的窗體級(jí)聲明。窗體模塊保存在擴(kuò)展名為.frm的文件中。默認(rèn)時(shí)應(yīng)用程序中只有一個(gè)窗體,因此有一個(gè)以.frm為擴(kuò)展名的文件。如果應(yīng)用程序有多個(gè)窗體,就會(huì)有多個(gè)以.frm為擴(kuò)展名的窗體模塊文件?!龃a模塊

8.5過(guò)程和變量的作用域2.標(biāo)準(zhǔn)模塊簡(jiǎn)單的應(yīng)用程序可以只有一個(gè)窗體,應(yīng)用程序的所有代碼都存放在窗體模塊中。而當(dāng)應(yīng)用程序龐大復(fù)雜時(shí),就要另加窗體。當(dāng)在幾個(gè)窗體中都有要執(zhí)行的公共代碼,又不希望在兩個(gè)窗體中重復(fù)相同的代碼時(shí),這就需要?jiǎng)?chuàng)建一個(gè)獨(dú)立的模塊,它包含公共代碼。這個(gè)獨(dú)立的模塊就是標(biāo)準(zhǔn)模塊。標(biāo)準(zhǔn)模塊保存在文件擴(kuò)展名為.bas的文件中,缺省時(shí)應(yīng)用程序中不包含標(biāo)準(zhǔn)模塊。■代碼模塊

8.5過(guò)程和變量的作用域2.標(biāo)準(zhǔn)模塊在工程中添加標(biāo)準(zhǔn)模塊的步驟為:(1)從“工程”菜單中執(zhí)行“添加模塊”命令,則打開(kāi)“添加模塊”對(duì)話框中的“新建”選項(xiàng)卡,如圖8-22所示。(2)在該對(duì)話框中雙擊“模塊”圖標(biāo),將打開(kāi)新建標(biāo)準(zhǔn)模塊窗口,如圖8-23所示(3)新添加的第一個(gè)標(biāo)準(zhǔn)模塊,其名稱為“Module1”,可以通過(guò)屬性窗口,給模塊命名。接下來(lái)就是在標(biāo)準(zhǔn)模塊的代碼窗口編寫(xiě)程序?!龃a模塊

8.5過(guò)程和變量的作用域3.類(lèi)模塊在VisualBasic中類(lèi)模塊(文件擴(kuò)展名為.cls)是面向?qū)ο缶幊痰幕A(chǔ)。可在類(lèi)模塊中編寫(xiě)代碼建立新對(duì)象,這些新對(duì)象可以包含自定義的屬性和方法,可以在應(yīng)用程序內(nèi)的過(guò)程中使用。■過(guò)程的作用域8.5過(guò)程和變量的作用域1.模塊級(jí)過(guò)程模塊級(jí)過(guò)程是在某個(gè)模塊(文件)內(nèi)定義的過(guò)程,在Sub或Function前加關(guān)鍵字Private,則該過(guò)程只能在本模塊中定義的過(guò)程調(diào)用,即其作用域?yàn)楸灸K(文件)。過(guò)程的作用域分為模塊級(jí)(或稱文件級(jí))和全局級(jí)(或稱工程級(jí)或項(xiàng)目級(jí))■過(guò)程的作用域8.5過(guò)程和變量的作用域2.全局級(jí)過(guò)程全局級(jí)過(guò)程是在定義過(guò)程時(shí),在Sub或Function前加關(guān)鍵字Public(可以默認(rèn)),則該過(guò)程能在整個(gè)應(yīng)用程序的所有模塊定義的過(guò)程調(diào)用,即其作用域?yàn)檎麄€(gè)應(yīng)用程序(工程)調(diào)用時(shí)的規(guī)則如下:在標(biāo)準(zhǔn)模塊內(nèi)定義的公有過(guò)程,調(diào)用時(shí)只需寫(xiě)出過(guò)程名和所需參數(shù);如果是在窗體模塊內(nèi)定義的公有過(guò)程,那么其他窗體來(lái)調(diào)用它時(shí),應(yīng)在過(guò)程名前指明它所在的窗體;在不同模塊中定義的全局級(jí)過(guò)程可以同名,調(diào)用時(shí)如果在過(guò)程名前一律加上模塊名,則不論什么情況都沒(méi)問(wèn)題?!鲞^(guò)程的作用域8.5過(guò)程和變量的作用域例【8-14】模塊級(jí)、全局級(jí)過(guò)程的使用。應(yīng)用程序(工程)包括一個(gè)窗體,在窗體代碼窗口的代碼如下:PublicFunctionArea(xAsSingle,yAsSingle)Area=x*yEndFunctionPrivateSubCommand1_Click()DimaAsSingle,bAsSinglea=Val(Text1.Text)b=Val(Text2.Text)Label3=Area(a,b)EndSub■過(guò)程的作用域8.5過(guò)程和變量的作用域表8-1不同作用范圍的兩種過(guò)程定義及調(diào)用規(guī)則全局級(jí)模塊級(jí)定義位置窗體標(biāo)準(zhǔn)模塊窗體標(biāo)準(zhǔn)模塊定義方式在過(guò)程名前加Public或省略在過(guò)程名前加Private能否被本模塊其他過(guò)程調(diào)用能能能能能否被本應(yīng)用程序其他模塊調(diào)用能,但必須在過(guò)程名前加窗體名能,但過(guò)程名必須唯一,否則要在過(guò)程前加標(biāo)準(zhǔn)模塊名不能不能說(shuō)明:(1)全局級(jí)過(guò)程若是在窗體模塊中定義,其他模塊的過(guò)程要調(diào)用,必須在該過(guò)程名前加該過(guò)程所處的窗體名。例如,在窗體Form1中調(diào)用窗體模塊Form2中的名為Myfun的全局過(guò)程,使用如下的形式:CallForm2.Myfun[(實(shí)參表)]或Form2.Myfun[(實(shí)參表)](2)在標(biāo)準(zhǔn)模塊中定義的全局級(jí)過(guò)程,外部過(guò)程均可調(diào)用,但過(guò)程名必須唯一,即在工程的多個(gè)標(biāo)準(zhǔn)模塊中的全局過(guò)程名不相同,否則調(diào)用時(shí)就要加標(biāo)準(zhǔn)模塊名。例如,在Module1和Module2中都有一個(gè)名為Myfun的全局過(guò)程,則調(diào)用Module1中的Myfun過(guò)程,就應(yīng)使用如下的形式:CallModule1.Myfun[(實(shí)參表)]或Module1.Myfun

實(shí)參表(3)若是一個(gè)只包含一個(gè)窗體的簡(jiǎn)單應(yīng)用程序,可直接在本窗體模塊中用Private或Public關(guān)鍵字定義過(guò)程。(4)若是包含多個(gè)窗體的應(yīng)用程序,一般把子過(guò)程和函數(shù)過(guò)程放在標(biāo)準(zhǔn)模塊中,并用Public關(guān)鍵字定義,這樣定義的過(guò)程可被本應(yīng)用程序的所有過(guò)程直接訪問(wèn)。■變量的作用域和生存期

8.5過(guò)程和變量的作用域變量可以分為:過(guò)程級(jí)變量(局部變量)、窗體/模塊級(jí)變量(私有的模塊級(jí)變量)和全局級(jí)變量(公有的模塊級(jí)變量)。1.過(guò)程級(jí)變量——局部變量在過(guò)程內(nèi)部定義的變量就是“過(guò)程級(jí)變量”。在一個(gè)過(guò)程內(nèi)部使用Dim或Static聲明的變量,只有該過(guò)程內(nèi)部的代碼才能訪問(wèn)或改變?cè)撟兞康闹怠R簿褪钦f(shuō),過(guò)程級(jí)變量的作用范圍被限制在該過(guò)程的內(nèi)部。過(guò)程級(jí)變量常用于存儲(chǔ)臨時(shí)數(shù)據(jù)或運(yùn)算的中間結(jié)果。PrivateSubCommand1_Click()DimaAsInteger,bAsIntegerStaticcAsInteger……EndSub■變量的作用域和生存期

8.5過(guò)程和變量的作用域例【8-15】過(guò)程級(jí)局部變量示例。PrivateSubCommand1_Click()DimaAsInteger,bAsInteger,cAsIntegera=100:b=10:c=a+bPrint"調(diào)用子過(guò)程前,單擊事件過(guò)程中變量的值:"Print"a=";a;"b=";b;"c=";cCallMysubPrint"調(diào)用子過(guò)程后,單擊事件過(guò)程中變量的值:"Print"a=";a;"b=";b;"c=";cEndSubSubMysub()DimaAsInteger,bAsInteger,cAsIntegera=22:b=11:c=a+bPrint"通用過(guò)程中變量的值:"Print"a=";a;"b=";b;"c=";cEndSub

■變量的作用域和生存期

8.5過(guò)程和變量的作用域2.窗體/模塊級(jí)變量在模塊的通用聲明段中用Dim語(yǔ)句或用Private語(yǔ)句聲明的變量,可被本窗體/模塊的任何過(guò)程訪問(wèn)。但其他模塊卻不能訪問(wèn)該變量。通常,一個(gè)模塊是由多個(gè)過(guò)程組成的,如果希望在整個(gè)模塊中的多個(gè)過(guò)程中使用同一個(gè)變量,就有必要將其聲明為窗體/模塊級(jí)變量。例如:DimaAsInteger,bAsIntegerPrivatecAsIntegerPrivateSubCommand1_Click()……EndSub……■變量的作用域和生存期

8.5過(guò)程和變量的作用域例【8-16】模塊級(jí)變量示例。修改上例,把變量聲明放在模塊頂部的聲明段中,各過(guò)程不再進(jìn)行變量聲明.DimaAsInteger,bAsInteger,cAsIntegerPrivateSubCommand1_Click()a=100:b=10:c=a+bPrint"調(diào)用子過(guò)程前,單擊事件過(guò)程中變量的值:"Print"a=";a;"b=";b;"c=";cCallMysubPrint"調(diào)用子過(guò)程后,單擊事件過(guò)程中變量的值:"Print"a=";a;"b=";b;"c=";cEndSubSubMysub()a=22:b=11:c=a+bPrint"通用過(guò)程中變量的值:"Print"a=";a;"b=";b;"c=";cEndSub■變量的作用域和生存期

8.5過(guò)程和變量的作用域3.全局變量1)全局變量也稱公有的模塊級(jí)變量,在窗體模塊或標(biāo)準(zhǔn)模塊的頂部的“通用”聲明段用Public關(guān)鍵字聲明,它的作用范圍是整個(gè)應(yīng)用程序,即可被本應(yīng)用程序的任何過(guò)程或函數(shù)訪問(wèn)。例如:PublicaAsInteger,bAsInteger,cAsInteger2)在標(biāo)準(zhǔn)模塊中聲明的全局變量,在應(yīng)用程序的任何一個(gè)過(guò)程中可以直接用該變量名來(lái)引用它。3)在某個(gè)窗體模塊中聲明的全局變量,當(dāng)其他窗體模塊引用它時(shí),必須用定義它的窗體模塊名為前綴。如:Form1.max,表示訪問(wèn)在Form1

溫馨提示

  • 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)論