将动态添加的多个textbox对象分成多个不同的小集合解决思路
将动态添加的多个textbox对象分成多个不同的小集合
我的程序根据数据库内容动态添加了多个frame控件,每个frame控件内动态添加多个textbox控件,我希望每个frame中的textbox控件按父控件的不同组成不同的小集合以便于后期控制,现在只能全部放入一个数组中,不能识别哪一个是对应哪一个frame中的控件
------解决方案--------------------
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,见谅
我的程序根据数据库内容动态添加了多个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