Dynamically Add Controls to a Form with Visual Basic 6.0

Visual Basic 6.0 allows you to dynamically add control to a form at run- time using the new Add method of the Controls collection. This article shows how to dynamically add intrinsic and ActiveX controls.
Control     ProgID
==========================================
CheckBox    VB.CheckBox
ComboBox    VB.ComboBox
CommandButton  VB.CommandButton
Frame      VB.Frame
HScrollBar   VB.HScrollbar
Image      VB.Image
Label      VB.Label
Line      VB.Line
ListBox     VB.ListBox
OptionButton  VB.OptionButton
PictureBox   VB.PictureBox
Shape      VB.Shape
TextBox     VB.TextBox
Timer      VB.Timer
VScrollBar   VB.VScrollBar


In fact, however, you can add any ActiveX control to your form dynamically, as long as you have the correct ProgID. As I mentioned, ProgIDs are defined in the registry and take the general form LibraryName.Control_Name

If you don't know quite where to search in
HKEY_CLASSES_ROOT, you can use the Object Browser to get the correct ProgID. Just add the control to your project, open Object Browser, and select the control name in the classes list box. The Object Browser's status pane will then display the control name and the library name. For instance, Figure 1 shows that the ProgID for the TreeView control is MSComctlLib.Treeview

The following example dynamically adds two intrinsic and one ActiveX control to an application at run-time. The sample shows how to program the events of a dynamically added control. If you are dynamically adding a control that is not referenced in the project, you may need to add the control's License key to the Licenses collection. For more information on the Licenses collection, please see the REFERENCES section of this article.

Step-By-Step Example

- Create a new Standard EXE project. Form1 is created by default.
- Add the following code to the code window of Form1:

Option Explicit
' If you are adding an ActiveX control at run-time that is
' not referenced in your project, you need to declare it
' as VBControlExtender.
Dim WithEvents ctlDynamic As VBControlExtender
Dim WithEvents ctlText As VB.TextBox
Dim WithEvents ctlCommand As VB.CommandButton

Private Sub ctlCommand_Click()
  ctlText.Text = "You Clicked the Command button"
End Sub

Private Sub ctlDynamic_ObjectEvent(Info As EventInfo)
  ' test for the click event of the TreeView
  If Info.Name = "Click" Then
   ctlText.Text = "You clicked " & ctlDynamic.object.selecteditem.Text
  End If
End Sub

Private Sub Form_Load()
  Dim i As Integer
  ' Add the license for the treeview to the license collection.
  ' If the license is already in the collection you will get
  ' the run-time error number 732.
  Licenses.Add "MSComctlLib.TreeCtrl"

  ' Dynamically add a TreeView control to the form.
  ' If you want the control to be added to a different
  ' container such as a Frame or PictureBox, you use the third
  ' parameter of the Controls.Add to specify the container.
  Set ctlDynamic = Controls.Add("MSComctlLib.TreeCtrl", _
          "myctl", Form1)
  ' set the location and size of the control.
  ctlDynamic.Move 1, 1, 2500, 3500

  ' Add some nodes to the control.
  For i = 1 To 10
   ctlDynamic.object.nodes.Add Key:="Test" & Str(i), Text:="Test" _
                    & Str(i)
   ctlDynamic.object.nodes.Add
Relative:="Test" & Str(i), _
              Relationship:=4, Text:="TestChild" & Str(i)
  Next i
 
  ' Make the control visible.
  ctlDynamic.Visible = True

  ' add a textbox
  Set ctlText = Controls.Add("VB.TextBox", "ctlText1", Form1)
  ' Set the location and size of the textbox
  ctlText.Move (ctlDynamic.Left + ctlDynamic.Width + 50), _
         1, 2500, 100

  ' Change the backcolor.
  ctlText.BackColor = vbYellow

  ' Make it visible
  ctlText.Visible = True

  ' Add a CommandButton.
  Set ctlCommand = Controls.Add("VB.CommandButton", _
          "ctlCommand1", Form1)

  ' Set the location and size of the CommandButton.
  ctlCommand.Move (ctlDynamic.Left + ctlDynamic.Width + 50), _
          ctlText.Height + 50, 1500, 500

  ' Set the caption
  ctlCommand.Caption = "Click Me"

  ' Make it visible
  ctlCommand.Visible = True
End Sub

- Save and run the project. Try clicking the CommandButton and on different Nodes in the TreeView. The TextBox will show what you click.

More information

Now we will walk through VBControlExtender Object, ObjectEvent Event, EventParameter Object Examples which are important to know when you deal with dynamic controls.

VBControlExtender Object : Represents the Visual Basic VBControlExtender properties.

The VBControlExtender object is primarily used when dynamically adding a control to the Controls collection using the Add method. The VBControlExtender object is particularly useful for this purpose because it provides a generic set of properties, events, and methods to the developer. Another feature of the object is the ObjectEvent event which is designed to parse any event raised by a dynamically added control. The example below declares an object variable as VBControlExtender, and sets the variable when adding a control. The example also shows how you can program the ObjectEvent event.

Restrictions on Setting the References to the Variable
There is one caveat to be aware of when setting the VBControlExtender object to a dynamically added control: intrinsic controls cannot be set to the variable.

Here is the example

Option Explicit
Dim WithEvents objExt As VBControlExtender ' Declare VBControlExtender variable WithEvents

Private Sub LoadControl()
  Licenses.Add "Project1.Control1", "ewrinvcmcoe"
  Set objExt = Controls.Add("Project1.Control1", "myCtl")
  objExt.Visible = True ' The control is invisible by default.
End Sub

Private Sub extObj_ObjectEvent(Info As EventInfo)
  ' Program the events of the control using Select Case.
  Select Case Info.Name
  Case "Click"
   ' Handle Click event here.
  ' Other cases now shown
  Case Else ' Unknown Event
   ' Handle unknown events here.
  End Select
End Sub

ObjectEvent Event : Represents event information raised by a control assigned to a VBControlExtender object variable.

The EventInfo object is available in the ObjectEvent event, which is an event of the VBControlExtender object. In common practice, a control that is dynamically added to the Controls collection using the Add method will be assigned to an object variable of the type VBControlExtender. The ObjectEvent event can then be used to trap all events raised by the control, and the EventInfo object specifically represents any parameters passed by the raised events.

The EventInfo object has two properties: the Name property returns the name of the raised event; the EventParameters property returns a reference to the EventParameters collection that allows you to return values of all event parameters.

ObjectEvent Event : Occurs when a control that is assigned to a VBControlExtender object variable raises an event.

Syntax : Private Sub object_ObjectEvent(Info As EventInfo)

The ObjectEvent event syntax has these parts:

Part Description

object Required. An object expression that evaluates to an object in the Applies To list.
Info Returns a reference to an EventInfo object.

Remarks

The ObjectEvent event is a generic event that allows you to handle events of a control and return values through the control's event parameters.

You can use the ObjectEvent event to trap generic events a control raises, assuring that any control you deploy contains certain basic functionality required by the deployed application.

Here is the ObjectEvent Event, EventParameter Object Examples

The first example below uses the ObjectEvent event to print all parameter names and values.

Option Explicit
Private WithEvents extObj As VBControlExtender

' Code to set the object variable to a user control not shown.

Private Sub extObj_ObjectEvent(Info As EventInfo)
  Dim p As EventParameter
  Debug.Print Info.Name

  For Each p In Info.EventParameters
   Debug.Print p.Name, p.Value
  Next
End Sub

The second example allows you to check for a generic event raised by the control.

Private Sub extObj_ObjectEvent(Info As EventInfo)
  Dim p As EventParameter
  Select Case Info.Name
  Case "UserName"
   ' Check User name value.
   MsgBox Info.EventParameters("UserName").Value
  ' Other cases now shown
  Case Else ' Unknown Event
   ' Handle unknown events here.
  End Select
End Sub
 
当动态导入模块时出现 'failed to fetch' 错误,通常与网络请求、文件路径、服务器配置等因素有关,以下是一些可能的解决方案: ### 检查网络连接 确保设备网络连接正常,能够访问目标模块所在的服务器。可以通过访问其他网站或资源来验证网络是否可用。 ### 确认文件路径 检查动态导入时指定的模块路径是否正确。路径错误会导致无法找到对应的文件,从而引发 'failed to fetch' 错误。例如: ```javascript // 错误示例,路径可能不正确 const dynamicComponent = await import('./wrongPath/DynamicComponent'); // 正确示例 const dynamicComponent = await import('./correctPath/DynamicComponent'); ``` ### 检查服务器配置 如果模块是从服务器获取的,需要确保服务器配置正确,能够正确响应模块请求。检查服务器的路由配置、文件权限等。例如,在 Node.js 中使用 Express 服务器: ```javascript const express = require('express'); const app = express(); // 静态文件服务 app.use(express.static('public')); const port = 3000; app.listen(port, () => { console.log(`Server running on port ${port}`); }); ``` ### 处理跨域问题 如果模块来自不同的域名或端口,可能会遇到跨域问题。可以在服务器端配置 CORS(跨域资源共享)来允许跨域请求。例如,在 Express 中配置 CORS: ```javascript const express = require('express'); const cors = require('cors'); const app = express(); // 使用 CORS 中间件 app.use(cors()); const port = 3000; app.listen(port, () => { console.log(`Server running on port ${port}`); }); ``` ### 检查文件是否存在 确保目标模块文件确实存在于指定的路径下。可以手动检查文件系统或使用工具来验证文件的存在性。 ### 错误处理 在动态导入时添加错误处理逻辑,以便更好地捕获和处理错误。例如: ```javascript try { const dynamicComponent = await import('./DynamicComponent'); // 使用导入的模块 } catch (error) { console.error('Failed to fetch module:', error); } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值