[AccessD] need ideas

Heenan, Lambert Lambert.Heenan at aig.com
Tue Feb 18 18:51:00 CST 2003


Sub: You don't need to pass a form name or object, just the OptionGroup is
passed, as an OptionGroup. The rest of the code is dependant on the Option
values that you define for the radio buttons in the OptionGroup. My quickly
thrown together example hard coded the "Yes" for the radio button label, but
that could be passed as a parameter too.

Basically there are three things the sub / event handler needs to work.

1/ a reference to the OptionGroupo object
3/ the possible values of the OptionGroup - defined at design time by
yourself.
=OR= the possible values of the radio button labels
2/ The desired colors for the labels of OptionGroup values X and Y

If you go the Sub route then each OptionGroup's On_Click event would call
the Sub. 

Using the class route and WithEvents I would instatiate the class when my
form loads and release the class object when the form closes. You also need
a mechanism for telling the class which objects are bound to it. This is
very easily handled using a Collection object like this...

Sub BindDateBoxesToForm(f As Form, pcolDateBoxes As Collection)
Dim Ctl As Control

    For Each Ctl In f.Form.Controls
     Select Case Ctl.ControlType
      Case acTextBox:
        If Instr(Ctl.Tag,"DateBox") > 0 Then
          pcolDateBoxes.Add New clsDateBox
          Set pcolDateBoxes(pcolDateBoxes.Count).Control = Ctl ' this line
binds the specific control to the class
        End If
     End Select
    Next Ctl
End Sub

In the above example (which binds textboxes to a class that displays a
pop-up calendar) a Form object and a Collection object is passed to the
routine BindDateBoxesToForm. This loops though the form, finds the textboxes
that have "DateBox" in their tag property. For each of these it creates an
instance of the clsDateBox class which is then added to the Collection
object. This ensured that the class object stays in existance until you
destroy the Collection object.

Your class will need to contain these essential elements

1/ a declaration of the control type you are binding the class to,
WithEvents

e.g. 

	Private WithEvents mDateBox As TextBox

2/ a class terminate event like this...

	Private Sub Class_Terminate()
	   If Not IsDestroyed(mDateBox) Then
	     Set mDateBox = Nothing
	   Else
	    ' you cannot set control to nothing here - you get 2467 Error -
	    ' control is destroyed by MS Access but its reference isn't
nothing -
	    ' Set mDateBox = Nothing
	   End If
	End Sub

3/ The IsDestroyed method

	Private Function IsDestroyed(ByRef rctl As Control) As Boolean
	  IsDestroyed = True
	  On Error GoTo IsDestroyed_exit
	  IsDestroyed = Not (rctl.Name = rctl.Name)
	IsDestroyed_exit:
	  Err.Clear
	End Function

4/ the 'Control' property used when adding instances to the collection in
the Bind routine

	Public Property Set Control(ByVal ctlNewControl As TextBox)
	    Set mDateBox = ctlNewControl
	    With mDateBox
	        .OnGotFocus = "[Event Procedure]"
	        .OnKeyPress = "[Event Procedure]"
	        .OnDblClick = "[Event Procedure]"
	    End With
	End Property

This property is called in the Binding routine to actually bind the class to
your control. It also declares which events the class is going to implement.

5/ The actual event handler code, such as...

	Private Sub mDateBox_GotFocus()
	    mDateBox = dGetDate(mDateBox)
	    ' dGetDate is a function that displays a calendar control and
returns a date.
	End Sub

When it's time to release the class objects, because each instance created
was added to a Collection, the release is simply achieved by setting the
Collection object to Nothing. All the contained objects will be destroyed.

In your case, dealing with OptionGroups, you do have to be carefull as the
values of the radio buttons are user definable, so keep this in mind when
wrting your event handler(s).

HTH

Lambert

> -----Original Message-----
> From:	John Bartow [SMTP:jbartow at earthlink.net]
> Sent:	Tuesday, February 18, 2003 12:55 PM
> To:	accessd at databaseadvisors.com
> Subject:	RE: [AccessD] need ideas
> 
> OK in both cases I need to:
> 
> find the result based on the frame's value
> find the name of the radio button contained in the frame with that value
> find the name of the associated label contained by that radio button
> change the fore color of it as desired
> 
> So the difference between the two would be:
> Sub: I would have to call a sub for every control on every form and pass
> it
> the form and control name
> 
> WithEvents Class: I would instantiate the class once when the app starts
> and
> it would "keep tabs" on which form and control is being used so and I
> would
> never have to include any additional code
> 
> Is this correct?
> 
> JB
> 
> 
> -----Original Message-----
> From: accessd-admin at databaseadvisors.com
> [mailto:accessd-admin at databaseadvisors.com]On Behalf Of Heenan, Lambert
> Sent: Tuesday, February 18, 2003 11:23 AM
> To: 'accessd at databaseadvisors.com'
> Subject: RE: [AccessD] need ideas
> 
> 
> Whether you use a class with WithEvents, or just a simple Sub that you
> call
> in the option group's On_Click event, here's an example of the basic logic
> that you could use to do the color changing...
> 
> Sub formatOpGroup(opGrp As OptionGroup, sCaption As String)
> Dim c As Control
> 
>     For Each c In opGrp.Controls
>         If TypeOf c Is Label Then
>             If c.Caption = sCaption Then
>                 c.ForeColor = IIf(sCaption = "Yes", RGB(0, 255, 0),
> RGB(255,
> 0, 0))
>             Else
>                 c.ForeColor = RGB(0, 0, 0)
>             End If
>         End If
>     Next c
> End Sub
> 
> Lambert
> 
> > -----Original Message-----
> > From:	John Bartow [SMTP:jbartow at earthlink.net]
> > Sent:	Tuesday, February 18, 2003 11:40 AM
> > To:	AccessD
> > Subject:	[AccessD] need ideas
> >
> > I'm involved in an app where the color of the associated label for radio
> > buttons in a frame should change once its selected.
> >
> > The frames are all the same and have radio buttons with "Yes" and "No"
> as
> > labels. They would like the NO to be red when selected and YES to be
> green
> > when selected.
> >
> > I was thinking of trying a class but this seems like it would be a bit
> > more
> > complicated than the text box background color changing class that we've
> > discussed before.
> >
> > Any ideas or suggestions?
> >
> > JB
> >
> >
> > _______________________________________________
> > AccessD mailing list
> > AccessD at databaseadvisors.com
> > http://databaseadvisors.com/mailman/listinfo/accessd
> > Website: http://www.databaseadvisors.com
> _______________________________________________
> AccessD mailing list
> AccessD at databaseadvisors.com
> http://databaseadvisors.com/mailman/listinfo/accessd
> Website: http://www.databaseadvisors.com
> 
> 
> _______________________________________________
> AccessD mailing list
> AccessD at databaseadvisors.com
> http://databaseadvisors.com/mailman/listinfo/accessd
> Website: http://www.databaseadvisors.com



More information about the AccessD mailing list