[英]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. 我想将变量用作我的子对象的参数之一,因此我可以应用
DRY: Don't Repeat Yourself
在代码中DRY: Don't Repeat Yourself
。 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 基本上我有想要转换为sub的代码,所以我可以多次调用它
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) 在该代码中,您可以看到我重复了很大一部分代码,因为我想将其应用到我的2个计时器中(实际上,我正在使用6个计时器,它可能甚至更多)
That's why I find it more practical to convert it to sub, and it is here. 这就是为什么我发现将其转换为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
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)
? 我的问题是,
counter_1
, counter_2
等在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). 计数器参数通过ByVal传递(即变量的副本)。
You'll need to pass it in ByRef . 您需要在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: 除了按照编码器|的建议传递计数器ByRef之外,还可以使用Controls.Find()获得对所需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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.