




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐ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ǔ)上,對事件過程的語法格式和使用時的注意事項進(jìn)行歸納,便于學(xué)生系統(tǒng)、全面地掌握過程的設(shè)計方法。學(xué)習(xí)目標(biāo)
(1)掌握事件過程的語法格式。
(2)了解使用事件過程的注意事項。
(3)了解常用的鍵盤事件。
(4)了解常用的鼠標(biāo)事件。任務(wù)實施
1.理解事件過程的觸發(fā)
對象事件在用戶或系統(tǒng)發(fā)出動作時被觸發(fā),事件響應(yīng)時執(zhí)行的過程就是事件過程。事件過程一般由VB創(chuàng)建,用戶不能增加或刪除。當(dāng)用戶對某個對象發(fā)出一個動作時,Windows會通知VB產(chǎn)生了一個事件,VB會自動地調(diào)用與該事件相關(guān)的事件過程,即當(dāng)對象對一個事件的發(fā)生做出認(rèn)定時,VB便自動用相應(yīng)事件的名字調(diào)用該事件的過程。由于名字在對象和代碼之間建立了聯(lián)系,因此說事件過程是依附于窗體和控件的。
2.掌握事件過程的語法格式
控件事件過程的語法格式為
PrivateSub〈控件名〉_〈事件名〉([形參表])
[〈語句組〉]
EndSub
窗體事件過程的語法格式為
PrivateSubForm_〈事件名〉([形參表])
[〈語句組〉]
EndSub
3.了解創(chuàng)建事件過程時的注意事項
(1)雖然用戶可以手工鍵入首行的事件過程名,但使用模板會更方便,模板會自動將正確的過程名包括進(jìn)來。使用模板創(chuàng)建事件過程的方法是:在對象列表框中選定活動的窗體中的對象名(如Command1),在過程列表框中選擇事件名(如Click事件),系統(tǒng)就會在代碼編輯器窗口中生成該對象所選事件的過程模板,如圖7.1所示。然后在Sub和EndSub語句之間輸入代碼。圖7.1使用模板創(chuàng)建事件過程
(2)事件過程名是由VB自動給出的,如Command1_Click,因此,在為新控件或?qū)ο缶帉懯录a之前,應(yīng)先設(shè)置它的Name屬性。圖7.2中將Command1的Name屬性設(shè)置為Cmdopen,因而事件過程名就自動給出為Cmdopen_Click。圖7.2設(shè)置對象的Name屬性
4.了解鍵盤事件
1)?KeyPress鍵盤事件
當(dāng)用戶按下和松開一個ASCII字符鍵時發(fā)生KeyPress事件。該事件被觸發(fā)時,被按鍵的ASCII碼將自動傳遞給事件過程的KeyAscii參數(shù)。在程序中,通過訪問該參數(shù),可獲知用戶按下了哪一個鍵,并可識別字母的大小寫。其語法格式為
PrivateSub
對象名_KeyPress(keyasciiAsInteger)
其中,參數(shù)keyascii是被按下字符鍵的標(biāo)準(zhǔn)ASCII碼。對它進(jìn)行改變可給對象發(fā)送一個不同的字符。將keyascii改變?yōu)?時可取消擊鍵。
【說明】
(1)具有焦點(diǎn)的對象才能接收該事件。一個窗體僅在它沒有可視和有效的控件或KeyPreview屬性被設(shè)置為True時才能接收該事件。
(2)?KeyPress事件可以引用任何可打印的鍵盤字符、來自標(biāo)準(zhǔn)字母表的字符或少數(shù)幾個特殊字符之一的字符與Ctrl鍵的組合、Enter鍵或Backspace鍵。
2)?KeyDown和KeyUp鍵盤事件
KeyDown和KeyUp事件是當(dāng)一個對象具有焦點(diǎn)時按下或松開一個鍵時發(fā)生的。當(dāng)控制焦點(diǎn)位于某對象上時,按下鍵盤中的任意一鍵,會在該對象上觸發(fā)KeyDown事件,當(dāng)釋放該鍵時,將觸發(fā)KeyUp事件,之后產(chǎn)生KeyPress事件。其語法格式為
PrivateSub
對象名_KeyDown(KeyCodeAsInteger,shiftAsInteger)
PrivateSub
對象名_KeyUp(KeyCodeAsInteger,shiftAsInteger)
【說明】
(1)參數(shù)KeyCode項用于返回被按鍵的掃描代碼。由于掃描碼主要反映物理鍵位,因此通過該參數(shù)不能區(qū)分字母大小寫。
(2)?shift參數(shù)返回一個整數(shù),該整數(shù)相應(yīng)于Shift、Ctrl和Alt鍵的狀態(tài)。shift參數(shù)等于1、2和4分別表示Shift、Ctrl和Alt鍵被按下,而三數(shù)的部分和表示三個按鈕部分地被同時按下。例如,Ctrl鍵和Alt鍵都被按下,則shift的值就是6。因此,可結(jié)合該參數(shù)項來判斷輸入字母的大小寫。
(3)?Tab鍵不能引用KeyDown和KeyUp事件;命令按鈕的Default屬性設(shè)置為True時,Enter鍵不能引用KeyDown和KeyUp事件;命令按鈕的Cancel屬性設(shè)置為True時,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)(其中不包括拖放事件)。其實,Click事件是由MouseDown和MouseUp組成的,因此MouseDown和MouseUp是最基本的鼠標(biāo)事件。
當(dāng)鼠標(biāo)指針位于無控件的窗體上方時,窗體將識別鼠標(biāo)事件;當(dāng)鼠標(biāo)指針在控件上方時,控件將識別上述三種鼠標(biāo)事件。如果鼠標(biāo)被持續(xù)地按下,則第一次按下之后捕獲鼠標(biāo)的對象將接收全部鼠標(biāo)事件,直至所有按鈕被釋放為止。
1)?MouseDown和MouseUp鼠標(biāo)事件
MouseDown和MouseUp事件在按下(MouseDown)或者釋放(MouseUp)鼠標(biāo)按鈕時發(fā)生。其語法格式為
PrivateSub
對象名_MouseDown(buttonAsInteger,shiftAsInteger,xAsSingle,y
AsSingle)
PrivateSub
對象名_MouseUp(buttonAsInteger,shiftAsInteger,xAsSingle,yAs
Single)
【說明】
(1)參數(shù)button返回一個整數(shù),其值分別等于1、2和4時,對應(yīng)于左按鈕、右按鈕以及中間按鈕的動作。注意:只能有一個按鈕引起事件。
(2)與鍵盤事件一樣,參數(shù)shift返回一個整數(shù),在button參數(shù)指定的按鈕被按下或被釋放的情況下,該整數(shù)相應(yīng)于Shift、Ctrl和Alt鍵的狀態(tài)。
(3)參數(shù)x和y返回一個指定鼠標(biāo)指針當(dāng)前位置的數(shù)。
2)?MouseMove鼠標(biāo)事件
MouseMove事件在移動鼠標(biāo)時發(fā)生。其語法格式為
PrivateSub
對象名_MouseMove(buttonAsInteger,shiftAsInteger,xAsSingle,yAsSingle)任務(wù)7.2子過程
任務(wù)導(dǎo)入
當(dāng)有幾個不同的事件過程需要執(zhí)行相同的操作時,為了簡化程序,可以將公共語句放入分離開的子過程(通用過程)中,并由事件過程來調(diào)用它。
子過程不與任何特定的事件相聯(lián)系,只能由別的過程來調(diào)用,它可以存儲在窗體或標(biāo)準(zhǔn)模塊中。本任務(wù)學(xué)習(xí)子過程的創(chuàng)建和調(diào)用方法。學(xué)習(xí)目標(biāo)
(1)會建立、調(diào)用子過程。
(2)能熟練使用子過程編寫程序。任務(wù)實施
1.認(rèn)知建立子過程的方法
子過程與事件過程不同,子過程不是由對象的某種事件激活的,也不依附于某一對象,故其創(chuàng)建的方法與事件過程的略有區(qū)別。建立子過程的方法有兩種:
(1)使用“添加過程”對話框。
(2)直接在代碼編輯窗口中輸入過程代碼。
2.使用“添加過程”對話框創(chuàng)建子過程
使用“添加過程”對話框創(chuàng)建子過程的步驟如下:
(1)打開代碼編輯窗口。
(2)單擊“工具”菜單中的“添加過程”命令,打開“添加過程”對話框,如圖7.3所示。圖7.3“添加過程”對話框
(3)在“名稱”文本框中輸入過程名,如“shuru”;在“類型”組中選擇“子程序”項;從“范圍”組中選擇范圍,相當(dāng)于使用Public(公有的)或Private(私有的)關(guān)鍵字。
(4)單擊“確定”按鈕。可以看到在對象列表框中為“通用”,在過程列表框中為“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)鍵字,則該過程中的所有局部變量的存儲空間只分配一次,且這些變量的值在整個程序運(yùn)行期間都存在;如果省略Static,則過程每次被調(diào)用時重新為其變量分配存儲空間,當(dāng)該過程結(jié)束時釋放其變量的存儲空間。
(3)〈過程名〉與變量名的命名規(guī)則相同,長度不得超過40個字符。
(4)在過程內(nèi),不能再定義過程,但可以調(diào)用其他子過程或函數(shù)過程。
4.調(diào)用子過程
調(diào)用子過程的方法有兩種:
(1)使用Call語句,語法格式為
Call〈過程名〉([〈實參表〉])
(2)直接使用過程名,語法格式為
〈過程名〉[〈實參表〉]例如,下面兩個語句都能調(diào)用aaa子過程:
aaa12
Callaaa(12)
其中的12是實際參數(shù)。實際參數(shù)可以是常量、變量或表達(dá)式,如:
M=12
Callaaa(M)
【課堂演練】
【實例7-1】編寫一個計算矩形面積的Sub過程,然后調(diào)用該過程計算矩形面積。
【實現(xiàn)步驟】
(1)問題分析。使用通用過程來計算并輸出矩形的面積,它有兩個形參,分別為矩形的長和寬。在窗體的單擊事件過程Form_Click中,從鍵盤輸入矩形的長和寬,并用它們作為實參調(diào)用通用過程。
(2)建立應(yīng)用程序用戶界面,并設(shè)置對象屬性如圖7.5所示。圖7.5建立計算矩形面積的用戶界面
(3)在代碼窗口中直接輸入通用事件代碼:
Subrecarea(rlen,rwid)
Dimarea
area=rlen*rwid‘計算矩形面積
MsgBox“矩形的面積是:”&area’用消息框輸出矩形面積
EndSub
(4)編寫窗體Form的單擊事件代碼:
PrivateSubForm_click()
Dima,b
a=InputBox(“請輸入矩形面積的長度:”) ‘用輸入框輸入矩形的長
b=InputBox(“請輸入矩形面積的寬度:”) ’用輸入框輸入矩形的寬
recareaa,b‘調(diào)用recarea過程,也可以改為Callrecarea(a,b)
EndSub編寫子過程與窗體的事件過程代碼,如圖7.6所示。圖7.6編寫子過程與窗體的事件過程代碼
(5)運(yùn)行工程。單擊標(biāo)準(zhǔn)工具欄中的“啟動”按鈕,運(yùn)行工程;單擊窗體,依次輸入矩形的長、寬,如圖7.7所示,求得矩形面積如圖7.8所示。圖7.7輸入矩形的長、寬圖7.8矩形面積的計算結(jié)果
【實例7-2】編寫一個用來延遲指定時間(秒)的Sub過程。通過調(diào)用該過程,按指定的時間間隔顯示若干行信息。
【實現(xiàn)步驟】
(1)問題分析。用For循環(huán)可以實現(xiàn)時間延遲,但不精確。在此使用VB的內(nèi)部函數(shù)Timer來編寫較為精確的時間延遲過程。
Timer函數(shù)返回系統(tǒng)時鐘從午夜開始計算的秒數(shù),把Timer加上需要延遲的時間(秒)作為循環(huán)結(jié)束的時間,當(dāng)Timer超過該時間時結(jié)束循環(huán),即停止時間延遲時,用這種方法可以得到精確的時間延遲。
(2)為了簡化操作,直接在窗體上輸出,因此不再進(jìn)行屬性設(shè)置。(3)編寫通用事件過程代碼:
StaticSubdelayloop(delaytime)
Constsecinday=24&*60&*60&'一整天的秒數(shù)
loopfinish=Timer+delaytime'計算完成時間
Ifloopfinish>secindayThen'如果延遲時間從午夜前開始
loopfinish=loopfinish–secindayDoWhileTimer>loopfinish'利用空循環(huán)實現(xiàn)延遲
Loop
EndIf
DoWhileTimer<loopfinish'利用空循環(huán)實現(xiàn)延遲
Loop
EndSub一般情況下,Timer比loopfinish要小,因此可以用
DoWhileTimer<loopfinish
Loop
來控制時間延遲。但是,如果時間延遲從午夜前開始,到午夜后才結(jié)束,則Timer從0開始起算,在這種情況下,必須用
DoWhileTimer>loopfinish
Loop
來控制時間延遲。用上面的delayloop過程可以延遲指定的時間,調(diào)用時用需要延遲的時間(秒)作為實參。例如,延遲3秒可以用下面的代碼實現(xiàn):
delayloop3
(4)編寫窗體Form的Click事件代碼:
PrivateSubForm_Click()
Print“輸出第一行內(nèi)容?!?/p>
Print“請等3秒?!?/p>
delayloop3 ‘調(diào)用通用過程,延遲3秒
Print“輸出第二行內(nèi)容?!?/p>
Print“請等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時間延遲示例
任務(wù)7.3函數(shù)過程
任務(wù)導(dǎo)入
VB中包含了許多內(nèi)部函數(shù),如Int、Sqr等。用戶在編寫程序時,只需寫出一個函數(shù)名并給定參數(shù)就能得出函數(shù)值。但是,如果用戶在程序中需要多次用到某一公式或要處理某一函數(shù)關(guān)系,而又沒有現(xiàn)成的內(nèi)部函數(shù)可用時,則可以自己編寫函數(shù)(Function)過程。函數(shù)過程與內(nèi)部函數(shù)一樣,可以在程序或函數(shù)嵌套中使用。學(xué)習(xí)目標(biāo)
(1)會建立、調(diào)用函數(shù)過程。
(2)能熟練使用函數(shù)過程編寫程序。任務(wù)實施
1.認(rèn)知定義函數(shù)過程的方法
與子過程一樣,函數(shù)過程也是一個獨(dú)立的過程,可讀取參數(shù)、執(zhí)行一系列語句并改變其參數(shù)的值。與子過程不同的是,函數(shù)過程可返回給調(diào)用過程一個值。
函數(shù)過程的定義與子過程相似,可以使用“添加過程”對話框,也可以在代碼編輯窗口中直接輸入過程代碼。
2.通過“添加過程”對話框定義函數(shù)
譬如,創(chuàng)建一個用于求某數(shù)階乘的通用函數(shù)fact:先打開“添加過程”對話框,在“名稱”文本框中鍵入過程名“fact”,在“類型”組中選擇“函數(shù)”項,如圖7.10所示,再單擊“確定”按鈕即可產(chǎn)生函數(shù)過程的框架。圖7.10定義函數(shù)過程通常,由系統(tǒng)自動產(chǎn)生的函數(shù)過程框架還需要進(jìn)行適當(dāng)修改。由于函數(shù)過程有返回值,這個值就應(yīng)該屬于某種數(shù)據(jù)類型,因此,還需要在過程名后面加上對其返回值類型的定義和說明。另外,為了獲得傳遞過來的參數(shù),還需定義接收參數(shù)的變量等。
3.通過在代碼編輯窗口輸入代碼來定義函數(shù)
定義函數(shù)過程的語法格式為
[Private|Public][Static]Function〈函數(shù)名〉([〈形參表〉])[As〈類型〉]
[〈語句組〉]
[〈函數(shù)名〉=〈表達(dá)式〉]
[ExitFunction]
[〈語句組〉]
[〈函數(shù)名〉=〈表達(dá)式〉]
EndFunction
【說明】
(1)〈表達(dá)式〉的值是函數(shù)返回的結(jié)果。在語法中通過賦值語句將值賦給〈函數(shù)名〉,該值就是函數(shù)過程返回的值。
(2)〈語句組〉中可以有一個或多個ExitFunction語句,以從函數(shù)過程中退出。
(3)其他部分的含義與子過程相同。
【課堂演練】
【實例7-3】編寫求矩形面積的自定義函數(shù)。
【實現(xiàn)步驟】
在代碼窗口中直接輸入下面的代碼即可:
PublicFunctionarea(aAsInteger,bAsInteger)AsLong
area=a*b ‘計算并返回函數(shù)值
EndFunction
【實例7-4】編寫計算任意整數(shù)n的階乘的Function過程fact。
【實現(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)編有計算矩形面積的函數(shù)過程area(),則調(diào)用方法為
MsgBox"矩形面積為:"&area(5,6)
5.用Call語句調(diào)用函數(shù)
調(diào)用函數(shù)過程與調(diào)用子過程一樣。利用下面的代碼能調(diào)用同一個函數(shù)過程:
Callarea(2,4)
area2,4
當(dāng)用這種方法調(diào)用函數(shù)時,VB放棄返回值。
6.調(diào)用無參函數(shù)
函數(shù)可以沒有參數(shù),在調(diào)用無參函數(shù)時不發(fā)生虛實結(jié)合。調(diào)用無參函數(shù)會得到一個固定的值,如對于無參函數(shù):
FunctionF2
F2=“Followme.”
EndFunction
可如下調(diào)用:
Debug.PrintF2
【課堂演練】
【實例7-5】利用Function函數(shù)求矩形面積。
【實現(xiàn)步驟】
直接調(diào)用【實例7-3】中的area函數(shù),代碼如下:
PrivateSubForm_Load()
Show
Label3.Caption=area(5,6)‘通過實參調(diào)用area函數(shù)并輸出
EndSub
圖7.11(a)所示為輸入的函數(shù)代碼和事件過程代碼。運(yùn)行結(jié)果如圖7.11(b)所示。圖7.11利用Function函數(shù)求矩形面積
【實例7-6】求1到6的階乘之和。
【實現(xiàn)步驟】
(1)問題分析。利用【實例7-4】中求階乘的Function過程fact,主程序通過調(diào)用該函數(shù)依次求得1!、2!、3!……6!的值,然后把這些值累加。
(2)應(yīng)用程序用戶界面的建立與對象屬性的設(shè)置參見圖7.12。
(3)?Function過程的代碼參見【實例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求階乘和
【實例7-7】編制隨機(jī)整數(shù)Function過程,輸出n個指定范圍的隨機(jī)數(shù)。
【實現(xiàn)步驟】
(1)問題分析。利用用戶自定義函數(shù)定義隨機(jī)整數(shù)函數(shù),可以產(chǎn)生指定范圍之內(nèi)的隨機(jī)整數(shù)。在主程序中指定范圍和產(chǎn)生的個數(shù)。
(2)程序界面的設(shè)計和對象屬性的設(shè)置參見圖7.13。圖7.13輸出n個指定范圍內(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ù)的個數(shù):”,“請輸入”,“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所示。
【實例7-8】編寫Function過程返回指定字符、長度的字符串,實現(xiàn)在窗體上輸出如圖7.14所示的圖形。圖7.14輸出圖形
【實現(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(“顯示的字符:”,“請輸入”,“$”) ‘指定組成圖形的字符
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ù)過程,則可先在代碼編輯器窗口的對象列表框中選擇“通用”項,然后在過程列表框中選擇過程名。
若要查看事件過程,則可先在代碼編輯器窗口的對象列表框中選擇適當(dāng)?shù)膶ο?,然后在過程列表框中選擇事件。
9.查看其他模塊中的過程
在“視圖”菜單中選取“對象瀏覽器”命令,打開窗口,如圖7.15所示。在工程/庫列表框中選擇工程,在類/模塊列表框中選擇模塊,并在成員列表框中選擇過程,單擊“查看定義”按鈕。圖7.15查看其他模塊中的過程
任務(wù)7.4參數(shù)傳遞
任務(wù)導(dǎo)入
調(diào)用過程的目的就是在一定的條件下完成某一工作或計算某一函數(shù)值。外界需要把條件告訴過程,反過來,過程也需要把某些結(jié)果報告給外界,這就是過程與外界的數(shù)據(jù)傳遞。
過程與外界的數(shù)據(jù)傳遞方式有兩種:一是通過非局部變量;二是通過參數(shù)。在過程體中使用非局部變量(如全程變量),就是直接處理外界的量。學(xué)習(xí)目標(biāo)
(1)理解形式參數(shù)與實際參數(shù)的概念。
(2)理解按值傳遞與按地址傳遞的區(qū)別。
(3)會正確使用參數(shù)實現(xiàn)數(shù)據(jù)傳遞。
(4)會將數(shù)組或數(shù)組元素作為參數(shù)進(jìn)行傳遞。任務(wù)實施
1.理解形式參數(shù)與實際參數(shù)的概念
形式參數(shù)是在子過程和函數(shù)過程的定義中出現(xiàn)的變量名;實際參數(shù)則是在調(diào)用子過程和函數(shù)過程時,傳送給子過程和函數(shù)過程的常數(shù)、變量、表達(dá)式或數(shù)組。
在VB中,通常把形式參數(shù)叫做“形參”,把實際參數(shù)叫做“實參”。
形參表中的各個變量之間用逗號分隔,表中的變量可以是:
后面跟有左、右圓括號的數(shù)組名。
除定長字符串之外的合法變量名。在形參表中只能用如aAsString之類的變長字符串作為形參,不能用如aAsString*8之類的定長字符串作為形參,但定長字符串可以作為實參傳遞給過程。
實參表中的各項用逗號隔開,實參可以是:常量、表達(dá)式、合法的變量名或后面跟有左、右圓括號的數(shù)組名。形參與實參的對應(yīng)關(guān)系為
【說明】
(1)在定義過程時,形參為實參保留位置。在調(diào)用過程時,實參被插入形參中對應(yīng)的各變量處,第一個形參接收第一個實參的值,第二個形參接收第二個實參的值……
(2)實參表和形參表中對應(yīng)的變量名不必相同,但是變量的個數(shù)必須相等,且各實參的類型必須與相應(yīng)的形參相符。
2.了解傳遞參數(shù)的兩種方式
在調(diào)用過程時,一般調(diào)用過程與定義過程之間有數(shù)據(jù)傳遞,即將調(diào)用過程的實參傳遞給定義過程,完成實參與形參的結(jié)合,然后執(zhí)行調(diào)用過程。
在VB中,實參與形參的結(jié)合有兩種方法,即“傳址”和“傳值”。傳遞參數(shù)的方式有兩種:如果調(diào)用語句中的實際參數(shù)是常量或表達(dá)式,或者定義過程時選用ByVal關(guān)鍵字,就可以按值傳遞;如果調(diào)用語句中的實際參數(shù)為變量,或者定義過程時選用ByRefl關(guān)鍵字,就可以按地址傳遞。
3.學(xué)習(xí)傳址調(diào)用
傳址就是讓過程根據(jù)變量的內(nèi)存地址去訪問實際變量的內(nèi)容,即形參與實參使用相同的內(nèi)存地址單元,這樣,通過子過程就可以改變變量本身的值。系統(tǒng)默認(rèn)按地址傳遞參數(shù)。
在傳址調(diào)用時,實參必須是變量,常量或表達(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,實參a和b的值分別為10和20,傳送給tryout后進(jìn)行計算,在通用過程中輸出的x和y分別為110和120,而在事件過程中輸出的a和b同樣為110和120。
4.學(xué)習(xí)傳值調(diào)用
傳值就是通過值傳送實參,即傳送實參的值而不是傳送它的地址。在這種情況下,系統(tǒng)把需要傳送的變量復(fù)制到一個臨時單元中,然后把該臨時單元的地址傳送給被調(diào)用的通用過程。由于通用過程沒有訪問變量(實參)的原始地址,因而不會改變原來變量的值,所有的變化都是在變量的副本上進(jìn)行的。當(dāng)要求變量按值傳送時,可以用下面的方法:
把變量變成一個表達(dá)式。把變量轉(zhuǎn)換成表達(dá)式的最簡單的方法就是把它放在括號內(nèi),即把變量用括號括起來,把它變?yōu)橐粋€表達(dá)式,如“(a)”。
定義過程時用ByVal關(guān)鍵字指出參數(shù)是按值來傳遞
的,如:
SubPostAc(ByValxAsInteger)
x=x+2
EndSub
【實例7-10】傳值調(diào)用示例。將【實例7-9】改用傳值方式編寫通用過程,則運(yùn)行結(jié)果將不同。
改為傳值方式的通用過程如下:
Subtryout(ByValxAsInteger,ByValyAsInteger)
x=x+100‘在子程序中改變變量的值
y=y*6’在子程序中改變變量的值
Print“x=”;x,“y=”;y‘在子程序中輸出變量的值
EndSub窗體Form的Click事件代碼與【實例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)存中也會占用不同的內(nèi)存單元地址。在執(zhí)行過程時,即使其變量內(nèi)容發(fā)生變化,主程序中的變量內(nèi)容也不會隨之改變。
用傳值調(diào)用這種傳遞參數(shù)的方法只能傳遞計算值,如數(shù)值、字符串。采用值參數(shù)(傳值)只能從外界向過程(函數(shù))傳入信息,但不能傳出;而采用變量參數(shù)(傳址)則既能傳入,又能傳出。正是由于不能傳出,過程結(jié)束后,值參數(shù)的值就不會影響外界的任何量,因而在一定意義上說,值參數(shù)比較安全。變量參數(shù)和值參數(shù)各有特點(diǎn),采用哪一種更合適則需要視情況而定。一般來說,需要傳出參數(shù)值時應(yīng)該用變量參數(shù),否則采用值參數(shù)為好。
值參數(shù)與變量參數(shù)的一種重要區(qū)別是,值參數(shù)對應(yīng)的實參是表達(dá)式,而變量參數(shù)對應(yīng)的只能是變量。
5.使用可選的參數(shù)
在過程的形參表中加上Optional關(guān)鍵字,就可以指定過程的形式參數(shù)為可選的。如果指定了可選參數(shù),則參數(shù)表中此參數(shù)后面的其他參數(shù)也必是可選的,并且每個參數(shù)都要用Optional關(guān)鍵字來聲明。
【課堂演練】
【實例7-11】可選參數(shù)示例。使兩個命令按鈕的事件代碼調(diào)用同一個過程,一個傳遞一個參數(shù),而另一個傳遞兩個參數(shù),如圖7.18所示。圖7.18使用可選參數(shù)示例
【實現(xiàn)步驟】
(1)Sub過程ListText將傳遞過來的參數(shù)值添加到列表框中,其中第2個參數(shù)使用Optional關(guān)鍵字,該過程的代碼為
PrivateSubListText(xAsString,OptionalyAsString)
IfIsMissing(y)Then‘用IsMissing函數(shù)測試丟失的可選參數(shù)
temp=Format(x,"@@@@@@@@@@")
Else
temp=Format(x,“@@@@@@@@@@”)&Format(y,“@@@@@@@@@@”)
EndIf
List1.AddItemtemp‘在列表框中添加項目
EndSub
(2)傳遞一個參數(shù)的命令按鈕Command1的Click事件代
碼為
PrivateSubCommand1_Click()
DimaAsString
a=InputBox(“”)‘通過輸入框輸入變量的值
CallListText(a)’帶一個實參調(diào)用過程
EndSub
(3)傳遞兩個參數(shù)的命令按鈕Command2的Click事件代碼為
PrivateSubCommand2_Click()
DimaAsString,bAsString
a=InputBox(“”)‘通過輸入框輸入變量的值
b=InputBox(“”) ’通過輸入框輸入變量的值
CallListText(a,b)‘帶兩個實參調(diào)用過程
EndSub
(4)運(yùn)行程序,單擊“一個參數(shù)”按鈕,產(chǎn)生一個參數(shù);單擊“兩個參數(shù)”按鈕,產(chǎn)生兩個參數(shù),如圖7.18所示。
6.提供可選參數(shù)的默認(rèn)值
可以給可選參數(shù)指定默認(rèn)值。
【課堂演練】
【例7-12】在【實例7-11】中,可以為未傳遞的參數(shù)指定一個缺省值,如圖7.19所示。
【實現(xiàn)步驟】
只需修改Sub過程ListText的代碼:
PrivateSubListText(xAsString,OptionalyAsString=“☆☆☆☆”)
temp=Format(x,“@@@@@@@@@@”)&Format(y,“@@@@@@@@@@”)
List1.AddItemtemp
EndSub圖7.19為未傳遞的參數(shù)指定一個缺省值
7.使用不定數(shù)量的參數(shù)
一般來說,過程調(diào)用中的參數(shù)個數(shù)應(yīng)等于過程說明中的參數(shù)個數(shù)。如果使用ParamArray關(guān)鍵字,則過程可以接受任意個數(shù)的參數(shù)。
【課堂演練】
【實例7-13】改寫【實例7-11】中的Sub過程ListText,使之可以接收任意多個參數(shù),如圖7.20所示。圖7.20接收任意多個參數(shù)
【實現(xiàn)步驟】
(1)Sub過程ListText的代碼改為
PrivateSubListText(ParamArraystrx())
ForEachxInstrx
temp=temp&Format(x,“|@@@@@@”)
Next
List1.AddItemtemp
EndSub
(2)傳遞一個參數(shù)的命令按鈕Command1的Click事件代
碼為
PrivateSubCommand1_Click()
DimaAsString
a=Left(InputBox(“”),6)
CallListText(a)‘帶一個參數(shù)調(diào)用過程
EndSub
(3)傳遞兩個參數(shù)的命令按鈕Command2的Click事件代
碼為
PrivateSubCommand2_Click()
DimaAsString,bAsString
a=Left(InputBox(“”),6)
b=Left(InputBox(“”),6)
CallListText(a,b)‘帶兩個參數(shù)調(diào)用過程
EndSub
(4)傳遞三個參數(shù)的命令按鈕Command3的Click事件代
碼為
PrivateSubCommand3_Click()
DimaAsString,bAsString,cAsString
a=Left(InputBox(“”),6)
b=Left(InputBox(“”),6)
c=Left(InputBox(“”),6)
CallListText(a,b,c) ‘帶三個參數(shù)調(diào)用過程
EndSub
8.傳遞數(shù)組
VB允許把數(shù)組作為實參傳送到過程中。例如,假設(shè)定義了如下過程:
Subs(a(),b())
EndSub該過程有兩個形參,這兩個參數(shù)都是數(shù)組。注意,用數(shù)組作為過程的參數(shù)時,應(yīng)在數(shù)組名的后面加上一對括號,以免與普通變量相混淆??梢杂孟旅娴恼Z句調(diào)用過程:
Calls(p(),q())這樣就把數(shù)組p和q傳送給過程中的數(shù)組a和b。當(dāng)用數(shù)組作為過程的參數(shù)時,使用的是傳址方式,而不是傳值方式,即不是把p數(shù)組中各元素的值一一傳送給過程的a數(shù)組,而是把p數(shù)組的起始地址傳給過程,使a數(shù)組也具有與p數(shù)組相同的起始
地址。
9.傳遞數(shù)組的全部元素
為了把一個數(shù)組的全部元素傳送給一個過程,應(yīng)將數(shù)組名分別放入實參表和形參表中,并略去數(shù)組的上下界,但括號不能省略。
【課堂演練】
【例7-14】傳遞數(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等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年撒野學(xué)校考試試題及答案
- 2025年三江源的試題及答案
- 2025年語言的障礙測試題及答案
- 2025年兒內(nèi)科考試試題及答案
- 2025年目標(biāo)管理法試題及答案
- 2025年李娟散文考試題及答案
- 除了經(jīng)典邁克爾遜白光干涉外Twyman-Green型干涉(泰曼-格林干涉)的測量原理
- 2025年半成品食品測試題及答案
- 2025年知道思修考試試題及答案
- 核心素養(yǎng)下小學(xué)語文略讀課文的教學(xué)策略
- 傳染病布氏菌病 課件
- 商業(yè)廣告設(shè)計課件
- 教會行政管理學(xué)課程教案
- SJG 44-2018 深圳市公共建筑節(jié)能設(shè)計規(guī)范-高清現(xiàn)行
- 2022年高考(全國甲卷)語文仿真模擬卷【含答案】
- 瀘州老窖股權(quán)激勵方案案例分析
- 部編版小學(xué)語文三年級(下冊)學(xué)期課程綱要
- _重大事故后果分析(精)
- 水泥攪拌樁施工監(jiān)理質(zhì)量控制要點(diǎn)
- 初級診斷師培訓(xùn)課程QC基礎(chǔ)知識
- 第7章 吸附課件
評論
0/150
提交評論