[AccessD] Form Controls - Class implementation

jwcolby jwcolby at colbyconsulting.com
Mon Oct 26 12:26:07 CDT 2009


A.D wrote:

 >     There could be an interesting way to handle this requirement conveniently by adoption of a 
single collection where each of its elements is itself a collection,

Ick!!!

Can you say CLASSES?

I used to use collections of collections, and while they do work it gets UGLY VERY QUICKLY!

OK A.D, you have thrown down the gauntlet.  ;)

Here is a class implementation.

Two classes - this is the first:

clsCtlSorted - the collection of controls in sorted order for some object (section or tab page)

Option Compare Database
Option Explicit

Private mstrObjName As String
Private mcolCtlsSorted As Collection

Private Sub Class_Initialize()
     Set mcolCtlsSorted = New Collection
End Sub

Private Sub Class_Terminate()
     Set mcolCtlsSorted = Nothing
End Sub
'
'Pass in any collection of controls to be stored in sorted order
'
Function mInit(lstrObjName As String, colControls As Object, blnIsSection As Boolean)
     If blnIsSection Then
         mStoreSectionCtls lstrObjName, colControls
     Else
         mStoreNonSectionCtls lstrObjName, colControls
     End If
End Function
'
'Tests for and stores section controls not on tabs
'
Private Function mStoreSectionCtls(lstrObjName As String, colControls As Object)
Dim ctl As Control                  'Dim a ctl object to use in the ofr each loop
Dim intTabIndex As Integer          'Dim a variable to use to generate an error if the control does 
NOT have a tabindex property
Dim ctlParent As Control            'Dim a variable to test whether the parent is a control

     mstrObjName = lstrObjName
     For Each ctl In colControls     'For each iterator to grab controls from collection
         On Error Resume Next
         intTabIndex = ctl.TabIndex  'Test for the TabIndex property
         If Err = 0 Then             'If no error then process control (store in the collection)
             Set ctlParent = ctl.Parent
             If Err = 0 Then
             Else
                 mcolCtlsSorted.Add ctl, CStr(ctl.TabIndex)
                 Err.Clear
             End If
         Else
             Err.Clear
         End If
     Next ctl
End Function
'
'Tests for and stores controls not directly on the section (on a tab)
'
Private Function mStoreNonSectionCtls(lstrObjName As String, colControls As Object)
Dim ctl As Control                  'Dim a ctl object to use in the ofr each loop
Dim intTabIndex As Integer          'Dim a variable to use to generate an error if the control does 
NOT have a tabindex property
Dim ctlParent As Control            'Dim a variable to test whether the parent is a control

     mstrObjName = lstrObjName
     For Each ctl In colControls     'For each iterator to grab controls from collection
         On Error Resume Next
         intTabIndex = ctl.TabIndex  'Test for the TabIndex property
         If Err = 0 Then             'If no error then process control (store in the collection)
             Set ctlParent = ctl.Parent
             If Err = 0 Then
                 mcolCtlsSorted.Add ctl, CStr(ctl.TabIndex)
             Else
                 Err.Clear
             End If
         Else
             Err.Clear
         End If
     Next ctl
End Function
Property Get pObjName() As String
     pObjName = mstrObjName
End Property
'
'Iterate the collection of controls getting each control name
'and appending it to a string
'
Property Get pCtlNames() As String
Dim ctl As Control
Dim strCtlNames As String
     strCtlNames = pObjName & ":: " & vbCrLf
     For Each ctl In mcolCtlsSorted
         strCtlNames = strCtlNames & vbTab & ctl.Name
     Next ctl
     pCtlNames = strCtlNames
End Property
'
'Return the collection of controls in sorted order (keyed on TabIndex)
'
Property Get pCtlsSorted() As Collection
     Set pCtlsSorted = mcolCtlsSorted
End Property


John W. Colby
www.ColbyConsulting.com


A.D.Tejpal wrote:
> Run time handling of form controls in the order of tab index.
> ========================================
> 
>     Use of a collection as suggested by J.C., appears to be the optimum 
> approach, provided the point raised by Ken is addressed suitably. A form 
> having three tab controls each with 4 pages, would need 15 collections as 
> each form section or tab control page has its own set of tab indices for 
> controls located therein.
> 
>     There could be an interesting way to handle this requirement 
> conveniently by adoption of a single collection where each of its elements 
> is itself a collection, permitting a generic subroutine to handle unlimited 
> number of tab control pages apart from the three form sections (detail, 
> header & footer)




More information about the AccessD mailing list