ashraj98
ashraj98

Reputation: 384

Make control array in code

This code does not work I want to create a control array on my Form_Load in VB6 because I have to make 225 of them for a scrabble board and they have to be precise. My code is:

Private lblblocks(1 To 225) As Label

Private Sub Form_Load()
Dim i As Integer, j As Integer
For i = 1 To 15
    For j = 1 To 15
        Dim arrnum As Integer
        arrnum = (i - 1) * 15 + j
        Load lblblocks(arrnum)
        With lblblocks(arrnum)
            .Width = 1000
            .Height = 1000
            .Top = (i - 1) * 1000
            .Left = (j - 1) * 1000
            .Visible = True
            .BackColor = Int(Rnd(1) * 255) + &H100 * Int(Rnd(1) * 255) + &H10000 * Int(Rnd(1) * 255)
        End With
    Next j
Next i
End Sub

I used the backcolor to see all my label boxes. This code does not work. I get an error "Object variable or With block variable not set". Any help? I don't know what is wrong. I would like to keep the label boxes in a control array I know how to do it without making it a control array.

Upvotes: 5

Views: 7941

Answers (2)

Gurbachan Singh
Gurbachan Singh

Reputation: 1

we can add from scratch

Private Sub Command3_Click()
Dim rownum As Integer, ColNum As Integer
'Dim lblblocks(1 To 225) As Label
Dim lblblocks() As Label
Dim wwidth As Integer, hheight As Integer
wwidth = 400: hheight = 200
Dim i As Integer, j As Integer
rownum = 20: ColNum = 25
ReDim lblblocks(1 To rownum * ColNum)
For i = 1 To rownum
    For j = 1 To ColNum
        Dim arrnum As Integer
        arrnum = (i - 1) * ColNum + j
        Set lblblocks(arrnum) = Me.Controls.Add("VB.Label", "LB" & arrnum)
        With lblblocks(arrnum)
         'Set Bb(i) = formname.Controls.Add("VB.CommandButton", "Bb" & i)
            .Width = wwidth
            .Height = hheight
            '.Top = (i - 1) * 100
            '.Left = (j - 1) * 400
            .Top = (i) * hheight
            .Left = (j) * wwidth
            .Caption = arrnum
            .Visible = True
            .BackColor = Int(Rnd(1) * 255) + &H100 * Int(Rnd(1) * 255) + &H10000 * Int(Rnd(1) * 255)
        End With
    Next j
Next i
End Sub

Upvotes: 0

Bob Mc
Bob Mc

Reputation: 2008

Cody Gray had it correct in his comment. I don't believe you can create a control array on the fly only in code in VB6. You have to place one instance of the control on the form and give it an Index property value of zero. This creates a control array with only one element, at index zero. You can then modify your code to produce the desired result, like so:

Private Sub Form_Load()
    Dim i As Integer
    Dim j As Integer

    For i = 0 To 14
        For j = 0 To 14
            Dim tileIdx As Integer
            tileIdx = i * 15 + j

            'If the tile index is zero, we already have that control,
            'so there's no need to load new instance. Otherwise, use the 
            'Load method to create a new control in the array with the 
            'specified index.
            If tileIdx > 0 Then
                Load lblTile(tileIdx)
            End If

            With lblTile(tileIdx)
                .Width = 1000
                .Height = 1000
                .Top = i * 1000
                .Left = j * 1000
                .Visible = True
                .BackColor = Int(Rnd(1) * 255) + &H100 * Int(Rnd(1) * 255) + &H10000 * Int(Rnd(1) * 255)
            End With
        Next
    Next
End Sub

As noted in the comment, you don't need to load another instance of the control at array index zero because you did that at design time. I also iterated my array starting from zero for slightly easier calculation of the indices.

Upvotes: 7

Related Questions