我做的程序窗体很多,其中有20几个控件数组是每一个窗体都要用到的,所以对他们的控制我想写到模块里,虽然字符串数组可以写成"字符串名(n)"当参数传进过程中,可是控件数组却不行。
比如Text控件,名字是Fielddata(0),Fielddata(1),Fielddata(2),......我现在只能一个一个的把他们写到过程的参数里,这样在过程控制他们也很麻烦,不能像在窗体里控制得那么简单,写一个循环就了事了。那位高人有没有好办法,可以把控件数组传到过程中,在过程中也能把它们作为数组一样的来处理。拜托,帮帮我这个可怜的人好吗!!!!!!!!!!!

解决方案 »

  1.   

    '可以看到在这个函数中我传递了一个text1控件数组给函数,它可以接受任意的控件数组,
    但必须是控件数组。
    Private Function xx(obj As Object)
        Dim i As Integer
        Debug.Print obj.Count
        For i = obj.lbound To obj.ubound
            If TypeOf obj.Item(i) Is TextBox Then
                Debug.Print "TextBox"
            End If
        Next i
    End FunctionPrivate Sub Command1_Click()
        xx Text1
    End Sub
      

  2.   

    控件确实可以当做参数来传递,只要将型参类型定义为OBJECT就可以了。
    但是我认为这样做的效率比较低,而且不安全。
    比较好的方法是建立相应的变量数组,将TEXT的内容放在数组中传递。
      

  3.   

    何必那么麻烦:在模块中
    Public Declare Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As LongPublic LastForm As Form在所有窗体中
    Private Sub Form_Load()
    Dim i As Integer
    If IsNull(LastForm) Then Exit Sub
    With LastForm
    For i = 0 To .Text1.Count - 1
        SetParent .Text1(i).hWnd, Me.hWnd
    Next i
    End With
    Set LastForm = Me
    End Sub这样只需要建立一组控件数组供各个窗体共用。它们会带着内容走的。但注意各窗体的布局给它们留下相同的空间。
      

  4.   

    更正一下:
    在各个子窗体中Option ExplicitPrivate Sub Form_Load()
    Dim i As Integer
    With Form1
    For i = 0 To .Text1.Count - 1
        SetParent .Text1(i).hWnd, Me.hWnd
    Next i
    End WithEnd SubPrivate Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
    Dim i As Integer
    With Form1
    For i = 0 To .Text1.Count - 1
        SetParent .Text1(i).hWnd, .hWnd
    Next i
    End With
    End Sub
    不需要LastForm变量,控件数组的宗主关系不会因为 SetParent 改变。
      

  5.   

    多谢楼上的几位高手,小弟的VB编程水平实在有限,我把控件放到模块里操作处理,
    只是因为我想在每个界面里Load主信息数据的时候,将数据由数据库里提出用For循环显示在控件上,当更改这20几个控件内容时再到模块里全部For循环把数据库里的数据UpDate一边。
    目的就是为了少写几行代码,因为我们领导经常会将各类样品的主信息作变动,不是增加,就是减少,我得一个Form一个Form去修改,太麻烦了,每个Form的字段又取的不一样,所以我就想只在SQL语句上做点文章,不想再一个个的去改窗体了。
    我用了第一位朋友的办法,把控件名作为参数,然后在模块里进行判断和操作,方法可行。
        For i = obj.lbound To obj.ubound
            obj(i).text=MyRs.Fields.Item(i)
        Next i
    只是我不知道会不会有什么不好的后果。
    第二个带API函数的例子我看不懂,我对API一窍不通,特别是那些参数的含义,比如hWnd,到现在我也没整明白"句柄"是什么意思,不知你有没有好介绍,给我讲讲怎么能学好API函数,或者你开始时学API函数的经验。
    再次向几位表示感谢 :)
      

  6.   

    of123() 的方法不好使,这些数组总得放在一个form里吧,可是如果那个form还没加载,不就不能用了?
      

  7.   

    金脚指:
    不会的。只要你访问工程中存在的窗体上的控件,该窗体就会自动 Load。不一定要 Show。不知道的事情不要凭猜想,要么查查资料,要么试试。