向過程傳遞參數(shù)
過程中的代碼通常需要某些關(guān)于程序狀態(tài)的信息才能完成它的工作。信息包括在調(diào)用過程時傳遞到過程內(nèi)的變量。當(dāng)將變量傳遞到過程時,稱變量為參數(shù)。
參數(shù)的數(shù)據(jù)類型
過程的參數(shù)被缺省為具有 variant 數(shù)據(jù)類型。不過,也可以聲明參數(shù)為其它數(shù)據(jù)類型。例如,下面的函數(shù)接受一個字符串和一個整數(shù):
function whatsforlunch(weekday as string, hour _
as integer) as string
‘根據(jù)星期幾和時間,返回午餐菜單。
if weekday = “friday” then
whatsforlunch = “fish”
else
whatsforlunch = “chicken”
end if
if hour > 4 then whatsforlunch = “too late”
end function
詳細(xì)信息 關(guān)于 visual basic 的數(shù)據(jù)類型,請參閱本章前面部分。也可以在語言參考中查找指定的數(shù)據(jù)類型。
按值傳遞參數(shù)
按值傳遞參數(shù)時,傳遞的只是變量的副本。如果過程改變了這個值,則所作變動只影響副本而不會影響變量本身。用 byval 關(guān)鍵字指出參數(shù)是按值來傳遞的。
例如:
sub postaccounts (byval intacctnum as integer)
.
. ’這里放語句。
.
end sub
按地址傳遞參數(shù)
按地址傳遞參數(shù)使過程用變量的內(nèi)存地址去訪問實際變量的內(nèi)容。結(jié)果,將變量傳遞給過程時,通過過程可永遠(yuǎn)改變變量值。按地址傳遞參數(shù)在 visual basic 中是缺省的。
如果給按地址傳遞參數(shù)指定數(shù)據(jù)類型,就必須將這種類型的值傳給參數(shù)。可以給參數(shù)傳遞一個表達(dá)式,而不是數(shù)據(jù)類型。visual basic 計算表達(dá)式,如果可能的話,還會按要求的類型將值傳遞給參數(shù)。
把變量轉(zhuǎn)換成表達(dá)式的最簡單的方法就是把它放在括號內(nèi)。例如,為了把聲明為整數(shù)的變量傳遞給過程,該過程以字符串為參數(shù),則可以用下面的語句:
sub callingprocedure ()
dim intx as integer
intx = 12 * 3
foo (intx)
end sub
sub foo (bar as string)
msgbox bar ‘bar 的值為字符串‘ 36 ’。
end sub
使用可選的參數(shù)
在過程的參數(shù)列表中列入 optional 關(guān)鍵字,就可以指定過程的參數(shù)為可選的。如果指定了可選參數(shù),則參數(shù)表中此參數(shù)后面的其它參數(shù)也必是可選的,并且要用 optional 關(guān)鍵字來聲明。下面兩段示例代碼假定有一個窗體,其內(nèi)有一命令按鈕和一列表框。
例如,這段代碼提供所有可選參數(shù):
dim strname as string
dim straddress as string
sub listtext(optional x as string, optional y _
as string)
list1.additem x
list1.additem y
end sub
private sub command1_click ()
strname = “yourname”
optional
straddress = 12345 ’提供了兩個參數(shù)。
call listtext (strname, straddress)
end sub
而下面的代碼并未提供全部可選參數(shù):
dim strname as string
dim varaddress as variant
sub listtext (x as string, optional y as variant)
list1.additem x
if not ismissing (y) then
list1.additem y
end if
end sub
private sub command1_click ()
strname = “yourname” ‘未提供第二個參
’數(shù)。
call listtext (strname)
end sub
在未提供某個可選參數(shù)時,實際上將該參數(shù)作為具有 empty 值的變體來賦值。上例說明如何用 ismissing 函數(shù)測試丟失的可選參數(shù)。
提供可選參數(shù)的缺省值
也可以給可選參數(shù)指定缺省值。在下例中,如果未將可選參數(shù)傳遞到函數(shù)過程,則返回一個缺省值。
sub listtext(x as string, optional y as _
integer = 12345)
list1.additem x
list1.additem y
end sub
private sub command1_click ()
strname = “yourname” ‘未提供第二個參
’數(shù)。
call listtext (strname) ‘添加“yourname”和
’“12345”。
end sub
使用不定數(shù)量的參數(shù)
一般說來,過程調(diào)用中的參數(shù)個數(shù)應(yīng)等于過程說明的參數(shù)個數(shù)。可用 paramarray 關(guān)鍵字指明,過程將接受任意個數(shù)的參數(shù)。于是可以這樣來編寫計算總和的 sum 函數(shù):
dim x as integer
dim y as integer
dim intsum as integer
sub sum (paramarray intnums ())
for each x in intnums
y = y + x
next x
intsum = y
end sub
private sub command1_click ()
sum 1, 3, 5, 7, 8
list1.additem intsum
end sub
用命名的參數(shù)創(chuàng)建簡單語句
對許多內(nèi)建函數(shù)、語句和方法,visual basic 提供了命名參數(shù)方法來快捷傳遞參數(shù)值。對命名參數(shù),通過給命名參數(shù)賦值,就可按任意次序提供任意多參數(shù)。為此,鍵入命名參數(shù),其后為冒號、等號和值 (myargument := “somevalue”) ,可以按任意次序安排這些賦值,它們之間用逗號分開。注意,下例中的參數(shù)順序和所要參數(shù)的順序相反:
function listtext (strname as string, optional straddress as string)
list1.additem strname
list2.additem straddress
end sub
private sub command1_click ()
listtext straddress:=”12345”, strname:=”your name”
end sub
如果過程有若干不必總要指定的可選參數(shù),則上述內(nèi)容更為有用。
確定對命名參數(shù)的支持
要確定哪一個函數(shù)、語句和方法支持命名參數(shù),用“代碼”窗口中的“autoquickinfo”功能,檢查“對象瀏覽器”,或者參閱語言參考。使用命名參數(shù)時要注意以下幾點:
在 visual basic (vb) 對象庫中的對象的方法不支持命名參數(shù)。而 visual basic for applications (vba) 對象庫中的所有的語言關(guān)鍵字都支持命名的參數(shù)。
在語法中,命名參數(shù)是用粗體和斜體字表示的。所有其它參數(shù)只用斜體字表示。
重點 使用命名參數(shù)時不能省略所需參數(shù)的輸入??梢灾皇÷钥蛇x參數(shù)。對于 visual basic (vb) 和 visual basic for applications (vba) 對象庫,“對象瀏覽器”對話框?qū)⒖蛇x參數(shù)用方括號 [ ] 括起來。
詳細(xì)信息 請參閱語言參考中的 “byval”、”byref”、”optional” 和 “paramarray”。