L
lmv
I have been trying to use the attached code. The ckbox is not working right,
sometimes it locks but then it will not unlock unless I close and then
reopen. If anyone has successfully used this code can you tell me if the
events I have the code in look right. Also, does my call to autofill a new
record belong in a different order. my check box ctrl name is lockbox, and
the field on my form is called "locked" I don't know if I need to rename my
field or my ctrl I am completely stumped. (I had already tried some easier
solutions I had read about but because of some of the code for calendars etc
they didn't work) I will try any suggestions Thanks!
-----------
Private Sub lockbox_AfterUpdate()
Call LockBoundControls(Me, Me.lockbox.Value, "lockbox")
End Sub
-----------------
Private Sub Form_Current()
Call LockBoundControls(Me, True)
'Opens new records with fields filled from last entry
Call AutoFillNewRecord(Forms!OrdersWDetails)
Call lockbox_AfterUpdate
End Sub
-----------------------
Private Sub lockbox_Click()
Call LockBoundControls(Me, True)
'if you want to lock the controls, or:
'Call LockBoundControls(Me, False)
'if you want to unlock them
'If there are controls you *don't* want to lock, add their names as
extraarguments, e.g.:
'Call LockBoundControls(Me, True, "Surname", "City")
End Sub
---------------------------
MODULE:
Public Function LockBoundControls(frm As Form, bLock As Boolean, ParamArray
avarExceptionList())
On Error GoTo Err_Handler
'Purpose: Lock the bound controls and prevent deletes on the form any
its subforms.
'Arguments frm = the form to be locked
' bLock = True to lock, False to unlock.
' avarExceptionList: Names of the controls NOT to lock
(variant array of strings).
'Usage: Call LockBoundControls(Me. True)
Dim ctl As Control 'Each control on the form
Dim lngI As Long 'Loop controller.
Dim bSkip As Boolean
'Save any edits.
If frm.Dirty Then
frm.Dirty = False
End If
'Block deletions.
frm.AllowDeletions = Not bLock
For Each ctl In frm.Controls
Select Case ctl.ControlType
Case acTextBox, acComboBox, acListBox, acOptionGroup, acCheckBox,
acOptionButton, acToggleButton
'Lock/unlock these controls if bound to fields.
bSkip = False
For lngI = LBound(avarExceptionList) To UBound(avarExceptionList)
If avarExceptionList(lngI) = ctl.Name Then
bSkip = True
Exit For
End If
Next
If Not bSkip Then
If HasProperty(ctl, "ControlSource") Then
If Len(ctl.ControlSource) > 0 And Not ctl.ControlSource
Like "=*" Then
If ctl.locked <> bLock Then
ctl.locked = bLock
End If
End If
End If
End If
Case acSubform
'Recursive call to handle all subforms.
bSkip = False
For lngI = LBound(avarExceptionList) To UBound(avarExceptionList)
If avarExceptionList(lngI) = ctl.Name Then
bSkip = True
Exit For
End If
Next
If Not bSkip Then
If Len(Nz(ctl.SourceObject, vbNullString)) > 0 Then
ctl.Form.AllowDeletions = Not bLock
ctl.Form.AllowAdditions = Not bLock
Call LockBoundControls(ctl.Form, bLock)
End If
End If
Case acLabel, acLine, acRectangle, acCommandButton, acTabCtl,
acPage, acPageBreak, acImage, acObjectFrame
'Do nothing
Case Else
'Includes acBoundObjectFrame, acCustomControl
Debug.Print ctl.Name & " not handled " & Now()
End Select
Next
'Set the visual indicators on the form.
On Error Resume Next
frm.cmdLock.Caption = IIf(bLock, "Un&lock", "&Lock")
frm!rctLock.Visible = bLock
Exit_Handler:
Set ctl = Nothing
Exit Function
Err_Handler:
MsgBox "Error " & err.Number & " - " & err.Description
Resume Exit_Handler
End Function
Public Function HasProperty(obj As Object, strPropName As String) As Boolean
'Purpose: Return true if the object has the property.
Dim vardummy As Variant
On Error Resume Next
vardummy = obj.Properties(strPropName)
HasProperty = (err.Number = 0)
End Function
sometimes it locks but then it will not unlock unless I close and then
reopen. If anyone has successfully used this code can you tell me if the
events I have the code in look right. Also, does my call to autofill a new
record belong in a different order. my check box ctrl name is lockbox, and
the field on my form is called "locked" I don't know if I need to rename my
field or my ctrl I am completely stumped. (I had already tried some easier
solutions I had read about but because of some of the code for calendars etc
they didn't work) I will try any suggestions Thanks!
-----------
Private Sub lockbox_AfterUpdate()
Call LockBoundControls(Me, Me.lockbox.Value, "lockbox")
End Sub
-----------------
Private Sub Form_Current()
Call LockBoundControls(Me, True)
'Opens new records with fields filled from last entry
Call AutoFillNewRecord(Forms!OrdersWDetails)
Call lockbox_AfterUpdate
End Sub
-----------------------
Private Sub lockbox_Click()
Call LockBoundControls(Me, True)
'if you want to lock the controls, or:
'Call LockBoundControls(Me, False)
'if you want to unlock them
'If there are controls you *don't* want to lock, add their names as
extraarguments, e.g.:
'Call LockBoundControls(Me, True, "Surname", "City")
End Sub
---------------------------
MODULE:
Public Function LockBoundControls(frm As Form, bLock As Boolean, ParamArray
avarExceptionList())
On Error GoTo Err_Handler
'Purpose: Lock the bound controls and prevent deletes on the form any
its subforms.
'Arguments frm = the form to be locked
' bLock = True to lock, False to unlock.
' avarExceptionList: Names of the controls NOT to lock
(variant array of strings).
'Usage: Call LockBoundControls(Me. True)
Dim ctl As Control 'Each control on the form
Dim lngI As Long 'Loop controller.
Dim bSkip As Boolean
'Save any edits.
If frm.Dirty Then
frm.Dirty = False
End If
'Block deletions.
frm.AllowDeletions = Not bLock
For Each ctl In frm.Controls
Select Case ctl.ControlType
Case acTextBox, acComboBox, acListBox, acOptionGroup, acCheckBox,
acOptionButton, acToggleButton
'Lock/unlock these controls if bound to fields.
bSkip = False
For lngI = LBound(avarExceptionList) To UBound(avarExceptionList)
If avarExceptionList(lngI) = ctl.Name Then
bSkip = True
Exit For
End If
Next
If Not bSkip Then
If HasProperty(ctl, "ControlSource") Then
If Len(ctl.ControlSource) > 0 And Not ctl.ControlSource
Like "=*" Then
If ctl.locked <> bLock Then
ctl.locked = bLock
End If
End If
End If
End If
Case acSubform
'Recursive call to handle all subforms.
bSkip = False
For lngI = LBound(avarExceptionList) To UBound(avarExceptionList)
If avarExceptionList(lngI) = ctl.Name Then
bSkip = True
Exit For
End If
Next
If Not bSkip Then
If Len(Nz(ctl.SourceObject, vbNullString)) > 0 Then
ctl.Form.AllowDeletions = Not bLock
ctl.Form.AllowAdditions = Not bLock
Call LockBoundControls(ctl.Form, bLock)
End If
End If
Case acLabel, acLine, acRectangle, acCommandButton, acTabCtl,
acPage, acPageBreak, acImage, acObjectFrame
'Do nothing
Case Else
'Includes acBoundObjectFrame, acCustomControl
Debug.Print ctl.Name & " not handled " & Now()
End Select
Next
'Set the visual indicators on the form.
On Error Resume Next
frm.cmdLock.Caption = IIf(bLock, "Un&lock", "&Lock")
frm!rctLock.Visible = bLock
Exit_Handler:
Set ctl = Nothing
Exit Function
Err_Handler:
MsgBox "Error " & err.Number & " - " & err.Description
Resume Exit_Handler
End Function
Public Function HasProperty(obj As Object, strPropName As String) As Boolean
'Purpose: Return true if the object has the property.
Dim vardummy As Variant
On Error Resume Next
vardummy = obj.Properties(strPropName)
HasProperty = (err.Number = 0)
End Function