2017-09-26 5 views
3

Hier ist es ein Verfahren, in VB6 ist und es funktioniert gut, wie das Beispiel enthalten:Array als Argument in einem Verfahren VB6 vs vb.net

‚Check_UnCheck

‘ überprüfen eine Reihe von einigen Kontrollkästchen, deaktivieren ein Array von weiteren Ankreuzfelder

'Anwendungsbeispiel:

CheckBox.Check_UnCheck Array(chkCheck3, chkCheck5), Array(chkCheck1, chkCheck4) 


Public Sub Check_UnCheck(ByRef CheckArray As Variant, ByRef UnCheckArray As Variant) 

    Dim i As Integer 
    Dim conControl As Control 

    For i = LBound(CheckArray) To UBound(CheckArray) 
     Set conControl = CheckArray(i) 
     conControl.Value = 1 
    Next 

    For i = LBound(UnCheckArray) To UBound(UnCheckArray) 
     Set conControl = UnCheckArray(i) 
     conControl.Value = 0 
    Next 

End Sub 

was das Äquivalent in vb.net für das obige Verfahren ist, sagt die MSDN Dokumentation:

  • Wir können nicht mehr als ein Parameter-Array in einer Prozedur, verwenden und es muss das letzte Argument in der Prozedurdefinition sein.
+3

Sie ** können ** mehr als ein Parameter-Array:

Public Sub Check_UnCheck(CheckArray As IEnumerable(Of CheckBox), UnCheckArray As IEnumerable(Of CheckBox)) ' Here I have replaced the Variant, which is not supported in ' .net, with the generic IEnumerable of checkbox. I used an ' Ienumerable, instead of an array because it will allow making ' just a minor change to the call site. ' here I have eliminated the index variable, and moved the ' declaration of the conControl variable into the for each. ' Option Infer On statically types the variable as a checkbox For Each conControl In CheckArray ' Checkbox controls do not have a value property. ' 1 is not true, true is true. conControl.Checked = True Next For Each conControl in UnCheckArray conControl.Checked = False Next End Sub 

Dies würde dann wie so genannt werden. Die Einschränkung, die Sie erwähnen, ist für ein "ParamArray" nicht dasselbe. – Plutonix

Antwort

2

Versuchen Sie den folgenden Code.

Suchen Sie in Kommentare für eine detaillierte Beschreibung.

'DECLARE YOUR ARRAYS. 
Dim array1 = New CheckBox() {CheckBox3, CheckBox5} 
Dim array2 = New CheckBox() {CheckBox1, CheckBox4} 

'CALL CHECK AND UNCHECK FUNCTION. 
Check_UnCheck(array1, array2) 


'YOUR FUNCTION DEFINITION. 
Public Sub Check_UnCheck(ByRef CheckArray As CheckBox(), ByRef UnCheckArray As CheckBox()) 

    'LOOP FIRST ARRAY AND CHECK THEM. 
    For index = 0 To CheckArray.GetUpperBound(0) 
     CheckArray(index).Checked = True 
    Next 

    'LOOP SECOND ARRAY AND UNCHECK THEM. 
    For index = 0 To UnCheckArray.GetUpperBound(0) 
     UnCheckArray(index).Checked = False 
    Next 

End Sub 
+0

Diese Methode muss keine ByRef-Parameter verwenden. – jmoreno

+0

@jmoreno Es mag klarer sein (besonders für jemanden, der neu in der Sprache ist), ByRef explizit aufzurufen, auch wenn es technisch redundant ist. – DaveInCaz

+0

@DaveInCaz: Es ist nicht überflüssig, es ist eine Lüge. ByRef sagt, dass die Variable, die in der aufrufenden Methode als Parameter verwendet wird, möglicherweise geändert wird. Das passiert nicht .. – jmoreno

1

Zuerst verwirren Sie "Parameter-Array" mit einer Reihe von Steuerelementen, sie sind nicht das Gleiche. Ein Parameter-Array ist, wenn eine Methode eine variable Anzahl von Parametern (alle vom gleichen Typ) akzeptiert, der Compiler diese dann zu einem Array bündelt und diese an die Methode weiterleitet. Dazu muss die Methode das Schlüsselwort ParamArray verwenden.

VB.net hat keine contol-Arrays in dem Sinne, dass vb6 tat, aber das ist nicht, was Sie Beispiel verwenden. Ihr Beispiel verwendet ein einfaches Array von Steuerelementen. Nebenbei, Ihr Beispiel verwendet ByRef, das der Standard in VB6 war, aber es ist in diesem Fall für VB6 und VB.net nicht notwendig. Da die Verwendung in VB.net nicht mehr standardmäßig ist, ist die unnötige Verwendung irreführend.

Sie übergeben zwei Arrays, das zweite könnte ein ParamArray sein, aber das hat wenig Sinn.

Die grundlegende und minimale Änderung, um Ihren Code zur Arbeit zu bringen, ist einfach, ändern Sie die "Variante" in "CheckBox()". Aber das würde ich nicht empfehlen. Es gibt noch ein paar kleinere Änderungen, die es flexibler und lesbarer machen. ein Verfahren Check_UnCheck({chkCheck3, chkCheck}, {chkCheck1, chkCheck4})