This program will demonstrate the use of Control Arrays and the use of the TAG property.
The application consists of three forms. The main form will hold the array of TextBoxes
that were created using the information added on the Add screen. TextBox format
information is stored in each Control Array TAG property. In this case, the format
information describes the Type (Numeric or Alpha) and the Length (number of characters
that can be entered). Because each controls can have a unique format base on the TAG
property, the editing criteria that is programmed by the user introduces additional
keystroke processing events. The Display form will display the format information from the
selected TextBox.
Part 1 - Housekeeping / Overhead
Save the Project in your NEW Project directory
Add the Second Form 
Add the Third Form
Click on the Save Icon in the Tool Bar.
Part 2 - Building the Example Application
![]()  | 
    The Main form, which appears empty at startup contains a single TextBox
    that has the Index Property set to 0. This is what makes the control a Control Array. This
    form does nothing except call the two other forms for their respective services. It does
    perform edits on the array of text boxes using the format information contained in the tag
    property. This code is detailed below.  | 
  
| The Add Form will edit the input controls and then place a textbox onto the main form.
    The TAG properties will contain an encoded string that describes the
    "properties" of the text box. Note the logic required to properly place the
    control on the main form. The main form contains two public variables used to maintain the
    position of "the next open array slot" This code is detailed below.  | 
    ![]()  | 
  
![]()  | 
    This form only summarizes the content of the associated TextBoxes TAG
    property. The contents are decoded and placed in the labels on this form. Private
    Sub Form Load()  | 
  
The Add form is where the work takes place. When the user click the OK button, the program:
Private Sub cmdOK Click()
    Dim idx As Integer
    If frmMain.idx = -1 Then
      frmMain.idx = 0
    Else
      frmMain.idx = frmMain.idx + 1
      Load frmMain.txtArray(frmMain.idx)
    End If
    idx = frmMain.idx
    If idx = 10 Then
      frmMain.txtArray(idx).Top = frmMain.txtArray(0).Top
      frmMain.txtArray(idx).Left = _
            frmMain.txtArray(0).Left
+ frmMain.txtArray(0).Width + 100
    ElseIf idx > 0 Then
      frmMain.txtArray(idx).Top = _
            frmMain.txtArray(idx -
1).Top + frmMain.txtArray(idx - 1).Height + 10
      frmMain.txtArray(idx).Left = frmMain.txtArray(idx -
1).Left
    End If
    frmMain.txtArray(idx).Tag = Left(cboType.Text, 1) &
Str(txtLength)
    frmMain.txtArray(idx).Visible = True
    frmMain.txtArray(idx).Text = ""
    If frmMain.idx = 19 Then
      cboType.Enabled = False
      txtLength.Enabled = False
      cmdOK.Enabled = False
    End If
End Sub
On the Main Form, use the contents of the TAG Property to restrict what is entered. This is not bullet-proof, but it will work for most situations.
Whenever a key on any of the TextBoxes in the Control Array, the KeyPress event is fired and the index of the control and the key that was pressed is passed to the form. The KeyStroke is passed as an Ascii integer.
For more information go to Google.COM and search on "ASCII chart"
Here is the event handler and function used to restrict the keystrokes:
Private Sub txtArray KeyPress(Index As Integer, KeyAscii As
Integer)
    Validate txtArray(Index), KeyAscii
End Sub
Private Sub Validate(TB As TextBox, key As Integer)
    Dim maxlength As String
    Dim cKey As String * 1
    If key < 32 Or key > 126 Then
       Exit Sub
    End If
    maxlength = Right(TB.Tag, Len(TB.Tag) - 1)
    If Len(TB.Text) = Val(maxlength) Then
      Beep
      key = 0
      Exit Sub
    End If
    Select Case Left$(TB.Tag, 1)
       Case "A"
          cKey = UCase(Chr(key))
          If cKey < "A" Or
cKey > "Z" Then
             key = 0
             Beep
             Exit Sub
          End If
       Case "N"
          If key < Asc("0")
Or key > Asc("9") Then
             key = 0
             Beep
             Exit Sub
          End If
    End Select
End Sub
Setting the KeyStroke to 0 will "throw out" or ignore the transmitted keystroke.
There are various event handlers and routines to build the edits and error prevention functions into the program. This code is detailed below:
Something must be in the Length field before the Control
can be added
Private Sub SetEnabled()
    If txtLength = "" Then
      cmdOK.Enabled = False
    Else
      cmdOK.Enabled = True
    End If
End Sub
Initialize the ComboBox
Private Sub Form Load()
    cboType.AddItem "Alpha"
    cboType.AddItem "Numeric"
    cboType.ListIndex = 0
    SetEnabled
End Sub
Edit on every change. Highlight the Errors
Private Sub txtLength Change()
    Dim limit As Integer
    If IsNumeric(txtLength) = False Then
      txtLength.SelStart = 0
      txtLength.SelLength = Len(txtLength)
      cmdOK.Enabled = False
      Exit Sub
    End If
    If Left(cboType.Text, 1) = "A" Then
      limit = 25
    Else
      limit = 4
    End If
    If Val(txtLength) > limit Then
      txtLength.SelStart = 0
      txtLength.SelLength = Len(txtLength)
      cmdOK.Enabled = False
      txtLength.SetFocus
      Exit Sub
    End If
    SetEnabled
End Sub
Only the proper characters (Numbers) and the Backspace
key
Private Sub txtLength KeyPress(KeyAscii As Integer)
    If KeyAscii = 8 Then
      Exit Sub
    End If
    If KeyAscii < Asc("0") Or KeyAscii >
Asc("9") Then
      KeyAscii = 0
    End If
End Sub
Call the Change Logic to Edit
Private Sub cboType Click()
    txtLength Change
End Sub