首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

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

2012-03-20 
将动态添加的多个textbox对象分成多个不同的小集合我的程序根据数据库内容动态添加了多个frame控件,每个fr

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

VB code
Private Sub Command4_Click() '按行列批量添加textbox控件    'TextNum已经声明为全局变量    TextRNum = ——来源于数据库,行    TextCNum = ——来源于数据库,列For i = 1 To TextRNumFor 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 ExplicitPrivate Type T_FRA_TBS    fra As frame    tbs() As TextBoxEnd TypePrivate fra_tbs() As T_FRA_TBSPrivate Sub Command1_Click()    If True = delete_frame(3) Then        MsgBox "Delete Frame Done"    Else        MsgBox "Delete Frame Failed"    End IfEnd SubPrivate Sub Command2_Click()    If True = delete_tbx(6, 2) Then        MsgBox "Delete TextBox Done"    Else        MsgBox "Delete TextBox Failed"    End IfEnd SubPrivate 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            NextEnd SubPrivate Function get_frame_count(ByVal condition As Variant) As Long    ' do sth. to get counts        ' 假设有 8 个 frame    get_frame_count = 8End FunctionPrivate 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 SelectEnd 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_newEnd 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 = TrueEnd 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_newEnd 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 = TrueEnd Function 

热点排行