2015-09-28 35 views
-1

我想使用變量作爲我的子參數之一,所以我可以在我的編碼中應用DRY: Don't Repeat Yourself。我真的不確定我怎麼說這個,因爲標題似乎與我真正的問題沒有關係。如何使用變量作爲子參數?

基本上我有這個代碼,我想轉換成子這樣我就可以把它多次

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 

在該代碼中,你可以看到,我重複我的代碼很大一部分是因爲我想將其應用於我的2個定時器(實際上我使用6個定時器,甚至可能比這更多)

這就是爲什麼我覺得將它轉換爲sub更實用,而且它在這裏。

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 

所以,現在我可以這樣使用它

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 

我的問題是,counter_1counter_2等。似乎沒有在recall_Service_num("01", Lbl_Temp_01, counter_1)工作?任何想法,我怎麼可以添加一個變量作爲我的子之一paremeters?

+0

那些ctypes的沒有 - 你是隻迭代面板,不需要TypeOf。然後,如果你用同樣的方式迭代標籤('...作爲Ctrl_Panel.Controls.OfType(Of Label)中的標籤'''''''''''''''''' – user3697824

+0

你不需要閱讀所有的代碼,我已經強調了導致問題的代碼 –

回答

1

除了通過櫃檯爲ByRef通過編碼器的建議|,使用Controls.Find()得到一個參考到你想要的標籤:需要對面板

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 
2

計數器參數通過BYVAL(即變量的副本)。您需要通過ByRef

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

那麼簡單!!哦,我的天啊,你是對的。 –

相關問題