Manipulating Forms and Controls with Add-Ins

See Also

A designer is a base on which you create your visual interface. You can think of it in the extensibility model as an empty socket which you can plug in different designer types.

From its beginnings, Visual Basic used one kind of designer. Now, however, Visual Basic can host other kinds, including UserDocuments and UserControls that allow you to create ActiveX documents and ActiveX controls that can be used not only in Visual Basic, but in Microsoft Office applications such as Microsoft Word or Microsoft Excel.

The following code fragments demonstrate how to reference the VBForms object, as well as other extensibility objects:

' Add controls to form. Type of controls to add is
' based on the type of control selected in ComboBox.
Private Sub cmdAddControl_Click()
   Dim c As VBComponent
   Dim p As VBProject
   Dim vbc As VBControl
   Dim vbc2 As VBControl
   Dim vbf As VBForm
   Dim sc As String
   Dim sp As String
   Dim svbc As String
   Dim pid As String

   sp = cmbProj.Text
   sc = cmbComp.Text
   svbc = cmbControls.Text
   If sp <> "" And sc <> "" And svbc <> "" Then
      Set p = vbi.VBProjects.Item(sp)
      Set c = p.VBComponents.Item(sc)
      If c.Type = vbext_ct_VBForm Then
         Set vbf = c.Designer
         Set vbc = vbf.VBControls.Item(svbc)
         pid = vbc.ProgId
         Set vbc2 = vbf.VBControls.Add(pid)
      End If
   End If
End Sub

' Refresh the list of controls on a form. Sub is called 
' from event handler in the main object when controls 
' are added.
Public Sub RefreshControls()
   Dim c As VBComponent
   Dim p As VBProject
   Dim vbc As VBControl
   Dim vbf As VBForm
   Dim sc As String
   Dim sp As String
   Dim tempIndex As Long
   
   Screen.MousePointer = vbHourglass
   If cmbControls.ListCount > 0 Then
      tempIndex = cmbControls.ListIndex 
      ' Temp index to restore prior selection
   End If
   sp = cmbProj.Text
   sc = cmbComp.Text
   If sc <> "" And sp <> "" Then
      cmbControls.Clear
      Set p = vbi.VBProjects.Item(sp)
      Set c = p.VBComponents.Item(sc)
      If c.Type = vbext_ct_VBForm Then
            c.Activate
            Set vbf = c.Designer
            For Each vbc In vbf.VBControls
               cmbControls.AddItem _ 
               vbc.Properties("name")
            Next vbc
         Else
            cmbControls.Text = "No Form Selected"
         End If
         ' Restore the prior selection.
         If cmbControls.ListCount > 0 Then
            If tempIndex <= cmbControls. _
            ListCount - 1 Then
               cmbControls.ListIndex = tempIndex
            Else
               cmbControls.ListIndex = 0
            End If
         End If
   End If
   Screen.MousePointer = vbDefault
End Sub

' Remove control from form
Private Sub cmdRemoveControl_Click()
   Dim c As VBComponent
   Dim p As VBProject
   Dim vbc As VBControl
   Dim vbf As VBForm
   Dim sc As String
   Dim sp As String
   Dim svbc As String
   
   sp = cmbProj.Text
   sc = cmbComp.Text
   svbc = cmbControls.Text
   If sp = "" Or sc = "" Or svbc = "" Then Exit Sub
   Set p = vbi.VBProjects.Item(sp)
   Set c = p.VBComponents.Item(sc)
   If c.Type = vbext_ct_VBForm Then
      Set vbf = c.Designer
      Set vbc = vbf.VBControls.Item(svbc)
      vbf.VBControls.Remove vbc
   End If
End Sub