2013-07-06 89 views
1

我有這樣的過程:如何在此過程中將數組作爲參數傳遞?

''' <summary> 
    ''' Append text to the current text. 
    ''' </summary> 
    ''' <param name="text">The text to append</param> 
    ''' <param name="forecolor">The font color</param> 
    ''' <param name="backcolor">The Background color</param> 
    ''' <param name="font">The font of the text</param> 
    Public Sub Append_Text(ByVal text As String, _ 
          ByVal forecolor As Color, _ 
          Optional ByVal backcolor As Color = Nothing, _ 
          Optional ByVal font As Font = Nothing) 

     Dim index As Int32 = MyBase.TextLength 
     MyBase.AppendText(text) 
     MyBase.SelectionStart = index 
     MyBase.SelectionLength = MyBase.TextLength - index 
     MyBase.SelectionColor = forecolor 
     If Not backcolor = Nothing Then MyBase.SelectionBackColor = backcolor 
     If font IsNot Nothing Then MyBase.SelectionFont = font 
     MyBase.SelectionStart = MyBase.TextLength 
     MyBase.SelectionLength = 0 

    End Sub 

我所說的程序是這樣的:

RichTextLabel1.Append_Text("My ", Color.White, color.transparent, New Font("Arial", 12, FontStyle.Bold)) 
RichTextLabel1.Append_Text("RichText-", Color.White, , New Font("Arial", 12, FontStyle.Bold)) 

我的問題是,如果我可以過載(以及如何做修改)僅僅調用PROC一旦通過使用參數這樣的數組:

RichTextLabel1.Append_Text(_ 
{"My ", Color.White, Color.Transparent, New Font("Arial", 12, FontStyle.Bold)}, _ 
{"RichTextLabel", Color.White, Nothing, New Font("Arial", 16, FontStyle.Bold)}) 

(即一段代碼不工作明顯)

+0

的唯一途徑做你所要求的是有一個二維或鋸齒狀的「對象」數組,所以不存在類型安全性。爲什麼要調用這個方法那麼糟糕?這已經夠好了。 –

+0

@pswg感謝您的評論,只是我想簡化proc的用法,不要寫太多的代碼行,也不要調用過多的proc,也許我這次太樂觀了。要很難做這種修改,也許如果你能解釋我更多關於這個:「二維或鋸齒狀的對象陣列」 – ElektroStudios

+1

看到我的答案。我試圖說明每個選項的用法,並詳細解釋它們的問題。 –

回答

1

你必須要做到這一點使用two-dimensional array

Public Sub Append_Text(ByVal parameters As Object(,)) 
    If UBound(parameters, 2) <> 3 Then 
     Throw new ArgumentException("Array was not the correct size", "parameters") 
    End If 

    For i As Integer = 0 To UBound(parameters, 1) 
     Append_Text(_ 
      CType(parameters(i, 0), String), _ 
      CType(parameters(i, 1), Color), _ 
      CType(parameters(i, 2), Color), _ 
      CType(parameters(i, 3), Font)) 
    Next 
End Sub 

RichTextLabel1.Append_Text({ _ 
    {"My ", Color.White, Color.Transparent, New Font("Arial", 12, FontStyle.Bold)}, _ 
    {"RichTextLabel", Color.White, Nothing, New Font("Arial", 16, FontStyle.Bold)} _ 
}) 

還是這個使用jagged array

Public Sub Append_Text(ByVal parameters As Object()()) 
    For Each p In parameters 
     If UBound(p) <> 3 Then 
      Throw new ArgumentException("Array was not the correct size", "parameters") 
     End If 

     Append_Text(_ 
      CType(p(i)(0), String), _ 
      CType(p(i)(1), Color), _ 
      CType(p(i)(2), Color), _ 
      CType(p(i)(3), Font)) 
    Next 
End Sub 

RichTextLabel1.Append_Text({ _ 
    New Object(){"My ", Color.White, Color.Transparent, New Font("Arial", 12, FontStyle.Bold)}, _ 
    New Object(){"RichTextLabel", Color.White, Nothing, New Font("Arial", 16, FontStyle.Bold)} _ 
}) 

但最接近你問的是一個交錯數組與ParamArray關鍵字:

Public Sub Append_Text(ByVal ParamArray parameters As Object()()) 
    ' Same as Above 
End Sub 

RichTextLabel1.Append_Text(_ 
    {"My ", Color.White, Color.Transparent, New Font("Arial", 12, FontStyle.Bold)}, _ 
    {"RichTextLabel", Color.White, Nothing, New Font("Arial", 16, FontStyle.Bold)}) 

當然,所有的情況下的問題是,你完全上廁所se編譯時安全類型。沒有什麼能夠阻止用戶傳遞錯誤類型的參數或錯誤的參數數量(儘管我已經添加了簡單的運行時檢查來說明如何實現這一點)。最後,如果目標是減少添加多個項目所需的代碼行數,注意,只是調用該方法兩次的代碼實際上少行,你要問什麼:

' 2 lines of code 
RichTextLabel1.Append_Text("My ", Color.White, Color.Transparent, New Font("Arial", 12, FontStyle.Bold)) 
RichTextLabel1.Append_Text("RichTextLabel", Color.White, Nothing, New Font("Arial", 16, FontStyle.Bold)) 

' 3 lines of code 
RichTextLabel1.Append_Text(_ 
    {"My ", Color.White, Color.Transparent, New Font("Arial", 12, FontStyle.Bold)}, _ 
    {"RichTextLabel", Color.White, Nothing, New Font("Arial", 16, FontStyle.Bold)}) 
+0

謝謝,鋸齒陣列的例子不起作用,它會在「p」上拋出一個錯誤,第一個工作,但你能告訴我如何將該二維數組傳遞給過程?我已經閱讀了第一個和第二個鏈接,但是我無法理解傳遞數組的部分,我嘗試過混合使用{}和()。 – ElektroStudios

+1

@ElektroHacker對不起,請參閱我更新的答案。我還包括如何調用每個版本的示例。 –

相關問題