Provided by Allen Browne, February 2004. Updated September 2007
In Access 2003, simply moving the mouse over the pages of a tab control can make the screen flicker annoyingly if Windows XP themes are active.
September 2007 update: Microsoft reports this issue is fixed in Service Pack 3 for Office 2003.
The flickering is triggered by unattached labels on the page of a tab control. The workaround is to convert these labels to text boxes.
You could also avoid the issue by right-clicking your Windows XP desktop, choosing Properties, and setting the Theme to "Windows Classic". That is not a satisfactory workaround if you develop databases for others. You cannot solve it by deselecting Use Windows Themed Controls on Forms under Tools | Options | Forms/Reports in Access 2003.
Controls in an option group also flicker when the mouse is passed over the label attached to the group. If you wish to address this issue also, see the comments following the code below.
The code below loops through all the controls on a form and locates the labels that have a tab page as their parent. It changes the ControlType to text box, assigns the label's Caption to the text box's ControlSource, and sets the Enabled, Locked, and BackColor so the text box looks and behaves like a label.
To use it to fix a form named "MyForm":
The function lists to the Immediate Window the names of any labels that were converted.
To fix all the forms in an Access 2003 database, enter:
? FixAllForms()
Warnings:
Function ConvertLabelOnTabPage(strFormName As String, _
Optional bSaveAndClose As Boolean, Optional bHidden As Boolean)
'Purpose: Change unattached labels on pages of tab control into text boxes.
' Avoids flicker bug under Windows XP themes.
Dim frm As Form
Dim ctl As Control
Dim strName As String
Dim strCaption As String
Dim bytBackStyle As Byte
Dim bChanged As Boolean
Const strcQuote = """"
'Open the form in design view
DoCmd.OpenForm strFormName, acDesign, _
windowmode:=IIf(bHidden, acHidden, acWindowNormal)
Set frm = Forms(strFormName)
'Find the labels whose parent is a tab page.
For Each ctl In frm.Controls
If ctl.ControlType = acLabel Then
If ParentIsTabPage(ctl) Then
bChanged = True
strName = ctl.Name 'ctl reference will be lost.
strCaption = ctl.Caption 'For ControlSource.
bytBackStyle = ctl.BackStyle 'Access doesn't set this.
Debug.Print strFormName & "." & strName
'Convert it to a text box.
ctl.ControlType = acTextBox
'Set the text box properties.
With frm.Controls(strName) 'ctl is now undefined.
.ControlSource = "=" & strcQuote & _
Replace(strCaption, strcQuote, strcQuote & strcQuote) & strcQuote
.Enabled = False
.Locked = True
.BackStyle = bytBackStyle
End With
End If
End If
Next
Set ctl = Nothing
Set frm = Nothing
If Not bChanged Then
DoCmd.Close acForm, strFormName, acSaveNo
ElseIf bSaveAndClose Then
DoCmd.Close acForm, strFormName, acSaveYes
End If
End Function
Private Function ParentIsTabPage(ctl As Control) As Boolean
On Error Resume Next
ParentIsTabPage = (ctl.Parent.ControlType = acPage)
End Function
Function FixAllForms()
'Purpose: Run ConvertLabelOnTabPage() for ALL forms in this database.
'Warning: Saves changes without confirmation.
Dim accobj As AccessObject
For Each accobj In CurrentProject.AllForms
Call ConvertLabelOnTabPage(accobj.Name, True, True)
Next
End Function
Passing the mouse over the label attached to an option group also causes the items in the group to flicker. This is not handled by the code above, since 1) it is a lesser issue, and 2) converting the group's label could disable a shortcut key.
To convert the labels of your options groups to text boxes also, replace the ParentIsTabPage() function above with this:
Private Function ParentIsTabPage(ctl As Control) As Boolean
On Error Resume Next
ParentIsTabPage = ((ctl.Parent.ControlType = acPage) Or _
(ctl.Parent.ControlType = acOptionGroup))
End Function
| Home | Index of tips | Top |