4. 參 數
本章的重點包括具名引數(Named Argument)、選擇性參數以及參數的資料型別等課題。
注意:
在本章中,我們用引數(Argument)代表要傳給程序的常數、變數或運算式,用參數(Parameter)來代表在程序中的局部變數,這些局部變數主要用來接收引數傳來的值。
如何使用具名引數?
在Visual Basic (事實上可以說在大部分語言),最常見的引數使用方式是按照既定的引數位置來排列引數的順序,讓被呼叫的程序依據引數的相對位置一一以取得傳來的值。如果某個程序依序需要三個參數sngRed、sngGreen、sngBlue,那麼每次呼叫這個程序時,一定要傳入三個引數,程序會把第一個引數值存入sngRed,第二個引數值存入sngGreen,第三個引數值存入sngBlue。
下面的例子則不是用這種方式使用引數。我們把具名引數(Named Argument)傳給被呼叫的程序,這裡的引數順序和前面的引數順序不一樣。
Option Explicit
Private Sub FormColor(sngRed As Single, sngGreen As Single, _
sngBlue As Single)
BackColor = RGB(sngRed * 256, sngGreen * 256, sngBlue * 256)
End Sub
Private Sub Form_Click()
FormColor sngBlue:=0, sngGreen:=0.5, sngRed:=1 'Brown
End Sub
具名引數最大的用處並不是讓我們在傳遞引數時可以任意改變引數的位置,而是可以讓我們只傳引數列中的某幾個引數,而省略掉其他的引數。當程序的引數列很長的時候,這個特性會顯得特別有用,但要運用這個特性,我們必須在程序定義的部份把某些或全部參數宣告為Optional。
如何使用Optional參數?
我們直接用下面這個例子來告訴你如何定義及使用Optional參數:
Option Explicit
Private Sub FormColor( _
Optional sngRed = 0, _
Optional sngGreen = 0, _
Optional sngBlue = 0 _
)
BackColor = RGB(sngRed * 256, sngGreen * 256, sngBlue * 256)
End Sub
Private Sub Form_Click()
FormColor sngGreen:=0.5 'Medium green
End Sub
在定義某個程序的參數列時,只要把Optional關鍵字加在參數前面,就可以選擇性地傳入部份或全部引數給程序,但是要記得,在呼叫程序時,必須指明要傳給哪個參數。在上例中我們只傳值給sngGreen參數,至於其他被省略的參數,程序會自動使用預設值0。
請注意,Visual Basic 6的參數預設值是設定在程序的參數列�堙A而在Visual Basic 4中,必須用IsMissing函式來檢查某個Optional參數,然後再設定其預設值。另外,Visual Basic 6現在可以讓我們明確地宣告Optional參數的資料型別。在宣告Optional參數的資料型別時,除了Variant之外,其他的基本資料型別也都可以使用。另外值得注意是,一旦定義某個參數為Optional參數之後,在它後面參數都必須定義成Optional。
參考資料:
在第三十章"發展工具" 裡的Metric應用程式是一個使用Optional參數的範例。
如何傳遞參數陣列?
在某個程序的參數列中,如果你把最後一個參數用ParamArray宣告為Variant陣列,就可以傳遞任意數目的引數給這個程序,這種參數稱為參數陣列(Parameter Array)。下面這個例子就是使用參數陣列:
Option Explicit
Private Function MakeVerticalList(ParamArray vntN()) As String
Dim strA As String, i As Integer
For i = LBound(vntN) To UBound(vntN)
strA = strA + vbCrLf + CStr(vntN(i))
Next i
MakeVerticalList = strA
End Function
Private Sub Form_Click()
Dim intA As Integer
Dim sngB As Single
Dim strC As String
intA = 123
sngB = 3.1416
strC = "This is a test."
Print MakeVerticalList(intA, sngB, strC)
Print
Print MakeVerticalList("This", "time", "we'll", "pass five", _
"string arguments.")
End Sub
我們呼叫了MakeVerticalList程序兩次,第一次用了三個不同型別的引數,第二次用了五個字串引數。圖4-1顯示了程式的輸出結果。
| 圖4-1 MakeVerticalList程序的輸出結果 |
如何用同一個參數傳遞任意型別的引數?
Variant變數可以存放任意型別的資料,這個特性讓我們可以傳遞不同型別的引數給程序,只要記得在宣告參數型別時用Variant (或完全不要用型別宣告,系統會預設這參數為Variant)。例如,在下面的例子裡,我們把整數、字串和陣列都傳給了VariantTest程序。
Option Explicit
Private Sub VariantTest(vntV)
Print TypeName(vntV)
End Sub
Private Sub Form_Click()
Dim dblA(3, 4, 5, 6, 7) As Double
VariantTest 123
VariantTest "This is a test string."
VariantTest dblA
End Sub
程序VariantTest唯一參數vntV的資料型別是Variant,因此它接受任何型別的引數。圖4-2顯示的是執行的結果。
| 圖4-2 使用Variant參數的程序的輸出結果 |
如何在參數列中使用列舉集合?
使用列舉集合(Enum)可以限定參數所能接受的值。Enum用一組被命名的元素來代表想要設定的值,就像Const關鍵字一樣,但是Enum的名稱可以作為程序中參數的型別。在撰寫程式碼時,如果你打入了使用某個Enum參數的程序名稱,Visual Basic的自動列出成員功能(Auto List Members)會把這個Enum中所有的成員自動顯示在一個快顯視窗中,簡化寫碼的工作。請用下面這個程式試試自動列出成員功能運作的情形:
Enum Number
Zero
One
Two
Three
End Enum
Sub ShowNumber(Value As Number)
MsgBox Value
End Sub
Sub Form_Load()
ShowNumber One
End Sub
當你在Form_Load程序�堨握JShowNumber後,Visual Basic會自動顯示一個含Number成員的清單,如果這時你點選其中一個成員,Visual Basic就會把被點選的成員填入引數列中。如果在一個使用者控制項(User Control)的屬性程序裡(例如Let)使用一個Enum來宣告其參數列,Visual Basic也提供了類似自動列出成員的功能,便利你撰寫程式。請看下面這個例子:
Enum Number
Zero
One
Two
End Enum
Dim mValue As Number
Property Get Value() As Number
Value = mValue
End Property
Property Let Value(Setting As Number)
mValue = Setting
End Property
Private Sub UserControl_ReadProperties(PropBag As PropertyBag)
mValue = PropBag.ReadProperty("Value", One)
End Sub
Private Sub UserControl_WriteProperties(PropBag As PropertyBag)
PropBag.WriteProperty "Value", mValue, One
End Sub
ReadProperties和WriteProperties事件程序用來維護屬性視窗中Value屬性的設定值,當你在屬性視窗中設定Value屬性時,你就可以看到在Number裡的成員:Zero、One、Two,如圖4-3所示。
| 圖4-3 在屬性視窗中列出列舉集合Number的成員 |
最後,我們要告訴你有兩則有關Enum的資訊。Enum會把浮點數自動強制轉換為長整數;如果你傳入0.9給前一個例子的ShowNumber程序,則其顯示的結果是1。其次,Enum並不提供任何檢查─即使不合法的設定值也會被接受,你必須自己撰寫程式碼來檢查傳入的資料是否合法。