jwcolby
jwcolby at colbyconsulting.com
Fri Jul 13 18:26:43 CDT 2007
I often like to use dates as flags, i.e. if a process happened I want a date
that the process happened, if it did not happen, then I have a void for the
date. However it is often convenient for the user to see the flag as a
check box, i.e. they only care THAT it happened, not WHEN it happened.
Obviously a checkbox is about Boolean values, not dates. In order to
provide a check box interface to a date field in the database I designed a
WithEvents class. The class is passed in an UNBOUND checkbox (for the
visual display) and a BOUND text box (for the date storage).
When the user checks the check box for the flag, the class sets or voids the
TEXTBOX VALUE property. The txt.Value is set to Date() if the checkbox is
set, and to VOID if the checkbox is cleared.
Likewise the checkbox DISPLAYS a true if the value of the textbox is NOT
NULL and DISPLAYS a FALSE if the textbox.Value is NULL.
This code is in actual use in one of my forms, and represents flags for
check stop payments and check voids in the database.
The code for the class is as follows:
'***************************************
'
'This is the CLASS module. Cut and paste this into a new class,
'then save to the name clsCtlChk2Date
'
Option Compare Database
Option Explicit
'
'This class uses a check box to set / void a date in a record
'The objective is to allow the form to set a date to date() if a check box
is checked
'and set that date to void if the check box is cleared.
'
'Likewise the checkbox should DISPLAY a TRUE if the date is NOT VOID
'and should display a FALSE if the date is VOID
'
'The class functions by passing in an UNBOUND check box which is the visual
indicator
'A BOUND text box is passed in which actually stores the state of the flag
as a date data type
'
'Thus as the user clicks the check box, this class sets the underlying (and
invisible) text box
'The text box VALUE property is set to DATE if the check box displays a TRUE
(is checked)
'and the textbox VALUE property is set to NULL if the checkbox displays a
FALSE (is not checked)
'
Private WithEvents mchk As CheckBox
Private mtxt As TextBox
Private Sub Class_Terminate()
Set mchk = Nothing
Set mtxt = Nothing
End Sub
Function init(lchk As CheckBox, ltxt As TextBox)
Set mchk = lchk
Set mtxt = ltxt
SetChkState
End Function
'
'This function causes the text box to track the visual state of the control
'If the user clicks the check box and the check box ends up TRUE then set
the text box to Date()
'else set the text box to VOID
'
Private Sub mchk_Click()
On Error GoTo Err_mchk_Click
If IsNull(mtxt) Then
mtxt = Date
Else
mtxt = Null
End If
SetChkState
Exit_mchk_Click:
Exit Sub
Err_mchk_Click:
Select Case Err
Case 0 '.insert Errors you wish to ignore here
Resume Next
Case Else '.All other errors will trap
Beep
MsgBox Err.Description, , "Error in Sub clsctlChk2Date.mchk_Click"
Resume Exit_mchk_Click
End Select
Resume 0 '.FOR TROUBLESHOOTING
End Sub
'
'This sub causes the visual state of the checkbox to track the text box
'If the text box is VOID (no date) then display a FALSE
'else display a TRUE
'
Public Sub SetChkState()
On Error GoTo Err_SetChkState
If IsNull(mtxt) Then
mchk.Value = False
Else
mchk.Value = True
End If
Exit_SetChkState:
Exit Sub
Err_SetChkState:
Select Case Err
Case 0 '.insert Errors you wish to ignore here
Resume Next
Case Else '.All other errors will trap
Beep
MsgBox Err.Description, , "Error in Sub clsctlChk2Date.SetChkState"
Resume Exit_SetChkState
End Select
Resume 0 '.FOR TROUBLESHOOTING
End Sub
'***************************************
It hooks in to the form as follows:
'***************************************
'
'This is the form's "code behind" module
'
Option Compare Database
Option Explicit
Private fclsCtlVoidReq As clsctlChk2Date 'Dimension four
instances of the class
Private fclsCtlVoidProc As clsctlChk2Date
Private fclsCtlStopReq As clsctlChk2Date
Private fclsCtlStopProc As clsctlChk2Date
Private Sub Form_Open(Cancel As Integer)
Set fclsCtlStopReq = New clsctlChk2Date 'Instantiate the
first one
fclsCtlStopReq.init chkStopRequest, txtStopReq 'pass in an UNBOUND
check box and a BOUND text box
Set fclsCtlStopProc = New clsctlChk2Date
fclsCtlStopProc.init chkStopProcessed, txtStopProcessed
Set fclsCtlVoidReq = New clsctlChk2Date
fclsCtlVoidReq.init chkVoidRequest, txtVoidReq
Set fclsCtlVoidProc = New clsctlChk2Date
fclsCtlVoidProc.init chkVoidProcessed, txtVoidProcessed
End sub
Private Sub Form_Current()
fclsCtlStopReq.SetChkState 'As the form moves through records, make the
checkbox display correctly
fclsCtlStopProc.SetChkState
fclsCtlVoidReq.SetChkState
fclsCtlVoidProc.SetChkState
End Sub
'***************************************
That is all there is to it. This is another demonstration of where a class
sinking events can replace a TON of code placed directly in the form, making
code maintenance easier and also fo course making the concept usable in
other forms as well as the current form.
I hope those who don't use classes find this useful in understanding how
classes can be useful, and how to implement classes and WithEvents to solve
everyday problems.
Enjoy,
John W. Colby
Colby Consulting
www.ColbyConsulting.com