4. 參 數

V isual Basic的參數可以被宣告為必要性參數或是選擇性參數,參數的資料型別可被限定為一種特定的型別,也可以不限任何型別,包括使用者自訂型別、陣列和列舉集合(Enumeration,簡稱Enum)等等。

本章的重點包括具名引數(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並不提供任何檢查─即使不合法的設定值也會被接受,你必須自己撰寫程式碼來檢查傳入的資料是否合法。