版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
項(xiàng)目七過程任務(wù)7.1事件過程任務(wù)7.2子過程任務(wù)7.3函數(shù)過程任務(wù)7.4參數(shù)傳遞
任務(wù)7.1事件過程
任務(wù)導(dǎo)入
事件過程是構(gòu)成VB應(yīng)用程序的主體。在前面的學(xué)習(xí)中,我們編寫的程序幾乎都使用了事件過程。本任務(wù)在以前學(xué)習(xí)的基礎(chǔ)上,對(duì)事件過程的語法格式和使用時(shí)的注意事項(xiàng)進(jìn)行歸納,便于學(xué)生系統(tǒng)、全面地掌握過程的設(shè)計(jì)方法。學(xué)習(xí)目標(biāo)
(1)掌握事件過程的語法格式。
(2)了解使用事件過程的注意事項(xiàng)。
(3)了解常用的鍵盤事件。
(4)了解常用的鼠標(biāo)事件。任務(wù)實(shí)施
1.理解事件過程的觸發(fā)
對(duì)象事件在用戶或系統(tǒng)發(fā)出動(dòng)作時(shí)被觸發(fā),事件響應(yīng)時(shí)執(zhí)行的過程就是事件過程。事件過程一般由VB創(chuàng)建,用戶不能增加或刪除。當(dāng)用戶對(duì)某個(gè)對(duì)象發(fā)出一個(gè)動(dòng)作時(shí),Windows會(huì)通知VB產(chǎn)生了一個(gè)事件,VB會(huì)自動(dòng)地調(diào)用與該事件相關(guān)的事件過程,即當(dāng)對(duì)象對(duì)一個(gè)事件的發(fā)生做出認(rèn)定時(shí),VB便自動(dòng)用相應(yīng)事件的名字調(diào)用該事件的過程。由于名字在對(duì)象和代碼之間建立了聯(lián)系,因此說事件過程是依附于窗體和控件的。
2.掌握事件過程的語法格式
控件事件過程的語法格式為
PrivateSub〈控件名〉_〈事件名〉([形參表])
[〈語句組〉]
EndSub
窗體事件過程的語法格式為
PrivateSubForm_〈事件名〉([形參表])
[〈語句組〉]
EndSub
3.了解創(chuàng)建事件過程時(shí)的注意事項(xiàng)
(1)雖然用戶可以手工鍵入首行的事件過程名,但使用模板會(huì)更方便,模板會(huì)自動(dòng)將正確的過程名包括進(jìn)來。使用模板創(chuàng)建事件過程的方法是:在對(duì)象列表框中選定活動(dòng)的窗體中的對(duì)象名(如Command1),在過程列表框中選擇事件名(如Click事件),系統(tǒng)就會(huì)在代碼編輯器窗口中生成該對(duì)象所選事件的過程模板,如圖7.1所示。然后在Sub和EndSub語句之間輸入代碼。圖7.1使用模板創(chuàng)建事件過程
(2)事件過程名是由VB自動(dòng)給出的,如Command1_Click,因此,在為新控件或?qū)ο缶帉懯录a之前,應(yīng)先設(shè)置它的Name屬性。圖7.2中將Command1的Name屬性設(shè)置為Cmdopen,因而事件過程名就自動(dòng)給出為Cmdopen_Click。圖7.2設(shè)置對(duì)象的Name屬性
4.了解鍵盤事件
1)?KeyPress鍵盤事件
當(dāng)用戶按下和松開一個(gè)ASCII字符鍵時(shí)發(fā)生KeyPress事件。該事件被觸發(fā)時(shí),被按鍵的ASCII碼將自動(dòng)傳遞給事件過程的KeyAscii參數(shù)。在程序中,通過訪問該參數(shù),可獲知用戶按下了哪一個(gè)鍵,并可識(shí)別字母的大小寫。其語法格式為
PrivateSub
對(duì)象名_KeyPress(keyasciiAsInteger)
其中,參數(shù)keyascii是被按下字符鍵的標(biāo)準(zhǔn)ASCII碼。對(duì)它進(jìn)行改變可給對(duì)象發(fā)送一個(gè)不同的字符。將keyascii改變?yōu)?時(shí)可取消擊鍵。
【說明】
(1)具有焦點(diǎn)的對(duì)象才能接收該事件。一個(gè)窗體僅在它沒有可視和有效的控件或KeyPreview屬性被設(shè)置為True時(shí)才能接收該事件。
(2)?KeyPress事件可以引用任何可打印的鍵盤字符、來自標(biāo)準(zhǔn)字母表的字符或少數(shù)幾個(gè)特殊字符之一的字符與Ctrl鍵的組合、Enter鍵或Backspace鍵。
2)?KeyDown和KeyUp鍵盤事件
KeyDown和KeyUp事件是當(dāng)一個(gè)對(duì)象具有焦點(diǎn)時(shí)按下或松開一個(gè)鍵時(shí)發(fā)生的。當(dāng)控制焦點(diǎn)位于某對(duì)象上時(shí),按下鍵盤中的任意一鍵,會(huì)在該對(duì)象上觸發(fā)KeyDown事件,當(dāng)釋放該鍵時(shí),將觸發(fā)KeyUp事件,之后產(chǎn)生KeyPress事件。其語法格式為
PrivateSub
對(duì)象名_KeyDown(KeyCodeAsInteger,shiftAsInteger)
PrivateSub
對(duì)象名_KeyUp(KeyCodeAsInteger,shiftAsInteger)
【說明】
(1)參數(shù)KeyCode項(xiàng)用于返回被按鍵的掃描代碼。由于掃描碼主要反映物理鍵位,因此通過該參數(shù)不能區(qū)分字母大小寫。
(2)?shift參數(shù)返回一個(gè)整數(shù),該整數(shù)相應(yīng)于Shift、Ctrl和Alt鍵的狀態(tài)。shift參數(shù)等于1、2和4分別表示Shift、Ctrl和Alt鍵被按下,而三數(shù)的部分和表示三個(gè)按鈕部分地被同時(shí)按下。例如,Ctrl鍵和Alt鍵都被按下,則shift的值就是6。因此,可結(jié)合該參數(shù)項(xiàng)來判斷輸入字母的大小寫。
(3)?Tab鍵不能引用KeyDown和KeyUp事件;命令按鈕的Default屬性設(shè)置為True時(shí),Enter鍵不能引用KeyDown和KeyUp事件;命令按鈕的Cancel屬性設(shè)置為True時(shí),Esc鍵不能引用KeyDown和KeyUp事件。
5.了解鼠標(biāo)事件
前面的例子中曾多次使用鼠標(biāo)事件,即單擊(Click)事件和雙擊(DblClick)事件,這些事件是通過快速按下并松開鼠標(biāo)鍵而產(chǎn)生的。除此之外,VB還可以通過MouseDown、MouseUp、MouseMove事件使應(yīng)用程序?qū)κ髽?biāo)位置及狀態(tài)的變化做出響應(yīng)(其中不包括拖放事件)。其實(shí),Click事件是由MouseDown和MouseUp組成的,因此MouseDown和MouseUp是最基本的鼠標(biāo)事件。
當(dāng)鼠標(biāo)指針位于無控件的窗體上方時(shí),窗體將識(shí)別鼠標(biāo)事件;當(dāng)鼠標(biāo)指針在控件上方時(shí),控件將識(shí)別上述三種鼠標(biāo)事件。如果鼠標(biāo)被持續(xù)地按下,則第一次按下之后捕獲鼠標(biāo)的對(duì)象將接收全部鼠標(biāo)事件,直至所有按鈕被釋放為止。
1)?MouseDown和MouseUp鼠標(biāo)事件
MouseDown和MouseUp事件在按下(MouseDown)或者釋放(MouseUp)鼠標(biāo)按鈕時(shí)發(fā)生。其語法格式為
PrivateSub
對(duì)象名_MouseDown(buttonAsInteger,shiftAsInteger,xAsSingle,y
AsSingle)
PrivateSub
對(duì)象名_MouseUp(buttonAsInteger,shiftAsInteger,xAsSingle,yAs
Single)
【說明】
(1)參數(shù)button返回一個(gè)整數(shù),其值分別等于1、2和4時(shí),對(duì)應(yīng)于左按鈕、右按鈕以及中間按鈕的動(dòng)作。注意:只能有一個(gè)按鈕引起事件。
(2)與鍵盤事件一樣,參數(shù)shift返回一個(gè)整數(shù),在button參數(shù)指定的按鈕被按下或被釋放的情況下,該整數(shù)相應(yīng)于Shift、Ctrl和Alt鍵的狀態(tài)。
(3)參數(shù)x和y返回一個(gè)指定鼠標(biāo)指針當(dāng)前位置的數(shù)。
2)?MouseMove鼠標(biāo)事件
MouseMove事件在移動(dòng)鼠標(biāo)時(shí)發(fā)生。其語法格式為
PrivateSub
對(duì)象名_MouseMove(buttonAsInteger,shiftAsInteger,xAsSingle,yAsSingle)任務(wù)7.2子過程
任務(wù)導(dǎo)入
當(dāng)有幾個(gè)不同的事件過程需要執(zhí)行相同的操作時(shí),為了簡化程序,可以將公共語句放入分離開的子過程(通用過程)中,并由事件過程來調(diào)用它。
子過程不與任何特定的事件相聯(lián)系,只能由別的過程來調(diào)用,它可以存儲(chǔ)在窗體或標(biāo)準(zhǔn)模塊中。本任務(wù)學(xué)習(xí)子過程的創(chuàng)建和調(diào)用方法。學(xué)習(xí)目標(biāo)
(1)會(huì)建立、調(diào)用子過程。
(2)能熟練使用子過程編寫程序。任務(wù)實(shí)施
1.認(rèn)知建立子過程的方法
子過程與事件過程不同,子過程不是由對(duì)象的某種事件激活的,也不依附于某一對(duì)象,故其創(chuàng)建的方法與事件過程的略有區(qū)別。建立子過程的方法有兩種:
(1)使用“添加過程”對(duì)話框。
(2)直接在代碼編輯窗口中輸入過程代碼。
2.使用“添加過程”對(duì)話框創(chuàng)建子過程
使用“添加過程”對(duì)話框創(chuàng)建子過程的步驟如下:
(1)打開代碼編輯窗口。
(2)單擊“工具”菜單中的“添加過程”命令,打開“添加過程”對(duì)話框,如圖7.3所示。圖7.3“添加過程”對(duì)話框
(3)在“名稱”文本框中輸入過程名,如“shuru”;在“類型”組中選擇“子程序”項(xiàng);從“范圍”組中選擇范圍,相當(dāng)于使用Public(公有的)或Private(私有的)關(guān)鍵字。
(4)單擊“確定”按鈕??梢钥吹皆趯?duì)象列表框中為“通用”,在過程列表框中為“aaa”,如圖7.4所示。
圖7.4代碼編輯窗口
3.通過在代碼窗口中輸入語句的方法建立子過程
在代碼編輯窗口中,把光標(biāo)定位在已有過程的外面,然后按如下格式輸入子過程:
[Private|Public][Static]Sub〈過程名〉([〈形參表〉])
[〈語句組〉]
[ExitSub]
[〈語句組〉]
EndSub
【說明】
(1)VB默認(rèn)所有模塊中的子過程是Public,表示在應(yīng)用程序中隨處都可調(diào)用它們;如果選用Private,則只有該過程所在模塊中的程序才能調(diào)用該過程。
(2)如果使用Static(靜態(tài)的)關(guān)鍵字,則該過程中的所有局部變量的存儲(chǔ)空間只分配一次,且這些變量的值在整個(gè)程序運(yùn)行期間都存在;如果省略Static,則過程每次被調(diào)用時(shí)重新為其變量分配存儲(chǔ)空間,當(dāng)該過程結(jié)束時(shí)釋放其變量的存儲(chǔ)空間。
(3)〈過程名〉與變量名的命名規(guī)則相同,長度不得超過40個(gè)字符。
(4)在過程內(nèi),不能再定義過程,但可以調(diào)用其他子過程或函數(shù)過程。
4.調(diào)用子過程
調(diào)用子過程的方法有兩種:
(1)使用Call語句,語法格式為
Call〈過程名〉([〈實(shí)參表〉])
(2)直接使用過程名,語法格式為
〈過程名〉[〈實(shí)參表〉]例如,下面兩個(gè)語句都能調(diào)用aaa子過程:
aaa12
Callaaa(12)
其中的12是實(shí)際參數(shù)。實(shí)際參數(shù)可以是常量、變量或表達(dá)式,如:
M=12
Callaaa(M)
【課堂演練】
【實(shí)例7-1】編寫一個(gè)計(jì)算矩形面積的Sub過程,然后調(diào)用該過程計(jì)算矩形面積。
【實(shí)現(xiàn)步驟】
(1)問題分析。使用通用過程來計(jì)算并輸出矩形的面積,它有兩個(gè)形參,分別為矩形的長和寬。在窗體的單擊事件過程Form_Click中,從鍵盤輸入矩形的長和寬,并用它們作為實(shí)參調(diào)用通用過程。
(2)建立應(yīng)用程序用戶界面,并設(shè)置對(duì)象屬性如圖7.5所示。圖7.5建立計(jì)算矩形面積的用戶界面
(3)在代碼窗口中直接輸入通用事件代碼:
Subrecarea(rlen,rwid)
Dimarea
area=rlen*rwid‘計(jì)算矩形面積
MsgBox“矩形的面積是:”&area’用消息框輸出矩形面積
EndSub
(4)編寫窗體Form的單擊事件代碼:
PrivateSubForm_click()
Dima,b
a=InputBox(“請(qǐng)輸入矩形面積的長度:”) ‘用輸入框輸入矩形的長
b=InputBox(“請(qǐng)輸入矩形面積的寬度:”) ’用輸入框輸入矩形的寬
recareaa,b‘調(diào)用recarea過程,也可以改為Callrecarea(a,b)
EndSub編寫子過程與窗體的事件過程代碼,如圖7.6所示。圖7.6編寫子過程與窗體的事件過程代碼
(5)運(yùn)行工程。單擊標(biāo)準(zhǔn)工具欄中的“啟動(dòng)”按鈕,運(yùn)行工程;單擊窗體,依次輸入矩形的長、寬,如圖7.7所示,求得矩形面積如圖7.8所示。圖7.7輸入矩形的長、寬圖7.8矩形面積的計(jì)算結(jié)果
【實(shí)例7-2】編寫一個(gè)用來延遲指定時(shí)間(秒)的Sub過程。通過調(diào)用該過程,按指定的時(shí)間間隔顯示若干行信息。
【實(shí)現(xiàn)步驟】
(1)問題分析。用For循環(huán)可以實(shí)現(xiàn)時(shí)間延遲,但不精確。在此使用VB的內(nèi)部函數(shù)Timer來編寫較為精確的時(shí)間延遲過程。
Timer函數(shù)返回系統(tǒng)時(shí)鐘從午夜開始計(jì)算的秒數(shù),把Timer加上需要延遲的時(shí)間(秒)作為循環(huán)結(jié)束的時(shí)間,當(dāng)Timer超過該時(shí)間時(shí)結(jié)束循環(huán),即停止時(shí)間延遲時(shí),用這種方法可以得到精確的時(shí)間延遲。
(2)為了簡化操作,直接在窗體上輸出,因此不再進(jìn)行屬性設(shè)置。(3)編寫通用事件過程代碼:
StaticSubdelayloop(delaytime)
Constsecinday=24&*60&*60&'一整天的秒數(shù)
loopfinish=Timer+delaytime'計(jì)算完成時(shí)間
Ifloopfinish>secindayThen'如果延遲時(shí)間從午夜前開始
loopfinish=loopfinish–secindayDoWhileTimer>loopfinish'利用空循環(huán)實(shí)現(xiàn)延遲
Loop
EndIf
DoWhileTimer<loopfinish'利用空循環(huán)實(shí)現(xiàn)延遲
Loop
EndSub一般情況下,Timer比loopfinish要小,因此可以用
DoWhileTimer<loopfinish
Loop
來控制時(shí)間延遲。但是,如果時(shí)間延遲從午夜前開始,到午夜后才結(jié)束,則Timer從0開始起算,在這種情況下,必須用
DoWhileTimer>loopfinish
Loop
來控制時(shí)間延遲。用上面的delayloop過程可以延遲指定的時(shí)間,調(diào)用時(shí)用需要延遲的時(shí)間(秒)作為實(shí)參。例如,延遲3秒可以用下面的代碼實(shí)現(xiàn):
delayloop3
(4)編寫窗體Form的Click事件代碼:
PrivateSubForm_Click()
Print“輸出第一行內(nèi)容?!?/p>
Print“請(qǐng)等3秒?!?/p>
delayloop3 ‘調(diào)用通用過程,延遲3秒
Print“輸出第二行內(nèi)容?!?/p>
Print“請(qǐng)等6秒?!?/p>
Calldelayloop(6)‘調(diào)用通用過程,延遲6秒
Print“輸出第三行內(nèi)容?!?/p>
EndSub
(5)運(yùn)行程序。單擊窗體,顯示第一部分內(nèi)容,等待3秒后,顯示第二部分內(nèi)容,再過6秒顯示第三部分內(nèi)容,如圖7.9所示。圖7.9時(shí)間延遲示例
任務(wù)7.3函數(shù)過程
任務(wù)導(dǎo)入
VB中包含了許多內(nèi)部函數(shù),如Int、Sqr等。用戶在編寫程序時(shí),只需寫出一個(gè)函數(shù)名并給定參數(shù)就能得出函數(shù)值。但是,如果用戶在程序中需要多次用到某一公式或要處理某一函數(shù)關(guān)系,而又沒有現(xiàn)成的內(nèi)部函數(shù)可用時(shí),則可以自己編寫函數(shù)(Function)過程。函數(shù)過程與內(nèi)部函數(shù)一樣,可以在程序或函數(shù)嵌套中使用。學(xué)習(xí)目標(biāo)
(1)會(huì)建立、調(diào)用函數(shù)過程。
(2)能熟練使用函數(shù)過程編寫程序。任務(wù)實(shí)施
1.認(rèn)知定義函數(shù)過程的方法
與子過程一樣,函數(shù)過程也是一個(gè)獨(dú)立的過程,可讀取參數(shù)、執(zhí)行一系列語句并改變其參數(shù)的值。與子過程不同的是,函數(shù)過程可返回給調(diào)用過程一個(gè)值。
函數(shù)過程的定義與子過程相似,可以使用“添加過程”對(duì)話框,也可以在代碼編輯窗口中直接輸入過程代碼。
2.通過“添加過程”對(duì)話框定義函數(shù)
譬如,創(chuàng)建一個(gè)用于求某數(shù)階乘的通用函數(shù)fact:先打開“添加過程”對(duì)話框,在“名稱”文本框中鍵入過程名“fact”,在“類型”組中選擇“函數(shù)”項(xiàng),如圖7.10所示,再單擊“確定”按鈕即可產(chǎn)生函數(shù)過程的框架。圖7.10定義函數(shù)過程通常,由系統(tǒng)自動(dòng)產(chǎn)生的函數(shù)過程框架還需要進(jìn)行適當(dāng)修改。由于函數(shù)過程有返回值,這個(gè)值就應(yīng)該屬于某種數(shù)據(jù)類型,因此,還需要在過程名后面加上對(duì)其返回值類型的定義和說明。另外,為了獲得傳遞過來的參數(shù),還需定義接收參數(shù)的變量等。
3.通過在代碼編輯窗口輸入代碼來定義函數(shù)
定義函數(shù)過程的語法格式為
[Private|Public][Static]Function〈函數(shù)名〉([〈形參表〉])[As〈類型〉]
[〈語句組〉]
[〈函數(shù)名〉=〈表達(dá)式〉]
[ExitFunction]
[〈語句組〉]
[〈函數(shù)名〉=〈表達(dá)式〉]
EndFunction
【說明】
(1)〈表達(dá)式〉的值是函數(shù)返回的結(jié)果。在語法中通過賦值語句將值賦給〈函數(shù)名〉,該值就是函數(shù)過程返回的值。
(2)〈語句組〉中可以有一個(gè)或多個(gè)ExitFunction語句,以從函數(shù)過程中退出。
(3)其他部分的含義與子過程相同。
【課堂演練】
【實(shí)例7-3】編寫求矩形面積的自定義函數(shù)。
【實(shí)現(xiàn)步驟】
在代碼窗口中直接輸入下面的代碼即可:
PublicFunctionarea(aAsInteger,bAsInteger)AsLong
area=a*b ‘計(jì)算并返回函數(shù)值
EndFunction
【實(shí)例7-4】編寫計(jì)算任意整數(shù)n的階乘的Function過程fact。
【實(shí)現(xiàn)步驟】
具體代碼如下:
Functionfact(xAsInteger)AsLong
DimpAsLong,iAsInteger
p=1
Fori=1Tox
p=p*i ‘累乘
Nexti
fact=p’返回函數(shù)值
EndFunction
4.直接調(diào)用函數(shù)
函數(shù)過程的調(diào)用很簡單,與使用VB內(nèi)部函數(shù)一樣,可以在表達(dá)式中直接寫上它的名字。例如,假設(shè)已經(jīng)編有計(jì)算矩形面積的函數(shù)過程area(),則調(diào)用方法為
MsgBox"矩形面積為:"&area(5,6)
5.用Call語句調(diào)用函數(shù)
調(diào)用函數(shù)過程與調(diào)用子過程一樣。利用下面的代碼能調(diào)用同一個(gè)函數(shù)過程:
Callarea(2,4)
area2,4
當(dāng)用這種方法調(diào)用函數(shù)時(shí),VB放棄返回值。
6.調(diào)用無參函數(shù)
函數(shù)可以沒有參數(shù),在調(diào)用無參函數(shù)時(shí)不發(fā)生虛實(shí)結(jié)合。調(diào)用無參函數(shù)會(huì)得到一個(gè)固定的值,如對(duì)于無參函數(shù):
FunctionF2
F2=“Followme.”
EndFunction
可如下調(diào)用:
Debug.PrintF2
【課堂演練】
【實(shí)例7-5】利用Function函數(shù)求矩形面積。
【實(shí)現(xiàn)步驟】
直接調(diào)用【實(shí)例7-3】中的area函數(shù),代碼如下:
PrivateSubForm_Load()
Show
Label3.Caption=area(5,6)‘通過實(shí)參調(diào)用area函數(shù)并輸出
EndSub
圖7.11(a)所示為輸入的函數(shù)代碼和事件過程代碼。運(yùn)行結(jié)果如圖7.11(b)所示。圖7.11利用Function函數(shù)求矩形面積
【實(shí)例7-6】求1到6的階乘之和。
【實(shí)現(xiàn)步驟】
(1)問題分析。利用【實(shí)例7-4】中求階乘的Function過程fact,主程序通過調(diào)用該函數(shù)依次求得1!、2!、3!……6!的值,然后把這些值累加。
(2)應(yīng)用程序用戶界面的建立與對(duì)象屬性的設(shè)置參見圖7.12。
(3)?Function過程的代碼參見【實(shí)例7-4】。下面寫出命令按鈕的Click事件代碼:
PrivateSubCommand1_Click()
DimsumAsLong,iAsInteger‘定義數(shù)據(jù)類型
Fori=1To6’求1到6的階乘
sum=sum+fact(i)‘累加階乘和
Nexti
Label2.Caption=sum’輸出結(jié)果
EndSub(4)代碼輸入窗口和程序運(yùn)行結(jié)果如圖7.12所示。圖7.12求階乘和
【實(shí)例7-7】編制隨機(jī)整數(shù)Function過程,輸出n個(gè)指定范圍的隨機(jī)數(shù)。
【實(shí)現(xiàn)步驟】
(1)問題分析。利用用戶自定義函數(shù)定義隨機(jī)整數(shù)函數(shù),可以產(chǎn)生指定范圍之內(nèi)的隨機(jī)整數(shù)。在主程序中指定范圍和產(chǎn)生的個(gè)數(shù)。
(2)程序界面的設(shè)計(jì)和對(duì)象屬性的設(shè)置參見圖7.13。圖7.13輸出n個(gè)指定范圍內(nèi)的隨機(jī)數(shù)
(3)編寫代碼。
首先自定義Function函數(shù),用以返回指定范圍之內(nèi)的隨機(jī)整數(shù):
PrivateFunctionRandomnum(nAsInteger,mAsInteger)
RandomizeTimer ‘隨機(jī)數(shù)種子
Randomnum=Int(Rnd*(b+1–a))+a’產(chǎn)生并返回隨機(jī)數(shù)
EndFunction“生成”命令按鈕Command1的Click事件代碼為
PrivateSubCommand1_Click()
DimnAsInteger,xAsInteger,yAsInteger
n=Val(InputBox(“隨機(jī)數(shù)的個(gè)數(shù):”,“請(qǐng)輸入”,“100”))
x=Val(Text1.Text)
y=Val(Text2.Text)
Fori=1Ton
List1.AddItemRandomnum(x,y)‘在列表框中添加隨機(jī)數(shù)
Next
EndSub“清空”命令按鈕Command2的Click事件代碼為
PrivateSubCommand2_Click()
List1.Clear
EndSub
(4)運(yùn)行程序,結(jié)果如圖7.13所示。
【實(shí)例7-8】編寫Function過程返回指定字符、長度的字符串,實(shí)現(xiàn)在窗體上輸出如圖7.14所示的圖形。圖7.14輸出圖形
【實(shí)現(xiàn)步驟】
(1)編寫能夠返回指定字符、長度字符串的Function過程:
PrivateFunctionstri(nAsInteger,fAsString)
p=“”
Fori=1Ton‘指定長度
p=p&“”&f’連接字符串
Next
stri=p‘返回函數(shù)值
EndFunction
(2)編寫窗體的Click事件代碼,調(diào)用上述stri過程:
PrivateSubForm_Click()
DimfAsString*1
f=InputBox(“顯示的字符:”,“請(qǐng)輸入”,“$”) ‘指定組成圖形的字符
Iff=“”Thenf=“$”’輸出字符,默認(rèn)為“$”
Cls
Forn=1To7‘輸出7行
PrintTab(2*n+2); ’定位
Printstri(15–2*n,f); ‘輸出左半部分
PrintSpc(8);’左右兩部分間的間隔
Printstri(2*n–1,f);‘輸出右半部分
Print’換行
Next
EndSub
8.查看當(dāng)前模塊中的過程
若要查看現(xiàn)有的通用過程或函數(shù)過程,則可先在代碼編輯器窗口的對(duì)象列表框中選擇“通用”項(xiàng),然后在過程列表框中選擇過程名。
若要查看事件過程,則可先在代碼編輯器窗口的對(duì)象列表框中選擇適當(dāng)?shù)膶?duì)象,然后在過程列表框中選擇事件。
9.查看其他模塊中的過程
在“視圖”菜單中選取“對(duì)象瀏覽器”命令,打開窗口,如圖7.15所示。在工程/庫列表框中選擇工程,在類/模塊列表框中選擇模塊,并在成員列表框中選擇過程,單擊“查看定義”按鈕。圖7.15查看其他模塊中的過程
任務(wù)7.4參數(shù)傳遞
任務(wù)導(dǎo)入
調(diào)用過程的目的就是在一定的條件下完成某一工作或計(jì)算某一函數(shù)值。外界需要把條件告訴過程,反過來,過程也需要把某些結(jié)果報(bào)告給外界,這就是過程與外界的數(shù)據(jù)傳遞。
過程與外界的數(shù)據(jù)傳遞方式有兩種:一是通過非局部變量;二是通過參數(shù)。在過程體中使用非局部變量(如全程變量),就是直接處理外界的量。學(xué)習(xí)目標(biāo)
(1)理解形式參數(shù)與實(shí)際參數(shù)的概念。
(2)理解按值傳遞與按地址傳遞的區(qū)別。
(3)會(huì)正確使用參數(shù)實(shí)現(xiàn)數(shù)據(jù)傳遞。
(4)會(huì)將數(shù)組或數(shù)組元素作為參數(shù)進(jìn)行傳遞。任務(wù)實(shí)施
1.理解形式參數(shù)與實(shí)際參數(shù)的概念
形式參數(shù)是在子過程和函數(shù)過程的定義中出現(xiàn)的變量名;實(shí)際參數(shù)則是在調(diào)用子過程和函數(shù)過程時(shí),傳送給子過程和函數(shù)過程的常數(shù)、變量、表達(dá)式或數(shù)組。
在VB中,通常把形式參數(shù)叫做“形參”,把實(shí)際參數(shù)叫做“實(shí)參”。
形參表中的各個(gè)變量之間用逗號(hào)分隔,表中的變量可以是:
后面跟有左、右圓括號(hào)的數(shù)組名。
除定長字符串之外的合法變量名。在形參表中只能用如aAsString之類的變長字符串作為形參,不能用如aAsString*8之類的定長字符串作為形參,但定長字符串可以作為實(shí)參傳遞給過程。
實(shí)參表中的各項(xiàng)用逗號(hào)隔開,實(shí)參可以是:常量、表達(dá)式、合法的變量名或后面跟有左、右圓括號(hào)的數(shù)組名。形參與實(shí)參的對(duì)應(yīng)關(guān)系為
【說明】
(1)在定義過程時(shí),形參為實(shí)參保留位置。在調(diào)用過程時(shí),實(shí)參被插入形參中對(duì)應(yīng)的各變量處,第一個(gè)形參接收第一個(gè)實(shí)參的值,第二個(gè)形參接收第二個(gè)實(shí)參的值……
(2)實(shí)參表和形參表中對(duì)應(yīng)的變量名不必相同,但是變量的個(gè)數(shù)必須相等,且各實(shí)參的類型必須與相應(yīng)的形參相符。
2.了解傳遞參數(shù)的兩種方式
在調(diào)用過程時(shí),一般調(diào)用過程與定義過程之間有數(shù)據(jù)傳遞,即將調(diào)用過程的實(shí)參傳遞給定義過程,完成實(shí)參與形參的結(jié)合,然后執(zhí)行調(diào)用過程。
在VB中,實(shí)參與形參的結(jié)合有兩種方法,即“傳址”和“傳值”。傳遞參數(shù)的方式有兩種:如果調(diào)用語句中的實(shí)際參數(shù)是常量或表達(dá)式,或者定義過程時(shí)選用ByVal關(guān)鍵字,就可以按值傳遞;如果調(diào)用語句中的實(shí)際參數(shù)為變量,或者定義過程時(shí)選用ByRefl關(guān)鍵字,就可以按地址傳遞。
3.學(xué)習(xí)傳址調(diào)用
傳址就是讓過程根據(jù)變量的內(nèi)存地址去訪問實(shí)際變量的內(nèi)容,即形參與實(shí)參使用相同的內(nèi)存地址單元,這樣,通過子過程就可以改變變量本身的值。系統(tǒng)默認(rèn)按地址傳遞參數(shù)。
在傳址調(diào)用時(shí),實(shí)參必須是變量,常量或表達(dá)式無法傳址。
【課堂演練】
【例7-9】傳址調(diào)用示例。
現(xiàn)在有下面的通用過程:
Subtryout(xAsInteger,yAsInteger)
x=x+100‘在子程序中改變變量的值
y=y*6’在子程序中改變變量的值
Print“x=”;x,“y=”;y‘在子程序中輸出變量的值
EndSub窗體Form的Click事件代碼如下:
PrivateSubForm_Click()
DimaAsInteger,bAsInteger
a=10‘主程序中變量的原值
b=20’主程序中變量的原值
tryouta,b‘傳址調(diào)用
Print“a=”;a,“b=”;b’在主程序中輸出變量的值圖7.16傳址調(diào)用
EndSub圖7.16傳址調(diào)用在事件過程中,由于通過“tryouta,b”語句調(diào)用過程tryout,實(shí)參a和b的值分別為10和20,傳送給tryout后進(jìn)行計(jì)算,在通用過程中輸出的x和y分別為110和120,而在事件過程中輸出的a和b同樣為110和120。
4.學(xué)習(xí)傳值調(diào)用
傳值就是通過值傳送實(shí)參,即傳送實(shí)參的值而不是傳送它的地址。在這種情況下,系統(tǒng)把需要傳送的變量復(fù)制到一個(gè)臨時(shí)單元中,然后把該臨時(shí)單元的地址傳送給被調(diào)用的通用過程。由于通用過程沒有訪問變量(實(shí)參)的原始地址,因而不會(huì)改變?cè)瓉碜兞康闹担械淖兓际窃谧兞康母北旧线M(jìn)行的。當(dāng)要求變量按值傳送時(shí),可以用下面的方法:
把變量變成一個(gè)表達(dá)式。把變量轉(zhuǎn)換成表達(dá)式的最簡單的方法就是把它放在括號(hào)內(nèi),即把變量用括號(hào)括起來,把它變?yōu)橐粋€(gè)表達(dá)式,如“(a)”。
定義過程時(shí)用ByVal關(guān)鍵字指出參數(shù)是按值來傳遞
的,如:
SubPostAc(ByValxAsInteger)
x=x+2
EndSub
【實(shí)例7-10】傳值調(diào)用示例。將【實(shí)例7-9】改用傳值方式編寫通用過程,則運(yùn)行結(jié)果將不同。
改為傳值方式的通用過程如下:
Subtryout(ByValxAsInteger,ByValyAsInteger)
x=x+100‘在子程序中改變變量的值
y=y*6’在子程序中改變變量的值
Print“x=”;x,“y=”;y‘在子程序中輸出變量的值
EndSub窗體Form的Click事件代碼與【實(shí)例7-9】相同:
PrivateSubForm_Click()
DimaAsInteger,bAsInteger
a=10‘主程序中變量的原值
b=20’主程序中變量的原值
tryouta,b‘傳值調(diào)用
Print“a=”;a,“b=”;b’在主程序中輸出變量的值
EndSub運(yùn)行程序后,輸出結(jié)果如圖7.17所示。圖7.17傳值調(diào)用示例過程中的變量名即使與主程序中使用的變量名相同,在內(nèi)存中也會(huì)占用不同的內(nèi)存單元地址。在執(zhí)行過程時(shí),即使其變量內(nèi)容發(fā)生變化,主程序中的變量內(nèi)容也不會(huì)隨之改變。
用傳值調(diào)用這種傳遞參數(shù)的方法只能傳遞計(jì)算值,如數(shù)值、字符串。采用值參數(shù)(傳值)只能從外界向過程(函數(shù))傳入信息,但不能傳出;而采用變量參數(shù)(傳址)則既能傳入,又能傳出。正是由于不能傳出,過程結(jié)束后,值參數(shù)的值就不會(huì)影響外界的任何量,因而在一定意義上說,值參數(shù)比較安全。變量參數(shù)和值參數(shù)各有特點(diǎn),采用哪一種更合適則需要視情況而定。一般來說,需要傳出參數(shù)值時(shí)應(yīng)該用變量參數(shù),否則采用值參數(shù)為好。
值參數(shù)與變量參數(shù)的一種重要區(qū)別是,值參數(shù)對(duì)應(yīng)的實(shí)參是表達(dá)式,而變量參數(shù)對(duì)應(yīng)的只能是變量。
5.使用可選的參數(shù)
在過程的形參表中加上Optional關(guān)鍵字,就可以指定過程的形式參數(shù)為可選的。如果指定了可選參數(shù),則參數(shù)表中此參數(shù)后面的其他參數(shù)也必是可選的,并且每個(gè)參數(shù)都要用Optional關(guān)鍵字來聲明。
【課堂演練】
【實(shí)例7-11】可選參數(shù)示例。使兩個(gè)命令按鈕的事件代碼調(diào)用同一個(gè)過程,一個(gè)傳遞一個(gè)參數(shù),而另一個(gè)傳遞兩個(gè)參數(shù),如圖7.18所示。圖7.18使用可選參數(shù)示例
【實(shí)現(xiàn)步驟】
(1)Sub過程ListText將傳遞過來的參數(shù)值添加到列表框中,其中第2個(gè)參數(shù)使用Optional關(guān)鍵字,該過程的代碼為
PrivateSubListText(xAsString,OptionalyAsString)
IfIsMissing(y)Then‘用IsMissing函數(shù)測(cè)試丟失的可選參數(shù)
temp=Format(x,"@@@@@@@@@@")
Else
temp=Format(x,“@@@@@@@@@@”)&Format(y,“@@@@@@@@@@”)
EndIf
List1.AddItemtemp‘在列表框中添加項(xiàng)目
EndSub
(2)傳遞一個(gè)參數(shù)的命令按鈕Command1的Click事件代
碼為
PrivateSubCommand1_Click()
DimaAsString
a=InputBox(“”)‘通過輸入框輸入變量的值
CallListText(a)’帶一個(gè)實(shí)參調(diào)用過程
EndSub
(3)傳遞兩個(gè)參數(shù)的命令按鈕Command2的Click事件代碼為
PrivateSubCommand2_Click()
DimaAsString,bAsString
a=InputBox(“”)‘通過輸入框輸入變量的值
b=InputBox(“”) ’通過輸入框輸入變量的值
CallListText(a,b)‘帶兩個(gè)實(shí)參調(diào)用過程
EndSub
(4)運(yùn)行程序,單擊“一個(gè)參數(shù)”按鈕,產(chǎn)生一個(gè)參數(shù);單擊“兩個(gè)參數(shù)”按鈕,產(chǎn)生兩個(gè)參數(shù),如圖7.18所示。
6.提供可選參數(shù)的默認(rèn)值
可以給可選參數(shù)指定默認(rèn)值。
【課堂演練】
【例7-12】在【實(shí)例7-11】中,可以為未傳遞的參數(shù)指定一個(gè)缺省值,如圖7.19所示。
【實(shí)現(xiàn)步驟】
只需修改Sub過程ListText的代碼:
PrivateSubListText(xAsString,OptionalyAsString=“☆☆☆☆”)
temp=Format(x,“@@@@@@@@@@”)&Format(y,“@@@@@@@@@@”)
List1.AddItemtemp
EndSub圖7.19為未傳遞的參數(shù)指定一個(gè)缺省值
7.使用不定數(shù)量的參數(shù)
一般來說,過程調(diào)用中的參數(shù)個(gè)數(shù)應(yīng)等于過程說明中的參數(shù)個(gè)數(shù)。如果使用ParamArray關(guān)鍵字,則過程可以接受任意個(gè)數(shù)的參數(shù)。
【課堂演練】
【實(shí)例7-13】改寫【實(shí)例7-11】中的Sub過程ListText,使之可以接收任意多個(gè)參數(shù),如圖7.20所示。圖7.20接收任意多個(gè)參數(shù)
【實(shí)現(xiàn)步驟】
(1)Sub過程ListText的代碼改為
PrivateSubListText(ParamArraystrx())
ForEachxInstrx
temp=temp&Format(x,“|@@@@@@”)
Next
List1.AddItemtemp
EndSub
(2)傳遞一個(gè)參數(shù)的命令按鈕Command1的Click事件代
碼為
PrivateSubCommand1_Click()
DimaAsString
a=Left(InputBox(“”),6)
CallListText(a)‘帶一個(gè)參數(shù)調(diào)用過程
EndSub
(3)傳遞兩個(gè)參數(shù)的命令按鈕Command2的Click事件代
碼為
PrivateSubCommand2_Click()
DimaAsString,bAsString
a=Left(InputBox(“”),6)
b=Left(InputBox(“”),6)
CallListText(a,b)‘帶兩個(gè)參數(shù)調(diào)用過程
EndSub
(4)傳遞三個(gè)參數(shù)的命令按鈕Command3的Click事件代
碼為
PrivateSubCommand3_Click()
DimaAsString,bAsString,cAsString
a=Left(InputBox(“”),6)
b=Left(InputBox(“”),6)
c=Left(InputBox(“”),6)
CallListText(a,b,c) ‘帶三個(gè)參數(shù)調(diào)用過程
EndSub
8.傳遞數(shù)組
VB允許把數(shù)組作為實(shí)參傳送到過程中。例如,假設(shè)定義了如下過程:
Subs(a(),b())
EndSub該過程有兩個(gè)形參,這兩個(gè)參數(shù)都是數(shù)組。注意,用數(shù)組作為過程的參數(shù)時(shí),應(yīng)在數(shù)組名的后面加上一對(duì)括號(hào),以免與普通變量相混淆。可以用下面的語句調(diào)用過程:
Calls(p(),q())這樣就把數(shù)組p和q傳送給過程中的數(shù)組a和b。當(dāng)用數(shù)組作為過程的參數(shù)時(shí),使用的是傳址方式,而不是傳值方式,即不是把p數(shù)組中各元素的值一一傳送給過程的a數(shù)組,而是把p數(shù)組的起始地址傳給過程,使a數(shù)組也具有與p數(shù)組相同的起始
地址。
9.傳遞數(shù)組的全部元素
為了把一個(gè)數(shù)組的全部元素傳送給一個(gè)過程,應(yīng)將數(shù)組名分別放入實(shí)參表和形參表中,并略去數(shù)組的上下界,但括號(hào)不能省略。
【課堂演練】
【例7-14】傳遞數(shù)組中的全部元素示例。
【實(shí)現(xiàn)步驟】
(1)在窗體層聲明如下數(shù)組:
Dimvalues()AsInteger
(2)編寫如下通用過程:
StaticSubchangarray(minAsInteger,maxAsInteger,p()AsInteger)
Fori=minTomax
p(i)=i^3
Nexti
EndSub
StaticSubprintarray(minAsInteger,maxAsInteger,p()AsInteger)
Fori=minTomax
Printp(i);‘輸出各數(shù)組元素的值
Nexti
EndSub
(3)編寫窗體Form的Click事件代碼為
PrivateSubForm_Click()
ReDimvalues(1To10)AsInteger
Callchangarray(1,10,values())‘調(diào)用通用過程
changarray
Callprintarray(1,10
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年土地證抵押貸款協(xié)議3篇
- 漯河職業(yè)技術(shù)學(xué)院《化工分離工程》2023-2024學(xué)年第一學(xué)期期末試卷
- 2024年度施工現(xiàn)場(chǎng)消防通道及安全標(biāo)志設(shè)置服務(wù)協(xié)議3篇
- 洛陽師范學(xué)院《電磁場(chǎng)與電磁波》2023-2024學(xué)年第一學(xué)期期末試卷
- 洛陽科技職業(yè)學(xué)院《數(shù)字設(shè)備與裝置》2023-2024學(xué)年第一學(xué)期期末試卷
- 2024年展會(huì)贊助:商業(yè)贊助與合作協(xié)議3篇
- 2024年度云計(jì)算服務(wù)具體服務(wù)內(nèi)容合同3篇
- 2024年度專業(yè)牛羊養(yǎng)殖場(chǎng)規(guī)?;忎N合同書3篇
- 臨時(shí)咖啡師招募合同
- 2024年班組工人勞動(dòng)安全合同3篇
- 2024年可行性研究報(bào)告投資估算及財(cái)務(wù)分析全套計(jì)算表格(含附表-帶只更改標(biāo)紅部分-操作簡單)
- 創(chuàng)業(yè)修煉智慧樹知到期末考試答案章節(jié)答案2024年同濟(jì)大學(xué)
- (完整版)自由泳教案
- 2024春期國開電大《應(yīng)用寫作(漢語)》形考任務(wù)1-6參考答案
- MOOC 英文技術(shù)寫作-東南大學(xué) 中國大學(xué)慕課答案
- 企業(yè)EHS風(fēng)險(xiǎn)管理基礎(chǔ)智慧樹知到期末考試答案2024年
- 國開2024年《機(jī)械設(shè)計(jì)基礎(chǔ)》形考任務(wù)1-4答案
- 鏡片加工知識(shí)之四研磨
- 乒乓球中的力學(xué)原理PPT課件
- 激光原理與激光技術(shù)習(xí)題全解(北工大)
- 中央空調(diào)設(shè)備運(yùn)行管理方案課案
評(píng)論
0/150
提交評(píng)論