I have a form with a series of 64 labels with Id lbl0, lbl1, lbl2, . . . . , lbl61, lbl62, lbl63
I am struggling to work out how to reference each in a for/next loop via their Id in order to populate the label text:
B4X:
Dim tmp As String
For b = 63 To 0 Step -1
tmp = "lbl" & b
' How to reference labels with Id lbl63, lbl62, . . . . , lbl2, lbl1, lbl0 as we step through loop?
Next
As a developer you should avoid duplicating code. I sometimes see code such as: Sub Button1_Click x = 1 End Sub Sub Button2_Click x = 2 End Sub ... If you like to write such code then unfortunately this quiz is not for you... In this quiz you need to add 2000 buttons to the main activity...
www.b4x.com
You can use a Map to map between the name and the Objects.
Add the objects - after you loaded the layout - to the map.
B4X:
dim m as Map
m.initialize
m.Put("lbl0", lbl0)
m.Put("lbl2", lbl2)
m.Put("lbl3", lbl3)
'
' Use
dim lbl as label = m.get("lbl0")
Dim tmp As String
For b = 63 To 0 Step -1
tmp = "lbl" & b
' How to reference labels with Id lbl63, lbl62, . . . . , lbl2, lbl1, lbl0 as we step through loop?
dim lbl as label = m.get(tmp)
' work with lbl....
Next
Sub Class_Globals
Private Root As B4XView
Private xui As XUI
Private lbl0, lbl1, lbl2, lbl3, lbl4, lbl5, lbl6, lbl7, lbl8, lbl9, lbl10 As B4XView
Private Labels() As B4XView
End Sub
Private Sub B4XPage_Created (Root1 As B4XView)
Root = Root1
Root.LoadLayout("MainPage")
Labels = Array As B4XView(lbl0, lbl1, lbl2, lbl3, lbl4, lbl5, lbl6, lbl7, lbl8, lbl9, lbl10)
For i = 0 To Labels.Length - 1
Labels(i).Text = "lbl" & i
Next
End Sub
Thanks all for your suggestions which provided a selection of paths to take.
As it was a legacy project with the form created in SceneBuilder to which I just wanted to add some labels as a quick diagnostic tool, I finished up using this code to add the labels which I could reference:
B4X:
Private dataLabels(64) As Label
Sub AppStart (Form1 As Form, Args() As String
Dim lblX As Int = 45
Dim lblY As Int = 410
For b = 63 To 0 Step -1
dataLabels(b).Initialize("Label")
dataLabels(b).Text = "1"
dataLabels(b).Alignment = "CENTER"
MainForm.RootPane.AddNode(dataLabels(b), lblX, lblY, 15, 15)
lblX = lblX + 15
Next
End Sub
Sub ScoreboardText(Text As String)
For b = 0 To 63
dataLabels(63 - b).text = Text.SubString2(b, b + 1)
Next
End Sub