2013-04-16 55 views
5

此代码不起作用我想在VB6的Form_Load中创建一个控件数组,因为我必须将其中的225个作为拼字游戏板,并且它们必须精确。我的代码是:在代码中创建控制数组

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 

我用backcolor查看我所有的标签框。此代码不起作用。我收到一个错误“Object variable or With block variable not set”。任何帮助?我不知道什么是错的。我想将标签框保存在一个控制数组中,我知道如何做到这一点,而不必将其作为控件数组。

+1

你在哪一行得到错误? –

+1

另外,你想要一个“控制数组”(如你所说)或“控制数组”(如你的代码所说)?他们有些不同的东西。 –

+4

如果我正确记住,您需要在设计时将* first *'lblblocks'控件放置在表单上。 –

回答

6

科迪格雷在评论中说得对。我不相信你只能在VB6的代码中动态创建控件数组。您必须在窗体上放置一个控件实例,并为其指定一个Index属性值为零。这将创建一个只有一个元素的控件数组,其索引为零。然后,您可以修改代码以产生期望的结果,就像这样:

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 

正如评论指出的那样,你不需要数组索引为零,因为你这样做是为了加载控件的另一个实例在设计时间。我也从零开始迭代我的数组,以便更轻松地计算索引。

+0

感谢您的代码/答案,但我仍然在.Width行上得到相同的错误。我将如何声明数组@BobMc? – ashraj98

+1

没关系,你的天才!该代码完美工作,我只是在表单上的对象的名称错误。非常感谢! @BobMc – ashraj98