dim txtObjArray()Do while not rs.EOF
   Set txtObj = Controls.Add("VB.TextBox", "txtObj")
   
   With txtObj
      .Visible =rs("Visible")
      .Width =rs("Width") 
      .Caption = rs("Caption")
      .Top = rs("Top")
      .Left = rs("Left")
   End With
   
   Redim Preserve txtObjArray(Ubound(txtObjArray)+1)=txtObj.Name
   rs.MoveNext
Loop    我用以上的代码在程序界面上临时创建控件,这只是创建了TextBox,创建我都会但是我要怎么做才可以取到临时创建的控件中用户所填入的值呢?比如临时创建了一个TextBox,用户在里面填入“Test”,我要如何取到值?其实要实现的是用户进行某一操作后我会在程序界面上创建一些控件,当用户输入或选择一些值后我要能去到这写控件中用户输入的值,当用户进行某一操作后我又得将当前界面中的控件删除掉,再重新创建另一组控件等待用户输入,而且控件的属性如Caption、Top、Left等是从数据库中读出来的,创建临时控件时我不知道创建多少个,所以只能用数组来记录控件的Name!现在我烦恼的是我把控件画到界面上以后我怎么取到其中的值,我把控件的Name记到一个String的数组中如:Test1,但是不能用"Test1.Value"取到控件的值的。然后再用过后必要时把它删掉?各位大虾有什么办法解决这样的问题吗?可以不要按我现在的思路,只要能实现上面提到的功能就行!谢谢啦!

解决方案 »

  1.   

    ' CallByName函数。
    ' 如:Text1,要取得Text1.Text属性的值。Option ExplicitPrivate Sub Command1_Click()
        Debug.Print CallByName(Text1, "Text", VbGet)
    End Sub
      

  2.   

    CallByName 函数      执行一个对象的方法,或者设置或返回一个对象的属性。语法CallByName(object, procedurename, calltype,[arguments()])CallByName 函数的语法有以下部分:部分 描述 
    object 必需的;变体型(对象)。函数将要执行的对象的名称。 
    procedurename 必需的;变体型(字符串)。一个包含该对象的属性名称或者方法名称的字符串表达式。 
    calltype 必需的;常数。一个 vbCallType 类型的常数,代表正在被调用的过程的类型。 
    arguments() 可选的:变体型(数组)。 
    说明CallByName 函数用于获取或者设置一个属性,或者在运行时使用一个字符串名称来调用一个方法。在下面的例子中,第一行使用 CallByName 来设置一个文本框的 MousePointer 属性,第二行得到 MousePointer 属性的值,第三行调用 Move 方法来移动文本框:CallByName Text1, "MousePointer", vbLet, vbCrosshair
    Result = CallByName (Text1, "MousePointer", vbGet)
    CallByName Text1, "Move", vbMethod, 100, 100
      

  3.   

    控件是有了,但是,缺少事件.Dim WithEvents txtObjArray As VB.TextBox'********声明一个事件Private Sub txtObjArray_Click() '单击事件.
    '----------------------------
    End Sub
      

  4.   


    Dim 语句
         声明变量并分配存储空间。语法Dim [WithEvents] varname[([subscripts])] [As [New] type] [, [WithEvents] varname[([subscripts])] [As [New] type]] . . .Dim 语句的语法包含下面部分:部分 描述 
    WithEvents 可选的。关键字,说明 varname 是一个用来响应由 ActiveX 对象触发的事件的对象变量。只有在类模块中才是合法的。使用 WithEvents,可以声明任意个所需的单变量,但不能使用 WithEvents 创建数组。New 和 WithEvents 不能一起使用。 
    varname 必需的。变量的名称;遵循标准的变量命名约定。 
    subscripts 可选的。数组变量的维数;最多可以定义 60 维的多维数组。subscripts 参数使用下面的语法: 
      [lower To] upper [, [lower To] upper] . . . 
      如果不显式指定 lower,则数组的下界由 Option Base 语句控制。如果没有使用 Option Base 语句,则下界为 0。 
    New 可选的。可隐式地创建对象的关键字。如果使用 New 来声明对象变量,则在第一次引用该变量时将新建该对象的实例,因此不必使用 Set 语句来给该对象引用赋值。New 关键字不能声明任何内部数据类型的变量,以及从属对象的实例,也不能与 WithEvents 一起使用。 
    type 可选的。变量的数据类型;可以是 Byte、布尔、Integer、Long、Currency、Single、Double、Decimal(目前尚不支持)、Date、String(对变长的字符串)、String * length (对定长的字符串)、Object、Variant、用户定义类型、或对象类型。所声明的每个变量都要一个单独的 As type 子句。 
    说明在模块级别中用 Dim 声明的变量,对该模块中的所有过程都是可用的。在过程级别中声明的变量,只在过程内是可用的。可以使用 Dim 语句在模块级或过程级中声明变量的数据类型。例如,下面的语句声明了 Integer 类型的变量。Dim NumberOfEmployees As Integer也可以使用 Dim 语句来声明变量的对象类型。下面的语句为工作表的新建实例声明了一个变量。Dim X As New Worksheet如果定义对象变量时没有使用 New 关键字,则在使用该变量之前,必须使用 Set 语句将该引用对象的变量赋值为一个已有对象。在该变量被赋值之前,所声明的对象变量有一个特定值 Nothing,这个值表示该变量没有指向任一个对象实例。也可以使用带空圆括号的 Dim 语句来定义动态数组。在定义动态数组后,可以在过程内使用 ReDim 语句来定义该数组的维数和元素。如果试图在 Private,Public 或 Dim 语句中重新定义一个已显式定义了大小的数组的维数时,就会发生错误。如果不指定数据类型或对象类型,且在模块中没有 Deftype 语句,则该变量按缺省设置是 Variant 类型。当初始化变量时,数值变量被初始化为 0,变长的字符串被初始化为一个零长度的字符串 (""),而定长的字符串则用 0 填充。Variant 变量被初始化为 Empty。用户自定义类型的变量的每个元素作为各自独立的变量进行初始化。注意 当在过程中使用 Dim 语句时,通常将 Dim 语句放在过程的开始处。
      

  5.   

    还是用动态数组好,事件合用,判断index就行,得到属性和属性赋值都可以直接用,还不怕超出255各控件的窗体极限
      

  6.   

    用CallByName可以,不过麻烦了点:这样:
    假如,你创建的控件名为text1MsgBox Controls("text1").Text
      

  7.   

    你完全可以把txtObj定义成TextBox,然后直接取值啊:Private Sub Command1_Click()
        Dim txtObj As TextBox
        
        Set txtObj = Controls.Add("VB.TextBox", "txtObj")
       
       With txtObj
          .Visible = True
          .Width = 900
          .Text = "222333"
          .Top = 30
          .Left = 30
       End With
       
       MsgBox txtObj.Text
    End Sub
      

  8.   

    CallByName(object, procedurename, calltype,[arguments()])
    使用CallByName函数其中的 Object 参数是不是对象名,但我创建对象后只以字符串数组记录了创建的控件名称而该对象已经变了(可以看我帖出来的创建代码),我已经无法用object了。
      

  9.   

    回应:TechnoFantasy(冰儿马甲www.applevb.com) 
    我在创建的时候是循环使用txtObject,因为我不是在创建的时候有多少个将被创建,是从数据库中读出来的,创建后我把txtObject.Name存入数组当中,然后用txtObject创建下一个,所以用txtObject.text取到的是哪一个Text的都不知道了!各位大虾:CallByName函数按含义应该是 以名字调用 但好象是用控件的属性名或方法名操作控件而不是用控件名得到控件,我理解得对吗?
      

  10.   

    msgbox Controls(txtObjArray(i)).Text
      

  11.   

    Set txtObj = Controls.Add("VB.TextBox", "txtObj" & 所需要辨别的信息)
    需要调用的时候用
    判断txtObj后的辨别信息确定后再调用
    MsgBox Controls(txtObjArray(i)).Text
    应该是可行的吧