注册 登录
编程论坛 VB6论坛

创建多个label控件,不是数组,数量会有变化怎么弄的?

wxflw 发布于 2013-06-09 08:10, 2424 次点击
Private WithEvents 查看 As Label

           Lname =  J ’变量
            Set 查看 = Me.Controls.Add("VB.Label", Lname)
             With 查看
                 .Visible = True
                 .Caption = "OK"
                 .Left = 5 * J + X - 2
                 .Top = T / 150 + Y + 8
                 .Width = 2
                 .Height = 4
                 .ForeColor = vbGreen '
                 .BackStyle = 0
                 .ToolTipText = rs.Fields("维修日期")
             End With
我可以动态生成控件,但是只有最后一个控件可以响应单机或鼠标事件,怎么处理?不适用数组。
 Controls.Remove Lname  '删除已创建的控件label

'--------------------------------------
'清空label控件
    For Each Label In Me.Controls
           If TypeOf Label Is Label Then        
                 Controls.Remove Label.Name
           End If
    Next
'--------------------------------------
8 回复
#2
风吹过b2013-06-09 08:17
为什么不适用数组???

因为你的 标签的名字是一样的,所以加载的过程中,后面的标签会把前面的 标签从 事件处理函数中去掉,所以只有最后一个 标签才有响应事件。
#3
风吹过b2013-06-09 08:23
为什么不适用数组???

因为你的 标签的名字是一样的,所以加载的过程中,后面的标签会把前面的 标签从 事件处理函数中去掉,所以只有最后一个 标签才有响应事件。
#4
wxflw2013-06-09 13:06
风老师!我尝试使用数组,但是我的.Index数值不是有规律的,可能是1.2.3.4,也可能是1.4.9,这样的话,如果要删除所有已创建的控件该招人么做的?

用 for因为.Index不确定所以不方便,
For Each Label In Me.Controls
           If TypeOf Label Is Label Then
                  Unload Me.Label1(Label1.Index)
           End If
 Next
这个好像也不行
#5
wxflw2013-06-09 14:54
已经搞定,代码发出来供大家参考:
目的:创建label控件数组,数组的index值不固定为任意值,
Private WithEvents Label1 As Label'声明

'-----------------------------------------------
        '判断获得的日期是星期几
        J = Weekday(rs.Fields("日期")) '取得值
        If J = 1 Then
           J = J + 6
        Else
           J = J - 1
        End If
        '------------------------------------------------
            Load Me.Label1(J) '加载控件,index值为按星期天数设定,因为记录有可能存在断档,所以不一定INDEX是1234567,有可能是137
             With Me.Label1(J)
                 .Visible = True
                 .Caption = "OK"
                 .Left = 5 * J + X - 2  'X坐标
                 .Top = T / 150 + y + 8  'Y坐标
                 .Width = 2    '宽度
                 .Height = 4   '高度
                 .ForeColor = vbGreen '字体颜色
                 .BackStyle = 0
                 .ToolTipText = rs.Fields("日期")
             End With
’删除所有创建了的label控件数组
For Each Label In Me.Controls
        If TypeOf Label Is Label Then
           I = Label.Index
             If I > 0 Then
                Unload Me.Label1(I)
             End If
       End If
Next
#6
风吹过b2013-06-09 16:47
For Each Label In 标签的名字就可以的

例:
窗体上放一个 label1(0) 标签控件和 command1 控件,测试代码如下:
程序代码:
Option Explicit

Dim labjs As Long

Private Sub Command1_Click()
labjs = labjs + 1
Load Label1(labjs)
With Label1(labjs)
    .Caption = labjs
    .Visible = True
End With
Call label1move
End Sub


Private Sub Label1_Click(Index As Integer)
Unload Label1(Index)
Call label1move
End Sub

Private Sub label1move()
Dim k As Label
Dim x As Long, y As Long
x = 0
y = 0

For Each k In Label1
    k.Move x, y
    x = x + k.Width
    If x + k.Width > Me.ScaleWidth Then
        y = y + k.Height
        x = 0
    End If
Next
End Sub
#7
wxflw2013-06-09 17:16
回复 6楼 风吹过b
为什么我声明了:Private WithEvents Label1 As Label

Private Sub Label1_MouseMove(Index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single)
红色部分不能用?用了就提示声明错误,如果去掉红色部分就不响应这个事件


把那个声明去掉就正常了,是怎么回事?
#8
风吹过b2013-06-09 17:36
你窗体上放一个 label1(0)。
就不用再去声明 Private WithEvents Label1 As Label 这个了。
这个一般用于 类 上面,一般控件不用这个。

红色部分,没看出哪个是红色部分。

另外,
Private WithEvents Label1 As Label
这个声明只能用于单个类,不能用于数组。
#9
味无味2013-10-11 16:40
风老师!我尝试过了,提示下标越界
1