Add 方法(Controls 集合)
      在 Controls 集合中添加一个控件并返回一个对该控件的引用。语法object.Add (ProgID, name, container)Add 方法语法有这些部分:部分 描述 
Object 必需的。一个对象表达式,其值是“应用于”列表中的一个对象。 
ProgID 必需的。一个标识控件的字符串。大多数控件的 ProgID 都可通过查看对象浏览器来决定。控件的 ProgID 是由控件的库和类组成的。例如,CommandButton 控件的 ProgID 是 VB.CommandButton。在 ProgID 与对象浏览器中所显示的不一样的情况下,Visual Basic 将显示一个包括正确 ProgId 的错误信息。 
name 必要的。一个字符串,用来标识集合的成员。 
container 可选的。一个对象引用,它指定控件的容器。如果没有指定或为 NULL,缺省值为 Controls 集合所属的容器。通过指定该参数,可以把一个控件放置在任何现存的容器控件(如 Frame 控件)中。用户控件或 ActiveX 文档也可以作为一个容器。 
说明注意    Controls 集合是后期绑定的集合。这意味着编译器不能预先决定集合以及它们的对象或它们的界面包含哪些控件。没有这些信息,自动语句生成器不能工作。该方法允许您在运行时向应用程序中添加控件。即使在应用程序已经被编译与部署之后,动态控件添加也可以用来向应用程序添加一个控件的功能。例如,您可能有几个复杂的用户控件,每个适合于一个不同的任务。由于外部因素不同,如时间或日期或用户输入,不同的用户控件可以被添加到一个应用程序中的某个现存窗体。您也可以利用这个方法的 container 参数来指定一个容器控件(如 Frame 控件)来放置这个控件。或您可以设计一个自动读取文件、数据库或注册表项来加载新控件的应用程序。用这种方法,您可以修改一个应用程序而不必重新部署它。重点 当您添加一个未引用的需要许可证的控件到一个现存的(已部署好的)应用程序时,在使用 Add 方法之前您必须也添加这个控件的许可证关键字。关于什么时候和如何添加许可证有关信息,请参阅“请参阅”列表中的“Licenses 集合”。在运行时添加未引用的控件
您也可以利用 Add 方法来动态添加一个在工程中没有被引用的控件。(“未引用的”控件是不出现在 Toolbox 中的控件)。为此,您必须也把控件的 License 关键字添加到 Licenses 集合中。下面的示例中在添加控件本身之前添加了控件的许可证关键字:Option Explicit
Private WithEvents extCtl As VBControlExtenderPrivate Sub Form_Load()
   Licenses.Add "prjWeeks.WeeksCtl", "xydsfasfjewfe"
   Set extCtl = Form1.Controls.Add("prjWeeks.WeeksCtl", "ctl1")
   extCtl.Visible = True ' The control is invisible by default.
End Sub注意   请参阅关于检索控件许可证关键字的详细信息的“请参阅”列表中的“增加方法 (Licenses 集合) ”。但是,为了编程这样一个未引用控件的事件,您必须使用 WithEvents 关键字声明一个对象变量为VBControlExtender 对象(如上),并且设置该对象变量到 Add 方法返回的引用上。然后,利用VBControlExtender 对象的 ObjectEvent 事件来编程该控件的事件。下面是一个简单的例子。Option Explicit
Dim WithEvents objExt As VBControlExtender '声明 Extender 变量Private Sub LoadControl()
   Licenses.Add "Project1.Control1", "xydsfasfjewfe"
   Set objExt = Controls.Add("Project1.Control1", "myCtl")
   objExt.Visible = True 
End SubPrivate Sub extObj_ObjectEvent(Info As EventInfo)
   '使用 Select Case 编程控件的事件。
   Select Case Info.Name
   Case "Click"
      '这里处理 Click 事件。
   '现在显示其他的 case
   Case Else '未知事件
      '这里处理未知事件。
   End Select
End SubNote   不能把一个固有的控件指定给这个 VBControlExtender 变量; 任何这种试图将引起类型不匹配错误。但是,您也可以通过使用 WithEvents 关键字声明一个对象变量,并且设置该方法返回的引用为该变量,从而编程一个动态添加控件的事件,如下所示。Option Explicit
'声明对象变量为 CommandButton 。
Private WithEvents cmdObject As CommandButton Private Sub Form_Load()
   Set cmdObject = Form1.Controls.Add("VB.CommandButton", "cmdOne")
   cmdObject.Visible = True
   cmdObject.Caption = "Dynamic CommandButton"
End SubPrivate Sub cmdObject_Click()
    Print "This is a dynamically added control"
End Sub如果希望添加一个用户控件或任何 ActiveX 控件到您的窗体,必须或者把这个控件添加到“工具箱”,或者把控件的 License 关键字添加到 Licenses 集合中。有关详细信息请参阅“增加方法 (Licenses 集合)”。注意 如果您添加一个 ActiveX 或用户控件到您的工程,但是没有在窗体中使用它,您也必须不要选定“工程属性”对话框的“生成” 选项卡上的“删除有关未使用的 ActiveX 控件”选项。如果您的应用程序试图添加该控件,那么该 Add 方法将失败,因为必需的信息已经被丢弃。删除控件
要删除动态添加的控件,用“移除”方法。请注意,您只能删除那些用“添加”方法添加的控件(与用“Load”语句添加的控件进行对比)下面的示例删除一个动态添加的控件:Form1.Controls.Remove "ctl1" ' 该控件的名称为 ctl1。

解决方案 »

  1.   

    比如:先放一个text,然后复制,粘贴,把粘贴出来的控件删除,
    在代码中
    load text(1)
      

  2.   

    Add 方法(Controls 集合)示例
    Private Sub Form_Load()
       Form1.Controls.Add "VB.CommandButton", "cmdObj1", Frame1
       With Form1!cmdObj1
          .Visible = True
          .Width = 2000
          .Caption = "Dynamic Button"
       End With
    End Sub注意 上面的代码例子使用 ! 作为一个语法要素。您也可以使用标准集合语法如 Form1.Controls("cmdObj1") 来引用该控件。第二个例子使用 WithEvents 关键字声明一个 CommandButton 类型的对象变量,允许您编程该控件的事件。对象变量被设置为由 Add 方法返回的引用。要试验该例,把它的代码粘贴到声明部分并且运行该工程。Option Explicit
    Private WithEvents btnObj As CommandButtonPrivate Sub btnObj_Click()
       MsgBox "This is a dynamically added button."
    End SubPrivate Sub Form_Load()
       Set btnObj = Controls.Add("VB.CommandButton", "btnObj")
       With btnObj
          .Visible = True
          .Width = 2000
          .Caption = "Hello"
          .Top = 1000
          .Left = 1000
       End With
    End Sub第三个例子添加一个非引用控件到 Controls 集合。然而要编程这样一个控件的事件,必须声明一个 VBControlExtender 类型的对象变量,并把由这个方法返回的引用设置到该对象。然后使用 ObjectEvent 事件编程该控件的事件。Option Explicit
    Dim ctlExtender As VBControlExtenderPrivate Sub Form_Load()
       Set ctlExtender = Controls.Add("Project1.UserControl1", "MyControl")
       With ctlExtender 
          .Visible = True
          .Top = 1000
          .Left = 1000
       End With
    End SubPrivate Sub extObj_ObjectEvent(Info As EventInfo)
       '使用 Select Case 编程该控件事件。
       Select Case Info.Name
       Case "UserName"
          '检查用户名值。
          MsgBox Info. EventParameters("UserName").Value
       '现在显示其他情况
       Case Else '未知事件
          '这里处理未知事件。
       End Select
    End Sub
      

  3.   

    运行时添加控件数组
    在运行时,可用 Load 和 Unload 语句添加和删除控件数组中的控件,然而,添加的控件必须是现有控件数组的元素。必须在设计时创建一个(在大多数情况下)Index 属性为 0 的控件,然后在运行时使用如下语法:Load object(index%)Unload object(index%)参数 描述 
    object 在控件数组中添加或删除的控件名称。 
    index% 控件在数组中的索引值。 
    加载控件数组的新元素时,大多数属性设置值将由数组中具有最小下标的现有元素复制─ 本例中是索引值为 0 的元素。因为不会自动把 Visible、Index 和 TabIndex 属性设置值复制到控件数组的新元素中,所以,为了使新添加的控件可见,必须将其 Visible 属性设置为 True。注意 试图对数组中已存在的索引值使用 Load 语句时,Visual Basic 将生成一个错误。重点 可用 Unload 语句删除所有由 Load 语句创建的控件,然而,Unload 无法删除设计时创建的控件,无论它们是否是控件数组的一部分。
      

  4.   

    使用控件数组
    控件数组是一组具有共同名称和类型的控件。它们的事件过程也相同。一个控件数组至少应有一个元素,元素数目可在系统资源和内存允许的范围内增加;数组的大小也取决于每个控件所需的内存和 Windows 资源。在控件数组中可用到的最大索引值为 32767。同一控件数组中的元素有自己的属性设置值。常见的控件数组的用处包括实现菜单控件和选项按钮分组。注意   Visual Basic 包括了在运行时动态地将未引用的控件添加到 Controls 集合中的能力。本主题仅指在设计时通过将一个控件剪切和粘贴到窗体上添加的引用控件。有关在运行时添加控件的详细信息,请参阅参考主题“Add 方法(Controls 集合)”和“Add 方法(Licenses 集合)”。为何使用控件数组
    在设计时,使用控件数组添加控件所消耗的资源比直接向窗体添加多个相同类型的控件消耗的资源要少。当希望若干控件共享代码时,控件数组也很有用。例如,如果创建了一个包含三个选项按钮的控件数组,则无论单击哪个按钮时都将执行相同的代码。若要在运行时创建一个控件的新实例,则新控件必须是控件数组的成员。使用控件数组时,每个新成员继承数组的公共事件过程。使用控件数组机制是不可能在运行时创建新控件的,因为每个新控件都继承为数组编写好的事件过程。例如,如果窗体上有若干文本框,而且每个文本框都接受一个日期数值,则可创建一个控件数组,使所有文本框共享同一个合法性检查代码。示例应用程序:Calc.vbp
    图 7.3 所示的 Calculator 示例应用程序(列在 Samples 目录中)包含两个控件数组─ 数字按钮和操作按钮。图 7.2   控件数组示例下表列出 Calculator 示例中控件数组的 Name 和 Index 属性值。数字 (n) 操作符 (n) 
    0 = Number(0) + = Operator(1) 
    1 = Number(1) – = Operator(2) 
    2 = Number(2) X = Operator(3) 
    3 = Number(3) / = Operator(4) 
    4 = Number(4) = = Operator(5) 
    5 = Number(5)   
    6 = Number(6)   
    7 = Number(7)   
    8 = Number(8)   
    9 = Number(9)   
    请注意示例是如何使用 object(index) 语法引用每个控件的。在创建控件时指定索引值。实际上,在设计时为一个控件指定任意的索引,这将使控件成为数组的一部分。Index 属性区分控件数组中的元素。当数组中的一个控件识别了一个事件时,Visual Basic 将调用公共事件过程并传递一个参数(Index 属性的值),分辨是哪个控件识别事件。例如,Number_Click 事件过程的第一行代码是这样的:Private Sub Number_Click (Index As Integer)如果 Number(0) 识别事件,则 Visual Basic 将 0 作为 index 参数传递,而如果 Number(1) 识别事件,则 Visual Basic 将 1 作为 index 参数传递。与索引值不同,对于 Number(0) 到 Number(9) 已执行的其余 Number_Click 代码都是相同的。
      

  5.   

    用VBSCRIPT,微软专门用于动态代码的支持。而且帮助详细.