jwcolby
jwcolby at colbyconsulting.com
Mon Feb 9 18:33:53 CST 2009
I had intended to implement Stuart’s change log using his code however it is pretty specific to his application so we will (eventually) try to do the same thing with a more generic log. In order to set this up however I am going to build a control scanner and show you how that works. A form has a collection called the controls collection. In that collection will be a pointer to each control on the form. The basic structure of the control scanner is as follows: Private Function CtlScanner() Dim ctl As Control For Each ctl In mfrm.Controls Select Case ctl.ControlType Case acCheckBox Case acComboBox Case acCommandButton Case acListBox Case acOptionButton Case acOptionGroup Case acPage Case acSubform 'subform controls Case acTabCtl 'tab pages are handled in the tab control Case acTextBox 'Find all text boxes and load class to change backcolor Case acToggleButton End Select Next ctl End Function • Cut and paste that into the clsFrm down at the bottom. Next we need to cause the control scanner to be called when mInit runs so add a new line to the mInit function as below: Function mInit(lfrm As Form) Set mfrm = lfrm mfrm.BeforeUpdate = cstrEvProc mfrm.OnClose = cstrEvProc CtlScanner End Function Now, when mInit executes it drops into CtlScanner and runs through all of the controls in the form’s Control collection. At the moment it doesn’t do anything but the scanner runs. If you place your cursor over the acCheckBox (or any of the constants) and hit Shift-F2, you will be taken to a list of the constants. Notice that I did not place every constant in the case statement, though you are free to do so. The ones I left out are not data aware controls, nor controls that you normally write code for. So these are the major players and you now have a way to find out that they exist in your form class and do something. That something will be to load a class and save a pointer to that class. In preparation for doing more with the form class we will add a private colCtls variable in the form header, and start to USE the Initialize and Terminate events of the class. • In the header of the class insert the following line: Private colCtls As Collection • Also replace the message box code in the Class_Initialize and Class_Terminate with code that initializes and cleans up a collection pointer for us: Private Sub Class_Initialize() Set colCtls = New Collection End Sub Private Sub Class_Terminate() Set colCtls = Nothing End Sub In this lecture we have created a method to iterate the form’s control collection. We have dimensioned a collection to hold a class for each control type sometime in the future, and we have modified the Initialize and Terminate events to set up and tear down that collection automatically as the class opens and closes. -- John W. Colby www.ColbyConsulting.com