将动态添加的多个textbox对象分成多个不同的小集合解决思路

将动态添加的多个textbox对象分成多个不同的小集合
我的程序根据数据库内容动态添加了多个frame控件,每个frame控件内动态添加多个textbox控件,我希望每个frame中的textbox控件按父控件的不同组成不同的小集合以便于后期控制,现在只能全部放入一个数组中,不能识别哪一个是对应哪一个frame中的控件

VB code
Private Sub Command4_Click() '按行列批量添加textbox控件
    'TextNum已经声明为全局变量
    TextRNum = ——来源于数据库,行
    TextCNum = ——来源于数据库,列
For i = 1 To TextRNum
For j = 1 To TextCNum
     TextNum = TextNum + 1
    TextkNum = TextkNum + 1
    TextTop = 500 * (i - 1) + 300
      TextLeft = 1200 * (j - 1) + 200
        cname = fname & "textbox" & TextkNum   'fname是frame控件名,取对应的frame控件
    Set M(TextkNum) = New AddClass '此处类已经事先声明过了
    Set M(TextkNum).AddText = Controls.Add("VB.textbox", cname, frame)’此处frame是示意,实际运行时使用的动态获取
    M(TextkNum).AddText.Move TextLeft, TextTop, 1000, 300
     。。。此处设置textbox显示,省略

  Next j
 Next i
 
End Sub


------解决方案--------------------
dim t1 as textbox,t2 as textbox

cname=。。。
set t1=controls.add(Controls.Add("VB.textbox", cname)
set t1.container=frame1'假设frame1已经存在

cname=。。。。
set t2=controls.add(Controls.Add("VB.textbox", cname)
set t2.container=frame2'假设frame2已经存在


------解决方案--------------------
sorry,真没注意到

重写了动态创建的代码,如下,不知是否是你需要的,没怎么调试,看看能运行就贴上来了,理论上来说一定有bug,见谅
VB code

Option Explicit

Private Type T_FRA_TBS
    fra As frame
    tbs() As TextBox
End Type

Private fra_tbs() As T_FRA_TBS

Private Sub Command1_Click()
    If True = delete_frame(3) Then
        MsgBox "Delete Frame Done"
    Else
        MsgBox "Delete Frame Failed"
    End If
End Sub

Private Sub Command2_Click()
    If True = delete_tbx(6, 2) Then
        MsgBox "Delete TextBox Done"
    Else
        MsgBox "Delete TextBox Failed"
    End If
End Sub

Private Sub Form_Load()
    Dim fra_count As Long
    
    ' 假设通过函数 get_frame_count 来获取 frame 数量
    fra_count = get_frame_count(0)
    ReDim fra_tbs(fra_count - 1)

    ' 创建 frame
    Dim fra_name As String
    Dim left As Long, top As Long
    Dim i As Long
    For i = 0 To fra_count - 1
        fra_name = "fra_" + Trim$(Str(i + 1))
    
        If (0 = i) Then
            Set fra_tbs(i).fra = create_frame(fra_name, , , , , Me)
        ElseIf (1 = i) Then
            left = fra_tbs(0).fra.left + 300 + fra_tbs(0).fra.width
            top = fra_tbs(0).fra.top
            
            Set fra_tbs(i).fra = create_frame(fra_name, , , left, top, Me)
        Else
            If (0 = (i Mod 2)) Then
                left = fra_tbs(0).fra.left
            Else
                left = fra_tbs(1).fra.left
            End If
            
            top = fra_tbs(i - 2).fra.top + fra_tbs(i - 2).fra.height + 100
            
            Set fra_tbs(i).fra = create_frame(fra_name, , , left, top, Me)
        End If
        
        fra_tbs(i).fra.Caption = fra_name
    
        Dim tbs_count As Long
        ' 假设通过函数 get_textbox_count 来获取 textbox 数量
        tbs_count = get_textbox_count(i + 1)
        ReDim fra_tbs(i).tbs(tbs_count - 1)
        
        fra_tbs(i).fra.Caption = fra_tbs(i).fra.Caption + " (" + Trim$(Str(tbs_count)) + ")"
        
        ' 为当前 frame 创建 textbox
        Dim tbx_name As String
        Dim j As Long
        For j = 0 To tbs_count - 1
            tbx_name = "tbx_" + Trim$(Str(i + 1)) + "_" + Trim$(Str(j + 1))
            
            If (0 = j) Then
                top = 500
            Else
                top = fra_tbs(i).tbs(j - 1).top + fra_tbs(i).tbs(j - 1).height + 50
            End If
            
            Set fra_tbs(i).tbs(j) = create_tbx(tbx_name, , , , top, fra_tbs(i).fra)
        Next
        
    Next

End Sub

Private Function get_frame_count(ByVal condition As Variant) As Long
    ' do sth. to get counts
    
    ' 假设有 8 个 frame
    get_frame_count = 8

End Function

Private Function get_textbox_count(ByVal condition As Variant) As Long

    ' do sth. to get counts
    
    ' 假设每个frame拥有的 textbox 数量分别如下
    ' 3, 6, 2, 5, 2, 7, 4, 9
    
    Select Case condition
        Case Is = 1
            get_textbox_count = 3
        Case Is = 2
            get_textbox_count = 6
        Case Is = 3
            get_textbox_count = 2
        Case Is = 4
            get_textbox_count = 5
        Case Is = 5
            get_textbox_count = 2
        Case Is = 6
            get_textbox_count = 4
        Case Is = 7
            get_textbox_count = 5
        Case Is = 8
            get_textbox_count = 6
    End Select
End Function

'新建 frame 的函数
Private Function create_frame(ByVal fra_name As String, _
                              Optional ByVal width As Long = 6200, _
                              Optional ByVal height As Long = 3000, _
                              Optional ByVal left As Long = 100, _
                              Optional ByVal top As Long = 100, _
                              Optional container As Object = Nothing) As frame
    Dim frame_new As frame
    Set frame_new = Nothing
    
    If (Not (container Is Nothing)) Then
        Set frame_new = Controls.Add("VB.Frame", fra_name, container)
    Else
        Set frame_new = Controls.Add("VB.Frame", fra_name)
    End If
    
    With frame_new
        .width = width
        .height = height
        .left = left
        .top = top
        .Visible = True
    End With
    
    Set create_frame = frame_new
End Function

'删除 frame 的函数
Private Function delete_frame(ByVal fra_index As Long) As Boolean
    If (fra_index > UBound(fra_tbs)) Then
        delete_frame = False
        Exit Function
    End If
    
    Controls.Remove (fra_tbs(fra_index).fra.Name)
    
    ' 可以考虑用 CopyMemory API 优化
    Dim i As Long
    For i = (fra_index + 1) To UBound(fra_tbs)
        fra_tbs(i - 1) = fra_tbs(i)
    Next

    ReDim Preserve fra_tbs(UBound(fra_tbs) - 1)
    
    delete_frame = True
End Function

'新建 textbox 的函数
Private Function create_tbx(ByVal tbx_name As String, _
                            Optional ByVal width As Long = 5500, _
                            Optional ByVal height As Long = 300, _
                            Optional ByVal left As Long = 300, _
                            Optional ByVal top As Long = 30, _
                            Optional container As Object = Nothing) As TextBox
    Dim tbx_new As TextBox
    Set tbx_new = Nothing
    
    If (Not (container Is Nothing)) Then
        Set tbx_new = Controls.Add("VB.TextBox", tbx_name, container)
    Else
        Set tbx_new = Controls.Add("VB.TextBox", tbx_name)
    End If
    
    With tbx_new
        .width = width
        .height = height
        .left = left
        .top = top
        .Visible = True
    End With
    
    Set create_tbx = tbx_new
End Function

'删除 textbox 的函数
Private Function delete_tbx(ByVal fra_index As Long, ByVal tbx_index As Long) As Boolean
    If (fra_index > UBound(fra_tbs)) Then
        delete_tbx = False
        Exit Function
    End If
    
    If (tbx_index > UBound(fra_tbs(fra_index).tbs)) Then
        delete_tbx = False
        Exit Function
    End If

    ' 可以考虑用 CopyMemory API 优化
    Dim i As Long
    For i = (tbx_index + 1) To UBound(fra_tbs(fra_index).tbs)
        fra_tbs(fra_index).tbs(i - 1) = fra_tbs(fra_index).tbs(i)
    Next

    ReDim Preserve fra_tbs(fra_index).tbs(UBound(fra_tbs(fra_index).tbs) - 1)

    Controls.Remove (fra_tbs(fra_index).tbs(tbx_index).Name)
        
    delete_tbx = True
End Function