Charlotte Foust
charlotte.foust at gmail.com
Mon Apr 1 15:51:02 CDT 2013
I've used tags for the purpose too, but I'm a bit leery of depending on
something that could so easily be changed. I'm more inclined to use
unbound subforms to group the controls that need hiding if they're in a
single location rather than scattered all over the form.
Charlotte
On Sun, Mar 31, 2013 at 10:57 PM, Todd Harpham <toddharpham at qb3net.com>wrote:
> Hello -
>
> As seen in earlier posts to this thread, there is more than one way to
> manage the controls on a form. Here's another alternative.
>
> It's been a while since I've had this particular requirement but this is
> some code I wrote to enable and show form controls based on values loaded
> to
> the control tag.
>
> As part of the form load, the SetControlLocks sub is called.
>
> The sub loops through the Controls collection for the form. For each
> control:
>
> If there is no value loaded to the tag, nothing is done.
>
> If something has been loaded to the tag, then enable/disable the control
> based on the tag value.
>
> The logic can get quite involved. For the purposes of the sample code
> below,
> I actually stripped out a lot of what was happening in the original app,
> and
> set up some simpler logic for two types of employees (Manager and Rep).
> Variables mblnMgr and mblnRep indicate the employee's role.
>
> Todd
>
>
>
> Option Explicit
>
> Option Compare Database
>
>
>
> ' Tags indicating employee Role
>
> Private mblnMgr As Boolean
>
> Private mblnRep As Boolean
>
>
>
> Public Sub SetControlLocks(frm As Form)
>
> Dim blnErr As Boolean
>
> Dim strTag As String
>
> Dim strCtl As String
>
> Dim ctl As Control
>
> On Error Resume Next
>
>
>
> With frm
>
> For Each ctl In .Controls
>
> blnErr = False
>
> With ctl
>
> strCtl = .Name
>
> Select Case .ControlType
>
> Case acCheckBox, acComboBox, _
>
> acListBox, _
>
> acOptionGroup, acOptionButton, _
>
> acPage, acTabCtl, acSubform, _
>
> acTextBox, acToggleButton
>
>
>
> ' If the control tag is not blank, apply control security
>
> If Len(Nz(.Tag, "")) > 0 Then
>
> strTag = .Tag
>
>
>
> ' start with default of 'Locked' & disabled
>
> .Locked = True
>
> .Enabled = False
>
>
>
> ' Check for Manager
>
> If mblnMgr Then
>
> If strTag = "Mgr" Or strTag = "Rep" Then
>
> .Locked = False
>
> .Enabled = True
>
> End If
>
> ' Check for Rep
>
> ElseIf mblnRep Then
>
> If strTag = "Rep" Then
>
> .Locked = False
>
> .Enabled = True
>
> End If 'If strTag = "Rep"
>
> End If 'If mblnMgr Then
>
> End If 'If Len(Nz(.Tag, "")) > 9
>
> End Select 'Select Case .ControlType
>
> End With 'With ctl
>
> Next ctl 'For Each ctl In .Controls
>
> End With 'With frm
>
>
>
> ExitSub:
>
> On Error Resume Next
>
> Set ctl = Nothing
>
> Err.Clear
>
> Exit Sub
>
>
>
> ErrorHandler:
>
> Select Case Err
>
> ' Error 2164: Can't disable a control while it has the focus
>
> ' Try to move focus to next control. If you hit the error again
>
> ' while working on the same control, bypass the disable step.
>
> Case 2164
>
> If blnErr Then
>
> Resume Next
>
> Else
>
> blnErr = True
>
> TabNextControl frm
>
> End If
>
> Resume
>
> Case Else
>
> MsgBox "Error " & Err.Description & "(" & Err.Number & ")"
>
> End Select
>
> End Sub
>
>
>
> Private Sub TabNextControl(Optional frm As Access.Form)
>
> Dim blnEnabled As Boolean
>
> Dim blnDone As Boolean
>
> Dim intTest As Integer
>
> Dim intInd As Integer
>
> Dim ctl As Control
>
> On Error Resume Next
>
>
>
> If frm Is Nothing Then
>
> Set frm = Screen.ActiveForm
>
> End If 'If frm Is Nothing
>
>
>
> intInd = Nz(frm.ActiveControl.TabIndex) + 1
>
>
>
> With frm
>
> Do Until blnDone
>
> intInd = intInd Mod .Controls.Count
>
> For Each ctl In .Controls
>
> With ctl
>
> intTest = .TabIndex
>
> If intTest = intInd Then
>
> blnEnabled = .Enabled And .TabStop = True
>
> If blnEnabled Then
>
> .SetFocus
>
> blnDone = True
>
> Exit For
>
> End If 'If blnEnabled
>
> End If 'If intTest = intInd
>
> End With 'With ctl
>
> Next 'For Each ctl In .Controls
>
> intInd = intInd + 1
>
> ' Prevent endless loop
>
> If intInd > 150 Then
>
> Stop
>
> End If 'If intInd > 150
>
> Loop 'Do Until blnDone
>
> End With 'With frm
>
>
>
> ExitSub:
>
> Set ctl = Nothing
>
> Err.Clear
>
> End Sub
>
>
>
>
>
> --
> AccessD mailing list
> AccessD at databaseadvisors.com
> http://databaseadvisors.com/mailman/listinfo/accessd
> Website: http://www.databaseadvisors.com
>