VB6有一个新功能,可以动态添加控件,不用控件数组:
object.Add (ProgID, name, container)
参数说明
Object 必需的。一个对象表达式,其值是“应用于”列表中的一个对象。
ProgID 必需的。一个标识控件的字符串。大多数控件的 ProgID 都可通过查看对象浏览器来决定。控件的 ProgID 是由控件的库和类组成的。
例如,CommandButton 控件的 ProgID 是 VB.CommandButton。在ProgID 与对象浏览器中所显示的不一样的情况下,Visual Basic
将显示一个包括正确 ProgId 的错误信息。
name 必要的。一个字符串,用来标识集合的成员。
container 可选的。一个对象引用,它指定控件的容器。如果没有指定或为NULL,缺省值为 Controls 集合所属的容器。通过指定该参数,可以把一个控件放置在任何现存的容器控件(如 Frame 控件)中。用户控件或 ActiveX 文档也可以作为一个容器。
举例: //在picture1上面添加一个commandbutton
Private Sub Form_Load()
Form1.Controls.Add "VB.CommandButton", "cmdOk", Picture1
With Form1!cmdOk
.Visible = True
.Width = 500
.Caption = "确认(&Y)"
End With
End Sub
重点:当您添加一个未引用的需要许可证的控件到一个现存的(已部署好的)应用程序时,在使用 Add 方法之前您必须也添加这个控件的许可证关键字。
在运行时添加未引用的控件:
您也可以利 Add 方法来动态添加一个在工程中没有被引用的控件。(“未引用的”控件是不出现在 Toolbox 中的控件)。为此,您必须也把控件的License 关键字添加到 Licenses 集合中。下面的示例中在添加控件本身之前添加了控件的许可证关键字:
Option Explicit
Private WithEvents extCtl As VBControlExtender
Private 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
但是,为了编程这样一个未引用控件的事件,您必须使用 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 Sub
Private Sub extObj_ObjectEvent(Info As EventInfo)
使用 Select Case 编程控件的事件。
Select Case Info.Name
Case "Click"
这里处理 Click 事件。
现在显示其他的 case
Case Else 未知事件
这里处理未知事件。
End Select
End Sub
Note: 不能把一个固有的控件指定给这个 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 Sub
Private 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。