Private WithEvents myLabel As MSForms.Label Private myParent As C_ObjControl Private myIndex As Long '------------------------------------------------------------------- Private Sub Class_Terminate() Set myLabel = Nothing Set myParent = Nothing End Sub '------------------------------------------------------------------- Public Property Let Item(ByRef val As MSForms.Label) Set myLabel = val End Property '------------------------------------------------------------------- Public Property Get Item() As MSForms.Label Set Item = myLabel End Property '------------------------------------------------------------------- Public Property Let Parent(ByRef val As Object) Set myParent = val End Property '------------------------------------------------------------------- Public Property Let Index(ByVal val As Long) myIndex = val End Property '------------------------------------------------------------------- Public Property Get Index() As Long Index = myIndex End Property '------------------------------------------------------------------- Public Property Get Self() As Object Set Self = Me End Property '------------------------------------------------------------------- Private Sub myLabel_Click() Call myParent.onClick(myIndex) End Sub '------------------------------------------------------------------- Private Sub myLabel_DblClick(ByVal Cancel As MSForms.ReturnBoolean) Cancel = True Call myParent.onDblClick(myIndex) End Sub '------------------------------------------------------------------- Private Sub myLabel_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) Call myParent.onMouseMove(myIndex) End Sub
Option Explicit '------------------------------------------------------------------- Private Type Posi Top As Double Left As Double End Type Public Event Click(ByVal Index As Long) Public Event DblClick(ByVal Index As Long) Public Event MouseMove(ByVal Index As Long) Private Obj() As C_Label Private DefPosi() As Posi Private myItems As Object Private myParent As Object Private AllRows As Long Private AllColumns As Long Private AllTop As Double Private AllLeft As Double Private HIntv As Double Private VIntv As Double Private LabCount As Long Private Size As Long Private PHeight As Double Private PWidth As Double Private offrow As Double Private offcol As Double '------------------------------------------------------------------- Public Property Let Parent(ByRef val As Object) Set myParent = val End Property '------------------------------------------------------------------- Public Property Get Items() As Object Set Items = myItems End Property '------------------------------------------------------------------- Public Property Let Rows(ByVal val As Long) AllRows = val AllColumns = 0 End Property '------------------------------------------------------------------- Public Property Let Columns(ByVal val As Long) AllColumns = val AllRows = 0 End Property '------------------------------------------------------------------- Public Property Let Top(ByVal val As Double) AllTop = val End Property '------------------------------------------------------------------- Public Property Let Count(ByVal val As Double) LabCount = val End Property '------------------------------------------------------------------- Public Property Let Left(ByVal val As Double) AllLeft = val End Property '------------------------------------------------------------------- Public Property Let HoriIntv(ByVal val As Double) HIntv = val End Property '------------------------------------------------------------------- Public Property Let VertIntv(ByVal val As Double) VIntv = val End Property '------------------------------------------------------------------- Public Property Let Height(ByVal val As Double) PHeight = val End Property '------------------------------------------------------------------- Public Property Get Height() As Double Height = PHeight End Property '------------------------------------------------------------------- Public Property Let Width(ByVal val As Double) PWidth = val End Property '------------------------------------------------------------------- Public Property Get Width() As Double Width = PWidth End Property '------------------------------------------------------------------- Public Property Let FontSize(ByVal val As Long) Size = val End Property '------------------------------------------------------------------- Private Sub Class_Initialize() AllRows = 0 AllColumns = 0 AllTop = 0 AllLeft = 0 HIntv = 0 VIntv = 0 PHeight = 0 PWidth = 0 LabCount = 0 Size = 10 End Sub '------------------------------------------------------------------- Private Sub Class_Terminate() Dim I As Long For I = 1 To UBound(Obj) Set Obj(I) = Nothing Next I Set myParent = Nothing Set myItems = Nothing End Sub '------------------------------------------------------------------- Public Sub onClick(ByVal Index As Long) RaiseEvent Click(Index) End Sub '------------------------------------------------------------------- Public Sub onDblClick(ByVal Index As Long) RaiseEvent DblClick(Index) End Sub '------------------------------------------------------------------- Public Sub onMouseMove(ByVal Index As Long) RaiseEvent MouseMove(Index) End Sub '------------------------------------------------------------------- Public Sub Init(ByRef Dic As Object) Dim Ctrl As Control Dim I As Long Dim Key As Variant If Dic.Count > 0 Then LabCount = Dic.Count End If If LabCount = 0 Then Exit Sub End If Set myItems = New Collection ReDim Obj(1 To Dic.Count) ReDim DefPosi(1 To Dic.Count) With myParent I = 1 '----- For Each Key In Dic.keys '-----コントロールの追加 Set Ctrl = .Controls.Add("Forms.Label.1", Dic(Key)) '-----コントロールの整形 With Ctrl .Visible = True '.Enabled = False .Caption = Dic(Key) If AllRows > 0 Then .Top = AllTop + ((I - 1) Mod AllRows) * (PHeight + VIntv) .Left = AllLeft + ((I - 1) \ AllRows) * (PWidth + HIntv) End If If AllColumns > 0 Then .Top = AllTop + ((I - 1) \ AllColumns) * (PHeight + VIntv) .Left = AllLeft + ((I - 1) Mod AllColumns) * (PWidth + HIntv) End If .Font.Size = Size .Height = PHeight .Width = PWidth .SpecialEffect = fmSpecialEffectRaised DefPosi(I).Top = .Top DefPosi(I).Left = .Left End With '-----コントロールのイベントクラスの作成 Set Obj(I) = New C_Label With Obj(I) .Item = Ctrl .Index = Key .Parent = Me End With myItems.Add Obj(I) I = I + 1 Next Key End With End Sub '------------------------------------------------------------------- Public Sub OffSet(ByVal offtop As Double, _ ByVal offleft As Double) Dim I As Long For I = 1 To UBound(Obj) With Obj(I).Item .Top = DefPosi(I).Top + offtop .Left = DefPosi(I).Left + offleft End With Next I End Sub