简体   繁体   中英

How can I use variable as a parameter for sub?

I wanted to use variable as one of the parameters of my sub so I can apply DRY: Don't Repeat Yourself in my codings. I am really not sure on how do I say this because the title seems not related to my real question.

Basically I have this code that I want to convert into sub so I can just call it multiple times

Dim counter_1 As Integer = 0
Dim counter_2 As Integer = 0
Dim num_blink As Integer

Private Sub Tmr_Recall_Tick(sender As Object, e As EventArgs) Handles Tmr_Recall_01.Tick
    num_blink = ((CInt(My.Settings.num_blink) - 1) * 2)
    Service_Num = "01"
    Console.WriteLine(counter_1)
    Console.WriteLine(num_blink)
    If Lbl_Temp_01.Text = "1" Then
        If counter_1 <= num_blink Then
            For Each Ctrl_Panel As Panel In Me.Pnl_Service.Controls.OfType(Of Panel)()
                If TypeOf Ctrl_Panel Is Panel And Ctrl_Panel.Name = "Pnl_Service_" & Service_Num Then
                    For Each Ctrl_Lbl In Ctrl_Panel.Controls
                        If TypeOf Ctrl_Lbl Is Label And Ctrl_Lbl.Name = "Lbl_Service_Current_" & Service_Num Then
                            If CType(Ctrl_Lbl, Label).Visible = False Then
                                CType(Ctrl_Lbl, Label).Visible = True
                                CType(Ctrl_Lbl, Label).ForeColor = Color.Black
                            End If
                            If CType(Ctrl_Lbl, Label).ForeColor = Color.Red Then
                                CType(Ctrl_Lbl, Label).Visible = False
                            End If
                            If CType(Ctrl_Lbl, Label).Visible = True Then
                                CType(Ctrl_Lbl, Label).ForeColor = Color.Red
                            End If
                        End If
                        If TypeOf Ctrl_Lbl Is Label And Ctrl_Lbl.Name = "Lbl_Service_Window_" & Service_Num Then
                            If CType(Ctrl_Lbl, Label).Visible = False Then
                                CType(Ctrl_Lbl, Label).Visible = True
                                CType(Ctrl_Lbl, Label).ForeColor = Color.Black
                            End If
                            If CType(Ctrl_Lbl, Label).ForeColor = Color.Red Then
                                CType(Ctrl_Lbl, Label).Visible = False
                            End If
                            If CType(Ctrl_Lbl, Label).Visible = True Then
                                CType(Ctrl_Lbl, Label).ForeColor = Color.Red
                            End If
                        End If
                    Next
                End If
            Next Ctrl_Panel
            counter_1 += 1
        Else
            Lbl_Temp_01.Text = "0"
            counter_1 = 0
        End If
    Else
        For Each Ctrl_Panel As Panel In Me.Pnl_Service.Controls.OfType(Of Panel)()
            If TypeOf Ctrl_Panel Is Panel And Ctrl_Panel.Name = "Pnl_Service_" & Service_Num Then
                For Each Ctrl_Lbl In Ctrl_Panel.Controls
                    If TypeOf Ctrl_Lbl Is Label And Ctrl_Lbl.Name = "Lbl_Service_Current_" & Service_Num Then
                        CType(Ctrl_Lbl, Label).ForeColor = Color.Black
                        CType(Ctrl_Lbl, Label).Visible = True
                    End If
                    If TypeOf Ctrl_Lbl Is Label And Ctrl_Lbl.Name = "Lbl_Service_Window_" & Service_Num Then
                        CType(Ctrl_Lbl, Label).ForeColor = Color.Black
                        CType(Ctrl_Lbl, Label).Visible = True
                    End If
                Next
            End If
        Next Ctrl_Panel
    End If
End Sub

Private Sub Tmr_Recall_02_Tick(sender As Object, e As EventArgs) Handles Tmr_Recall_02.Tick
    num_blink = ((CInt(My.Settings.num_blink) - 1) * 2)
    Service_Num = "02"
    Console.WriteLine(counter_2)
    Console.WriteLine(num_blink)
    If Lbl_Temp_02.Text = "1" Then
        If counter_2 <= num_blink Then
            For Each Ctrl_Panel As Panel In Me.Pnl_Service.Controls.OfType(Of Panel)()
                If TypeOf Ctrl_Panel Is Panel And Ctrl_Panel.Name = "Pnl_Service_" & Service_Num Then
                    For Each Ctrl_Lbl In Ctrl_Panel.Controls
                        If TypeOf Ctrl_Lbl Is Label And Ctrl_Lbl.Name = "Lbl_Service_Current_" & Service_Num Then
                            If CType(Ctrl_Lbl, Label).Visible = False Then
                                CType(Ctrl_Lbl, Label).Visible = True
                                CType(Ctrl_Lbl, Label).ForeColor = Color.Black
                            End If
                            If CType(Ctrl_Lbl, Label).ForeColor = Color.Red Then
                                CType(Ctrl_Lbl, Label).Visible = False
                            End If
                            If CType(Ctrl_Lbl, Label).Visible = True Then
                                CType(Ctrl_Lbl, Label).ForeColor = Color.Red
                            End If
                        End If
                        If TypeOf Ctrl_Lbl Is Label And Ctrl_Lbl.Name = "Lbl_Service_Window_" & Service_Num Then
                            If CType(Ctrl_Lbl, Label).Visible = False Then
                                CType(Ctrl_Lbl, Label).Visible = True
                                CType(Ctrl_Lbl, Label).ForeColor = Color.Black
                            End If
                            If CType(Ctrl_Lbl, Label).ForeColor = Color.Red Then
                                CType(Ctrl_Lbl, Label).Visible = False
                            End If
                            If CType(Ctrl_Lbl, Label).Visible = True Then
                                CType(Ctrl_Lbl, Label).ForeColor = Color.Red
                            End If
                        End If
                    Next
                End If
            Next Ctrl_Panel
            counter_2 += 1
        Else
            Lbl_Temp_02.Text = "0"
            counter_2 = 0
        End If
    Else
        For Each Ctrl_Panel As Panel In Me.Pnl_Service.Controls.OfType(Of Panel)()
            If TypeOf Ctrl_Panel Is Panel And Ctrl_Panel.Name = "Pnl_Service_" & Service_Num Then
                For Each Ctrl_Lbl In Ctrl_Panel.Controls
                    If TypeOf Ctrl_Lbl Is Label And Ctrl_Lbl.Name = "Lbl_Service_Current_" & Service_Num Then
                        CType(Ctrl_Lbl, Label).ForeColor = Color.Black
                        CType(Ctrl_Lbl, Label).Visible = True
                    End If
                    If TypeOf Ctrl_Lbl Is Label And Ctrl_Lbl.Name = "Lbl_Service_Window_" & Service_Num Then
                        CType(Ctrl_Lbl, Label).ForeColor = Color.Black
                        CType(Ctrl_Lbl, Label).Visible = True
                    End If
                Next
            End If
        Next Ctrl_Panel
    End If
End Sub

In that code you can see that I am repeating a big chunk of my code because I want to apply it in my 2 timers (Actually I'm using 6 timers and it may be even more than that)

That's why I find it more practical to convert it to sub, and it is here.

Sub recall_Service_num(Service_Num As String, Lbl_Temp As Label, counter As Integer)
    num_blink = ((CInt(My.Settings.num_blink) - 1) * 2)
    Console.WriteLine(counter)
    Console.WriteLine(num_blink)
    If Lbl_Temp.Text = "1" Then
        If counter <= num_blink Then
            For Each Ctrl_Panel As Panel In frmQueuing.Pnl_Service.Controls.OfType(Of Panel)()
                If TypeOf Ctrl_Panel Is Panel And Ctrl_Panel.Name = "Pnl_Service_" & Service_Num Then
                    For Each Ctrl_Lbl In Ctrl_Panel.Controls
                        If TypeOf Ctrl_Lbl Is Label And Ctrl_Lbl.Name = "Lbl_Service_Current_" & Service_Num Then
                            If CType(Ctrl_Lbl, Label).Visible = False Then
                                CType(Ctrl_Lbl, Label).Visible = True
                                CType(Ctrl_Lbl, Label).ForeColor = Color.Black
                            End If
                            If CType(Ctrl_Lbl, Label).ForeColor = Color.Red Then
                                CType(Ctrl_Lbl, Label).Visible = False
                            End If
                            If CType(Ctrl_Lbl, Label).Visible = True Then
                                CType(Ctrl_Lbl, Label).ForeColor = Color.Red
                            End If
                        End If
                        If TypeOf Ctrl_Lbl Is Label And Ctrl_Lbl.Name = "Lbl_Service_Window_" & Service_Num Then
                            If CType(Ctrl_Lbl, Label).Visible = False Then
                                CType(Ctrl_Lbl, Label).Visible = True
                                CType(Ctrl_Lbl, Label).ForeColor = Color.Black
                            End If
                            If CType(Ctrl_Lbl, Label).ForeColor = Color.Red Then
                                CType(Ctrl_Lbl, Label).Visible = False
                            End If
                            If CType(Ctrl_Lbl, Label).Visible = True Then
                                CType(Ctrl_Lbl, Label).ForeColor = Color.Red
                            End If
                        End If
                    Next
                End If
            Next Ctrl_Panel
            counter += 1
        Else
            Lbl_Temp.Text = "0"
            counter = 0
        End If
    Else
        For Each Ctrl_Panel As Panel In frmQueuing.Pnl_Service.Controls.OfType(Of Panel)()
            If TypeOf Ctrl_Panel Is Panel And Ctrl_Panel.Name = "Pnl_Service_" & Service_Num Then
                For Each Ctrl_Lbl In Ctrl_Panel.Controls
                    If TypeOf Ctrl_Lbl Is Label And Ctrl_Lbl.Name = "Lbl_Service_Current_" & Service_Num Then
                        CType(Ctrl_Lbl, Label).ForeColor = Color.Black
                        CType(Ctrl_Lbl, Label).Visible = True
                    End If
                    If TypeOf Ctrl_Lbl Is Label And Ctrl_Lbl.Name = "Lbl_Service_Window_" & Service_Num Then
                        CType(Ctrl_Lbl, Label).ForeColor = Color.Black
                        CType(Ctrl_Lbl, Label).Visible = True
                    End If
                Next
            End If
        Next Ctrl_Panel
    End If
End Sub

So now I can use it like this

Dim counter_1 As Integer = 0
Dim counter_2 As Integer = 0
Dim counter_3 As Integer = 0
Dim counter_4 As Integer = 0

Private Sub Tmr_Recall_Tick(sender As Object, e As EventArgs) Handles Tmr_Recall_01.Tick
    recall_Service_num("01", Lbl_Temp_01, counter_1)
End Sub

Private Sub Tmr_Recall_02_Tick(sender As Object, e As EventArgs) Handles Tmr_Recall_02.Tick
    recall_Service_num("02", Lbl_Temp_02, counter_2)
End Sub

Private Sub Tmr_Recall_03_Tick(sender As Object, e As EventArgs) Handles Tmr_Recall_03.Tick
    recall_Service_num("03", Lbl_Temp_03, counter_3)
End Sub

Private Sub Tmr_Recall_04_Tick(sender As Object, e As EventArgs) Handles Tmr_Recall_04.Tick
    recall_Service_num("04", Lbl_Temp_04, counter_4)
End Sub

My problem is that, counter_1 , counter_2 , etc.. doesn't seem to work in recall_Service_num("01", Lbl_Temp_01, counter_1) ? Any idea on how can I add a variable as one of the paremeters in my sub?

The counter parameter is passed ByVal (ie. a copy of the variable).

You'll need to pass it in ByRef .

Sub recall_Service_num(Service_Num As String, Lbl_Temp As Label, ByRef counter As Integer)

In addition to passing the counter ByRef as suggested by coders|, use Controls.Find() to get a reference to your desired Labels:

Sub recall_Service_num(ByVal Service_Num As String, ByVal Lbl_Temp As Label, ByRef counter As Integer)
    num_blink = ((CInt(My.Settings.num_blink) - 1) * 2)
    Dim lblServiceCurrent As Label = frmQueuing.Controls.Find("Lbl_Service_Current_" & Service_Num, True).FirstOrDefault
    Dim lblServiceWindow As Label = frmQueuing.Controls.Find("Lbl_Service_Window_" & Service_Num, True).FirstOrDefault

    If Lbl_Temp.Text = "1" Then
        If counter <= num_blink Then
            If Not IsNothing(lblServiceCurrent) Then
                If lblServiceCurrent.Visible = False Then
                    lblServiceCurrent.Visible = True
                    lblServiceCurrent.ForeColor = Color.Black
                End If
                If lblServiceCurrent.ForeColor = Color.Red Then
                    lblServiceCurrent.Visible = False
                End If
                If lblServiceCurrent.Visible = True Then
                    lblServiceCurrent.ForeColor = Color.Red
                End If
            End If

            If Not IsNothing(lblServiceWindow) Then
                If lblServiceWindow.Visible = False Then
                    lblServiceWindow.Visible = True
                    lblServiceWindow.ForeColor = Color.Black
                End If
                If lblServiceWindow.ForeColor = Color.Red Then
                    lblServiceWindow.Visible = False
                End If
                If lblServiceWindow.Visible = True Then
                    lblServiceWindow.ForeColor = Color.Red
                End If
            End If

            counter += 1
        Else
            Lbl_Temp.Text = "0"
            counter = 0
        End If
    Else
        If Not IsNothing(lblServiceCurrent) Then
            lblServiceCurrent.ForeColor = Color.Black
            lblServiceCurrent.Visible = True
        End If

        If Not IsNothing(lblServiceWindow) Then
            lblServiceWindow.ForeColor = Color.Black
            lblServiceWindow.Visible = True
        End If
    End If
End Sub

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM