《新編Visual-Basic程序設(shè)計(jì)教程》第9章_第1頁(yè)
《新編Visual-Basic程序設(shè)計(jì)教程》第9章_第2頁(yè)
《新編Visual-Basic程序設(shè)計(jì)教程》第9章_第3頁(yè)
《新編Visual-Basic程序設(shè)計(jì)教程》第9章_第4頁(yè)
《新編Visual-Basic程序設(shè)計(jì)教程》第9章_第5頁(yè)
已閱讀5頁(yè),還剩46頁(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)介

第9章

過(guò)程子程序過(guò)程函數(shù)過(guò)程參數(shù)傳遞可選參數(shù)與可變參數(shù)對(duì)象作參數(shù)9.1子程序過(guò)程子程序過(guò)程由Sub…EndSub定義,也稱為Sub過(guò)程。9.1.1Sub過(guò)程的定義定義Sub過(guò)程的一般格式如下:用上面的格式定義一個(gè)Sub過(guò)程如下:[Static][Public][Private]Sub過(guò)程名[(參數(shù)列表)]

局部變量或常量定義

語(yǔ)句塊 [ExitSub] [語(yǔ)句塊] EndSubPrivateSubTest()Print"ThisisaSubexample"EndSubSub過(guò)程以Sub開頭,以EndSub結(jié)束,在它們之間是描述該過(guò)程操作的語(yǔ)句塊,稱為過(guò)程體或子程序體。上面定義格式中各選項(xiàng)的含義如下:Static:指定過(guò)程中的局部變量都是靜態(tài)變量,即在每次調(diào)用該過(guò)程時(shí),局部變量的值保持不變。Public:表示該Sub過(guò)程是公有過(guò)程,即可以在程序的任何地方調(diào)用它。Private:表示該Sub過(guò)程是私有過(guò)程,即只能被本模塊中的其他過(guò)程訪問(wèn),不能被其他模塊中的過(guò)程訪問(wèn)。過(guò)程名:是一個(gè)長(zhǎng)度不超過(guò)255個(gè)字符的變量名,在同一個(gè)模塊中,不允許變量名與過(guò)程名同名。參數(shù)列表:指明了在調(diào)用該過(guò)程時(shí)傳送給過(guò)程的參數(shù)的類型和個(gè)數(shù),這些參數(shù)稱為“形式參數(shù)”,簡(jiǎn)稱“形參”。各參數(shù)之間以逗號(hào)分隔,每個(gè)參數(shù)的定義格式為:

其中,ByVal是可選的,如果有ByVal,表示該參數(shù)是“傳值參數(shù)”,不加ByVal的參數(shù)稱為“引用參數(shù)”。[ByVal]變量名[()][As數(shù)據(jù)類型]Sub過(guò)程不能嵌套,也就是說(shuō),在Sub過(guò)程內(nèi)不能再定義Sub過(guò)程或函數(shù)過(guò)程。不能用GoTo語(yǔ)句進(jìn)入或跳出一個(gè)Sub過(guò)程,只能通過(guò)調(diào)用執(zhí)行Sub過(guò)程,Sub過(guò)程的調(diào)用可以嵌套。下面再看一個(gè)Sub過(guò)程的例子:該Sub過(guò)程有兩個(gè)形參,其中第二個(gè)形參前面有ByVal,表示該參數(shù)是一個(gè)傳值參數(shù)。SubTry(xAsInteger,ByValyAsInteger) x=x+100 y=y*5 Printx,y EndSub再看一個(gè)無(wú)參的Sub過(guò)程:

SubTest() Do Response$=InputBox$("Continue(YorN)?") IfResponse$="N"OrResponse$="n"ThenEnd IfResponse$="Y"OrResponse$="y"ThenExitDo Loop EndSub9.1.2Sub過(guò)程的建立前面我們已學(xué)會(huì)如何建立事件過(guò)程,Sub過(guò)程不屬于任何一個(gè)事件過(guò)程,因此不能放在事件過(guò)程中。Sub過(guò)程是一個(gè)通用過(guò)程,可以在標(biāo)準(zhǔn)模塊中建立,也可以在窗體模塊中建立。在標(biāo)準(zhǔn)模塊中建立通用過(guò)程的步驟如下:(1)選擇“工程”菜單中的“添加模塊”命令,打開“添加模塊”對(duì)話框,在該對(duì)話框中選擇“新建”選項(xiàng)卡,然后雙擊“模塊”圖標(biāo),打開模塊代碼窗口。(2)選擇“工具”菜單中的“添加過(guò)程”命令,打開“添加過(guò)程”對(duì)話框,如右圖所示。在“名稱”框內(nèi)輸入要建立的過(guò)程的名字,在“類型”框內(nèi)選擇要建立的過(guò)程的類型:子程序過(guò)程或函數(shù)過(guò)程,在“范圍”框內(nèi)選擇過(guò)程的適用范圍。(3)單擊“確定”按鈕,回到模塊代碼窗口,此時(shí)可以在Sub和EndSub之間鍵入程序代碼?!疤砑舆^(guò)程”對(duì)話框9.1.3Sub過(guò)程的調(diào)用可以把Sub過(guò)程的調(diào)用當(dāng)作是一句獨(dú)立的調(diào)用語(yǔ)句,可以有兩種調(diào)用形式:

前者用Call關(guān)鍵字,若有實(shí)參,必須用小括號(hào)括起來(lái),無(wú)實(shí)參時(shí)小括號(hào)可省略;而后者去掉了關(guān)鍵字Call,并且實(shí)參不需要用小括號(hào)括起來(lái)。實(shí)參也稱實(shí)際參數(shù),是在過(guò)程被調(diào)用時(shí)寫在過(guò)程名后面括號(hào)中的參數(shù)。且實(shí)參的數(shù)據(jù)類型必須與定義過(guò)程時(shí)的形式參數(shù)一致。它的作用是把需要實(shí)際運(yùn)算的數(shù)據(jù)傳遞給形式參數(shù)。如調(diào)用前面定義的Sub過(guò)程Try時(shí),可用:

Call過(guò)程名[(實(shí)參表列)]過(guò)程名[實(shí)參表列]CallTry(a,b)Try

a,b例9.1

編寫一個(gè)計(jì)算矩形面積的Sub過(guò)程,然后調(diào)用該過(guò)程求一個(gè)矩形的面積。程序代碼如下:SubArea(x,y)DimSS=x*yMsgBox"Areais"&SEndSubSubForm_Click()DimA,BA=InputBox("Inputthelength:")A=Val(A)B=InputBox("InputtheWidth:")B=Val(B)CallArea(A,B)'或:AreaA,BEndSub程序運(yùn)行時(shí),單擊窗體,首先出現(xiàn)一個(gè)輸入對(duì)話框,要求輸入矩形的長(zhǎng),假設(shè)輸入30,確定后又出現(xiàn)一個(gè)輸入對(duì)話框,要求輸入矩形的寬,假設(shè)輸入20,確定后出現(xiàn)運(yùn)行結(jié)果如下圖所示。調(diào)用Sub過(guò)程求矩形的面積9.2函數(shù)過(guò)程函數(shù)過(guò)程由Function…EndFunction定義,也稱為Function過(guò)程。與Sub過(guò)程相比,Sub過(guò)程不直接返回值,作為獨(dú)立的基本語(yǔ)句調(diào)用,而Function過(guò)程要返回一個(gè)值,通常在一個(gè)表達(dá)式中被調(diào)用。9.2.1Function過(guò)程的定義Function過(guò)程的定義格式如下:

其中:[As類型]可選項(xiàng)是Function過(guò)程返回的值的數(shù)據(jù)類型,可以是Integer、Long、Single、Double、Currency或String。如果省略,默認(rèn)為Variant類型。其他各選項(xiàng)與Sub過(guò)程相同。[Static][Public][Private]Function過(guò)程名[(參數(shù)列表)][As類型]

局部變量或常量定義

語(yǔ)句塊 [過(guò)程名=表達(dá)式] [ExitFunction] [語(yǔ)句塊] EndFunction把某功能定義為Sub過(guò)程還是Function過(guò)程,沒(méi)有嚴(yán)格的規(guī)定,但Function過(guò)程有返回值。定義Function過(guò)程時(shí),要定義返回值的數(shù)據(jù)類型,同時(shí)在Function過(guò)程體內(nèi)可以對(duì)Function過(guò)程名賦值,該值就是這個(gè)函數(shù)的返回值。如果在Function過(guò)程體內(nèi)省略:

則該Function過(guò)程返回一個(gè)默認(rèn)值(0或空字符串)。例如,要編寫用輾轉(zhuǎn)相除法求最大公約數(shù)的函數(shù),程序如下:過(guò)程名=表達(dá)式Functiongcd(ByValxAsInteger,ByValyAsInteger)AsInteger DoWhiley<>0 r=xMody x=y y=r Loop gcd=xEndFunction9.2.2Function過(guò)程的調(diào)用由于Function過(guò)程能返回一個(gè)值,因此完全可以把Function過(guò)程當(dāng)做內(nèi)部函數(shù)調(diào)用,只不過(guò)內(nèi)部函數(shù)由系統(tǒng)提供,而Function過(guò)程由用戶自己定義。例如,上面的Function過(guò)程gcd,可以在下面的事件過(guò)程中調(diào)用。例9.2調(diào)用后,例9.2程序的運(yùn)行結(jié)果如下圖所示。SubForm_Click() DimaAsInteger,bAsInteger a=64:b=48 f=gcd(a,b) Print"最大公約數(shù)為:";fEndSub調(diào)用Function過(guò)程例9.3

分別編寫一個(gè)計(jì)算下列級(jí)數(shù)和的子過(guò)程和函數(shù)過(guò)程,并分別調(diào)用。1+x+x2/2!+…+xn/n!+…精確到|xn/n!|<eps(eps由用戶給定)子過(guò)程如下:Subsum1(s#,x!,eps#)Dimn%,t#n=1:s=0:t=1DoWhile(Abs(t)>=eps)s=s+tt=t*x/nn=n+1LoopEndSub函數(shù)過(guò)程如下:Functionsum2(x!,eps#)AsDoubleDimn%,s#,t#n=1:s=0:t=1DoWhile(Abs(t)>=eps)s=s+tt=t*x/nn=n+1Loopsum2=sEndFunction用下面的事件過(guò)程調(diào)用:PrivateSubCommand1_Click()Dimf1#,f2#Callsum1(f1,2#,0.000001)f2=sum2(2#,0.000001)Print"f1=";f1,"f2=";f2EndSub在窗體中添加一個(gè)命令按鈕Command1,程序運(yùn)行時(shí)單擊該命令按鈕,則運(yùn)行結(jié)果如下圖所示。其中f1是調(diào)用子過(guò)程sum1求得的級(jí)數(shù)和,f2是調(diào)用函數(shù)過(guò)程sum2求得的級(jí)數(shù)和。子過(guò)程和函數(shù)過(guò)程的比較9.3參數(shù)傳遞在調(diào)用一個(gè)過(guò)程時(shí),一般主調(diào)過(guò)程與被調(diào)過(guò)程之間有數(shù)據(jù)傳遞,也就是要把主調(diào)過(guò)程的實(shí)參傳遞給被調(diào)過(guò)程的形參,完成實(shí)參與形參的結(jié)合,然后執(zhí)行被調(diào)過(guò)程體。在VB中,實(shí)參與形參的結(jié)合有兩種方法:傳值(ByVal)和傳址(ByDef)。9.3.1傳值和傳址傳址又稱為引用,是默認(rèn)的參數(shù)傳遞方法。區(qū)分兩種傳遞方法是看形參前有無(wú)“ByVal”關(guān)鍵字。傳址的結(jié)合過(guò)程是:當(dāng)調(diào)用一個(gè)過(guò)程時(shí),將實(shí)參的內(nèi)存地址傳遞給形參。因此在被調(diào)過(guò)程體中對(duì)形參的操作實(shí)際是對(duì)相應(yīng)實(shí)參的操作,實(shí)參的值就會(huì)隨過(guò)程體內(nèi)對(duì)形參的值的改變而改變。傳址習(xí)慣上也稱為“引用”。傳值的結(jié)合過(guò)程是:當(dāng)調(diào)用一個(gè)過(guò)程時(shí),系統(tǒng)將實(shí)參的值復(fù)制給形參,實(shí)參與形參各自占用不同的內(nèi)存單元,過(guò)程調(diào)用結(jié)束時(shí),形參所占的內(nèi)存單元也同時(shí)被釋放。因此,在過(guò)程體內(nèi)對(duì)形參的操作不會(huì)影響到實(shí)參。例9.4

傳址與傳值的比較。有如下過(guò)程:SubTry(xAsInteger,ByDefyAsInteger)'第二個(gè)參數(shù)中的ByDef關(guān)鍵字可以省略 DimtempAsInteger temp=x x=y y=temp Form1.Print"x=";x,"y=";yEndSub在下面的事件過(guò)程中調(diào)用上述過(guò)程:

運(yùn)行程序,單擊窗體,輸出結(jié)果如下圖所示。由此可以看到,在過(guò)程Try中交換了兩個(gè)形參的值,調(diào)用結(jié)束返回事件過(guò)程后,兩個(gè)實(shí)參的值也被改變了。SubForm_Click() DimaAsInteger,bAsInteger a=10:b=20 Print"a=";a,"b=";b Trya,b Print"a=";a,"b=";bEndSub傳址調(diào)用如果不想改變實(shí)參的值,可將過(guò)程Try修改如下:仍舊用上面的Form_Click()事件過(guò)程去調(diào)用,則窗體上的輸出結(jié)果如下圖所示??梢钥吹叫螀⒌闹档母淖儧](méi)有影響實(shí)參。SubTry(ByValxAsInteger,ByValyAsInteger) DimtempAsInteger temp=x x=y y=temp Form1.Print"x=";x,"y=";yEndSub傳值調(diào)用我們已經(jīng)知道,用Function過(guò)程可以通過(guò)過(guò)程名返回值,但一個(gè)Function過(guò)程只能返回一個(gè)值。Sub過(guò)程不能通過(guò)過(guò)程名返回值,但可以通過(guò)傳址結(jié)合的參數(shù)返回值,并且可以返回多個(gè)值,請(qǐng)看下面的例子。例9.5

通過(guò)傳址調(diào)用Sub過(guò)程,返回多個(gè)值。程序如下:SubS(ByValxAsInteger,ByValyAsInteger,mAsInteger,nAsInteger)m=x+yn=x*yEndSubPrivateSubForm_Click()DimSumAsInteger,MulAsIntegerS10,20,Sum,MulPrintSum,MulEndSubSub過(guò)程S有4個(gè)參數(shù),前兩個(gè)參數(shù)用關(guān)鍵字ByVal指明是傳值調(diào)用,后兩個(gè)參數(shù)m和n前面沒(méi)有關(guān)鍵字,則是默認(rèn)的傳址方式。在Form_Click()事件過(guò)程中調(diào)用Sub過(guò)程S的語(yǔ)句為:則將10和20分別傳值給形參x和y,將實(shí)參Sum和Mul的地址傳遞給形參m和n,即m與Sum占用同一段內(nèi)存,n與Mul占用同一段內(nèi)存,因此在過(guò)程S中將x+y、x*y的值分別賦給m、n,也就是將這兩個(gè)值分別存入了Sum和Mul所占的內(nèi)存單元中。于是調(diào)用完過(guò)程S返回Form_Click()事件過(guò)程中輸出Sum和Mul的值時(shí),將輸出:

S10,20,Sum,Mul30 2009.3.2數(shù)組作參數(shù)傳遞在VB中允許把數(shù)組作為實(shí)參傳遞給一個(gè)過(guò)程。這時(shí),應(yīng)將數(shù)組名分別放入實(shí)參表和形參表中,并略去數(shù)組的上下界,但數(shù)組名后的小括號(hào)不能省,以免與普通變量混淆。數(shù)組只能通過(guò)傳址方式進(jìn)行傳遞,也就是說(shuō),用數(shù)組作過(guò)程參數(shù)時(shí),可以將實(shí)參數(shù)組的全部元素傳送給一個(gè)過(guò)程,而形參數(shù)組中各元素的改變將被帶回到實(shí)參數(shù)組。例9.6

編寫一個(gè)Function過(guò)程,求數(shù)組的最大值。PrivateFunctionFindMax(a()AsInteger)DimStartAsInteger,FinishAsInteger,iAsIntegerStart=LBound(a)Finish=UBound(a)Max=a(Start)Fori=StartToFinishIfa(i)>MaxThenMax=a(i)NextiFindMax=MaxEndFunctionSubForm_Click()ReDimb(10)AsIntegerFori=1To10t=InputBox("inputInteger:")b(i)=tNextic=FindMax(b())PrintcEndSub程序中定義了一個(gè)函數(shù)過(guò)程FindMax,它有一個(gè)形參,即數(shù)組a。當(dāng)在Form_Click()事件過(guò)程中調(diào)用函數(shù)過(guò)程FindMax時(shí),將實(shí)參數(shù)組b作參數(shù)傳遞給形參數(shù)組a,于是,形參數(shù)組a與實(shí)參數(shù)組b共占同一段內(nèi)存空間。而且因?yàn)閮蓚€(gè)數(shù)組類型相同,因此a(i)就是b(i)的值。接下來(lái)在函數(shù)過(guò)程FindMax中用LBound和Ubound函數(shù)分別求得數(shù)組a的下界和上界,然后對(duì)數(shù)組中元素進(jìn)行比較,找到數(shù)組a的最大值,其實(shí)也就是數(shù)組b中所有元素的最大值,通過(guò)函數(shù)過(guò)程FindMax,將此最大值返回給Form_Click()事件過(guò)程并輸出。有時(shí)不需要把整個(gè)數(shù)組傳送給通用過(guò)程,可以只傳送所需要的某個(gè)元素,只要在實(shí)參數(shù)組名后的小括號(hào)內(nèi)寫上要傳送的元素的下標(biāo)。這時(shí),形參不需要定義成數(shù)組,只要定義成與作實(shí)參的數(shù)組元素同類型的變量即可。這種用法其實(shí)與前面介紹的傳值或傳址調(diào)用類似。例9.7

用二維數(shù)組的某個(gè)元素作實(shí)參調(diào)用一個(gè)Sub過(guò)程。程序代碼如下:Dimtest_array()AsIntegerStaticSubSqval(a)a=Sqr(Abs(a))EndSubSubForm_Click()ReDimtest_array(1To5,1To3)test_array(5,3)=-25Printtest_array(5,3)CallSqval(test_array(5,3))Printtest_array(5,3)EndSub程序中:CallSqval(test_array(5,3))語(yǔ)句把二維數(shù)組test_array中的元素test_array(5,3)作為實(shí)參傳遞給形參a,可以看到形參a是一個(gè)變量,并且實(shí)參與形參的結(jié)合是默認(rèn)的傳址方式。因此在調(diào)用過(guò)程Sqval時(shí)改變a的值,實(shí)參test_array(5,3)的值也隨之改變。所以程序運(yùn)行后,單擊窗體,在窗體中顯示輸出結(jié)果為:最后還要說(shuō)明一點(diǎn):通過(guò)過(guò)程傳送參數(shù)時(shí),實(shí)參與對(duì)應(yīng)的形參的類型應(yīng)當(dāng)一致。如果實(shí)參是數(shù)值常數(shù)或數(shù)值表達(dá)式,而它的類型與對(duì)應(yīng)的形參的類型又不匹配時(shí),則系統(tǒng)會(huì)將此數(shù)值常數(shù)或數(shù)值表達(dá)式強(qiáng)制轉(zhuǎn)換為相應(yīng)形參的類型。 -2559.3.3按位置傳送和指名傳送1.按位置傳送按位置傳送是大多數(shù)程序設(shè)計(jì)語(yǔ)言在子程序調(diào)用時(shí)所使用的參數(shù)傳送方式,在前面的例子中使用的都是按位置傳送。使用按位置傳送時(shí),實(shí)參的個(gè)數(shù)與形參的個(gè)數(shù)必須相等,而且實(shí)參的類型必須與相應(yīng)的形參的類型相同,實(shí)參的名字與相應(yīng)的形參的名字可以不同。也就是說(shuō),實(shí)參必須和形參表中同一位置的形參相匹配。如下面定義的一個(gè)過(guò)程:

SubTest(x1AsInteger,x2AsSingle,x3AsString) …… EndSub我們可以用下面的語(yǔ)句調(diào)用該過(guò)程:不難看出,實(shí)參a、b和"ABC"分別與對(duì)應(yīng)位置上的形參x1、x2和x3類型相同,并且實(shí)參的個(gè)數(shù)與形參的個(gè)數(shù)也相同。在按位置傳送時(shí),實(shí)參可以是常數(shù)、合法的變量名、表達(dá)式或后面跟有左右括號(hào)的數(shù)組名。而形參表中的變量可以是除定長(zhǎng)字符串之外的合法變量名或后面跟有左右括號(hào)的數(shù)組名。注意:只能使用形如Str$或StrAsString之類的變長(zhǎng)字符串作為形參,不能用形如StrAsString*8之類的定長(zhǎng)字符串作為形參,但定長(zhǎng)字符串可以作實(shí)參傳送給過(guò)程。 CallTest(a%,b!,"ABC")2.指名傳送除按位置傳送外,在VB中還提供了與Ada語(yǔ)言類似的參數(shù)傳送方式,即指名參數(shù)傳送方式。所謂指名傳送方式,就是顯式地指出與形參結(jié)合的實(shí)參,把形參用“:=”與實(shí)參連接起來(lái)。指名傳送方式不受參數(shù)的位置次序的影響,但要求實(shí)參與形參的名字必須相同。如建立如下的過(guò)程:

使用按位置傳送時(shí),我們可以寫出調(diào)用語(yǔ)句如下:SubTest(x1AsInteger,x2AsInteger,x3AsInteger) …… EndSub Test4,6,8如果使用指名傳送方式,則下面的三個(gè)調(diào)用語(yǔ)句都是可以的:

并且這三個(gè)調(diào)用語(yǔ)句是完全等價(jià)的。使用指名傳送比使用按位置傳送在書寫上繁瑣,但指名傳送能改善過(guò)程調(diào)用的可讀性,而且,當(dāng)參數(shù)較多,類型又相似時(shí),指名傳送比按位置傳送出錯(cuò)的可能性要小一些。但應(yīng)當(dāng)注意的是,有些方法的調(diào)用是不能使用指名傳送的。使用時(shí)可查閱相關(guān)的幫助信息。Testx1:=4,x2:=6,x3:=8Testx2:=6,x1:=4,x3:=8Testx3:=8,x2:=6,x1:=49.4可選參數(shù)與可變參數(shù)在VB中調(diào)用一個(gè)過(guò)程時(shí),還可以向過(guò)程傳送可選的參數(shù)或者任意數(shù)量的參數(shù),即可選參數(shù)和可變參數(shù)。9.4.1可選參數(shù)在前面的例子中,如果一個(gè)過(guò)程有3個(gè)形參,則調(diào)用時(shí)必須按相同的順序和類型提供3個(gè)實(shí)參。在VB中,還可以指定一個(gè)或多個(gè)參數(shù)作為可選參數(shù),在調(diào)用時(shí),可以不必給可選參數(shù)傳遞實(shí)參。為了定義帶可選參數(shù)的過(guò)程,需要在可選參數(shù)名前加“Optional”關(guān)鍵字,并在過(guò)程體中通過(guò)IsMissing函數(shù)測(cè)試調(diào)用時(shí)是否給可選參數(shù)傳遞實(shí)參。例如:SubSum(aAsInteger,bAsInteger,Optionalc)n=a+bIfNotIsMissing(c)Thenn=n+cEndIfPrintnEndSub上述過(guò)程中有3個(gè)參數(shù),前兩個(gè)參數(shù)與前面例子中的參數(shù)相同,最后一個(gè)參數(shù)沒(méi)有指定類型,默認(rèn)其類型為Variant,它前面有一個(gè)關(guān)鍵字“Optional”,表示它是一個(gè)可選參數(shù)。在過(guò)程體中,首先計(jì)算前兩個(gè)參數(shù)的和,并把結(jié)果賦值給變量n,然后用IsMissing函數(shù)測(cè)試第三個(gè)參數(shù)c是否存在,如果存在,則把第三個(gè)參數(shù)c的值也加到變量n中,最后將n的值輸出。在調(diào)用上面的Sum過(guò)程時(shí),可以傳遞兩個(gè)實(shí)參,求出兩個(gè)數(shù)的和,也可以傳遞三個(gè)實(shí)參,求出三個(gè)數(shù)的和。如用下面的事件過(guò)程調(diào)用上述的Sum過(guò)程:輸出結(jié)果為: 30PrivateSubForm_Click()Sum10,20EndSub也可以用下面的過(guò)程調(diào)用:

輸出結(jié)果為: 60上面的Sum過(guò)程只有一個(gè)可選參數(shù),我們可以根據(jù)實(shí)際需要,用同樣的方法設(shè)置兩個(gè)或多個(gè)可選參數(shù)。但要注意:可選參數(shù)必須放在參數(shù)表列的最后,并且必須是Variant類型。PrivateSubForm_Click() Sum10,20,30 EndSub9.4.2可變參數(shù)所謂可變參數(shù),就是在定義過(guò)程時(shí)參數(shù)的個(gè)數(shù)是可變的,這在處理一些問(wèn)題時(shí)是非常有用的。這里的“數(shù)組名()”是一個(gè)形參,只有名字和括號(hào),沒(méi)有上、下界,其類型默認(rèn)為Variant類型。在VB中,建立可變參數(shù)過(guò)程可用如下方式定義: Sub過(guò)程名(ParamArray數(shù)組名())

過(guò)程體 EndSub前面定義的Sum過(guò)程可以求兩個(gè)或三個(gè)數(shù)的和。如果想求任意多個(gè)數(shù)的和,可定義一個(gè)可變參數(shù)過(guò)程Sum如下:

可以用任意多個(gè)實(shí)參調(diào)用上面的Sum過(guò)程。如編寫下面的事件過(guò)程:用該事件過(guò)程調(diào)用上面的Sum過(guò)程,輸出結(jié)果為: 15SubSum(ParamArrayNum()) n=0 ForEachxInNum n=n+x Nextx Printn EndSub PrivateSubForm_Click() Sum1,2,3,4,5 EndSub由于可變參數(shù)過(guò)程中的形參是Variant類型,因此我們可以把任何類型的參傳送給該過(guò)程??聪旅孢@個(gè)事件過(guò)程:

調(diào)用上面的Sum過(guò)程,輸出結(jié)果為: 28PrivateSubForm_Click() DimaAsInteger,bAsLong,cAsVariant,dAsInteger a=6:b=8:c=12:d=2 Suma,b,c,d EndSub9.5對(duì)象作參數(shù)除了可以用變量作通用過(guò)程的形式參數(shù)外,在VB中還允許用對(duì)象(即窗體或控件)作通用過(guò)程的參數(shù)。用窗體或控件作形參時(shí),過(guò)程的定義格式與用變量作參數(shù)相同。只不過(guò)是把形參表中的對(duì)象參數(shù)的類型定義為“Control”或“Form”。但要注意,在調(diào)用含有對(duì)象參數(shù)的過(guò)程時(shí),對(duì)象參數(shù)只能用傳地址方式傳送。也就是說(shuō),在定義過(guò)程時(shí)不能在對(duì)象參數(shù)前加關(guān)鍵字ByVal。9.5.1窗體參數(shù)假設(shè)我們要設(shè)計(jì)一個(gè)程序,在這個(gè)程序中含有多個(gè)窗體(關(guān)于多窗體的程序設(shè)計(jì),我們將在后面章節(jié)介紹),而且要求在運(yùn)行程序時(shí),這些窗體的位置、大小都相同。我們知道,窗體的位置和大小可以通過(guò)窗體的Left、Top、Width及Height四個(gè)屬性來(lái)設(shè)置。假定這些窗體的名字分別為Form1、Form2、Form3…,我們可以寫出下面的程序段:

…… Form1.Left=2000 Form1.Top=3000 Form1.Width=5000 Form1.Height=3000Form2.Left=2000 Form2.Top=3000 Form2.Width=5000 Form2.Height=3000

Form3.Left=2000 Form3.Top=3000 Form3.Width=5000 Form3.Height=3000 ……每個(gè)窗體都要用四個(gè)語(yǔ)句來(lái)確定其大小和位置。這四個(gè)語(yǔ)句除窗體名不同外,其他都是一樣的。因此,為了避免這些語(yǔ)句的重復(fù)書寫,我們可以用窗體作參數(shù),編寫出如下的通用過(guò)程:

該過(guò)程的形參即為一個(gè)窗體類型。在調(diào)用時(shí),就可以用窗體作實(shí)參。例如可以用如下的語(yǔ)句調(diào)用上述過(guò)程:

則將按過(guò)程中給出的各屬性值設(shè)置窗體Form1的大小和位置。SubFormSet(FormNumAsForm) FormNum.Left=2000 FormNum.Top=3000 FormNum.Width=5000 FormNum.Height=3000 EndSubFormSetForm1為了調(diào)用上面的通用過(guò)程FormSet,可以選擇“工程”菜單中的“添加窗體”命令建立多個(gè)窗體,現(xiàn)假設(shè)我們建立4個(gè),即Form1、Form2、Form3和Form4。在默認(rèn)情況下,第一個(gè)建立的窗體(這里假設(shè)是Form1)是啟動(dòng)窗體。我們對(duì)Form1編寫如下的事件過(guò)程:

PrivateSubForm_Load() FormSetForm1 FormSetForm2 FormSetForm3 FormSetForm4 EndSub然后對(duì)4個(gè)窗體分別編寫如下的Click事件過(guò)程:

PrivateSubForm_Click() Form1.Hide'窗體Form1隱藏 Form2.Show'顯示窗體Form2 EndSub PrivateSubForm_Click() Form2.Hide Form3.Show EndSub

PrivateSubForm_Click() Form3.Hide Form4.Show EndSubPrivateSubForm_Click() Form4.Hide Form1.Show EndSub于是,在運(yùn)行程序時(shí),首先顯示Form1,單擊該窗體后,F(xiàn)orm1隱藏,顯示Form2;單擊Form2窗體后,F(xiàn)orm2隱藏,F(xiàn)orm3顯示出來(lái)……,每個(gè)窗體顯示的大小和位置均相同。9.5.2控件參數(shù)和窗體參數(shù)一樣,控件也可以作通用過(guò)程的參數(shù),即可以在一個(gè)通用過(guò)程中設(shè)置相同性質(zhì)的控件所需要的屬性,然后用不同的控件作實(shí)參調(diào)用該過(guò)程。請(qǐng)看下面這個(gè)例子。例9.8

在窗體上建立兩個(gè)文本框,然后編寫一個(gè)通用過(guò)程,用控件作參數(shù),用來(lái)設(shè)置文本框中顯示的字體屬性。通用過(guò)程如下:

SubFontSet(Ctrl1AsControl,Ctrl2AsControl) Ctrl1.FontSize=18 Ctrl1.FontName=“幼圓” Ctrl1.FontItalic=True Ctrl1.FontBold=True Ctrl1.FontUnderline=FalseCtrl2.FontSize=26 Ctrl2.FontName=“隸書” Ctrl2.FontItalic=False Ctrl2.FontUnderline=True EndSub該過(guò)程有兩個(gè)參數(shù),其類型均為Control,即控件參數(shù)。在該過(guò)程中通過(guò)一系列語(yǔ)句設(shè)置了控件上所顯示的文字的屬性。為了調(diào)用該過(guò)程,我們?cè)诖绑w上建立兩個(gè)文本框,然后編寫如下的事件過(guò)程:

PrivateSubForm_Load() Text1.Text=“歡迎來(lái)到” Text2.Text=“新鄉(xiāng)師專計(jì)科系” EndSub

PrivateSubForm_Click() FontSetText1,Text2 EndSub

程序運(yùn)行后,窗體顯示如左圖所示,然后單擊窗體,運(yùn)行結(jié)果如右圖所示。對(duì)象參數(shù)示例

對(duì)象作參數(shù)改變文本框字體在使用控件作參數(shù)時(shí),由于不同的控件所具有的屬性也不一樣,因此,在用指定的控件作實(shí)參調(diào)用通用過(guò)程時(shí),如果通用過(guò)程中

溫馨提示

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