Ms access 为什么赢了';当在循环中更改时,此标签的前景色是否会发生明显变化?
我正在制作一个表单,其中包含一组控件,我希望通过相关的切换按钮(让我们称之为组切换)可以明显地启用/禁用这些控件。每个组都有不同的控件类型,因此我制定了一个处理切换的通用过程:Ms access 为什么赢了';当在循环中更改时,此标签的前景色是否会发生明显变化?,ms-access,vba,ms-access-2013,Ms Access,Vba,Ms Access 2013,我正在制作一个表单,其中包含一组控件,我希望通过相关的切换按钮(让我们称之为组切换)可以明显地启用/禁用这些控件。每个组都有不同的控件类型,因此我制定了一个处理切换的通用过程: 'constants for control ForeColors Public Enum LabelForeColor Default = 8355711 Off = 14277081 End Enum Public Enum ListForeColor Default = 4210752
'constants for control ForeColors
Public Enum LabelForeColor
Default = 8355711
Off = 14277081
End Enum
Public Enum ListForeColor
Default = 4210752
Off = 12566463
End Enum
Public Sub EnableControl(Ctrl As Control, Enabled As Boolean)
With Ctrl
Select Case Ctrl.ControlType
Case acLabel
If Enabled Then .ForeColor = LabelForeColor.Default Else .ForeColor = LabelForeColor.Off
Debug.Print "LABEL", .ForeColor
Case acListBox
If Enabled Then .ForeColor = ListForeColor.Default Else .ForeColor = ListForeColor.Off
.Enabled = Enabled
Debug.Print "LIST", .ForeColor
Case acCommandButton
.Enabled = Enabled
Debug.Print "BUTTON", "NA"
Case acCheckBox
.Enabled = Enabled
Debug.Print "CHECK", "NA"
Case Else
Debug.Print "Control [" & .Name & "] is not of a type that EnableControl can handle."
End Select
End With
End Sub
每组控件由一个集合表示。加载表单时,每个具有特定标记属性的控件都会添加到相应的集合中。组切换不会添加到任何集合,而是具有如下所示的事件过程:
Private Sub ToggleGroup1_AfterUpdate()
Dim State As Boolean
'a public function that converts the toggle button's value to a boolean
State = FormCommon.ToggleButtonState(ToggleGroup1.Value)
Dim iCtrl As Control
For Each iCtrl In Controls_ByPlant
FormCommon.EnableControl iCtrl, State
Next iCtrl
End Sub
当我单击GroupToggle时,相应组中的所有控件都会发生相应的变化,除了标签。经过一个小时的故障排除,我知道:
- 标签的
属性确实会更改,但不会明显更改ForeColor
- 当我在循环外部的标签上调用
时,标签会明显改变。EnableControl
- 不管我是将label对象专门传递给子例程,还是从其组集合传递它;这两种情况下的变化都是可见的
- 如果我将禁用标签作为组切换事件的一部分进行切换,然后专门对该标签调用
以再次尝试禁用它,则不会出现可见的更改(可能是因为EnableControl
属性已设置为“off”颜色)ForeColor
- 在“组切换”事件运行时,使用
Application.Echo关闭屏幕更新,然后在事件结束时将其重新打开,这没有什么区别
- 对于i=1到.Count,使用
而不是
来运行组切换事件,而不是使用
不会有什么区别来运行每个
- 改为更改其他视觉属性(例如ForeTint)时也会出现此问题
- (根据注释)
没有任何区别重新绘制
- (根据评论)
不起作用DoEvents
(有史以来第一个问题,如果我在帖子中把事情搞砸了,我深表歉意)这很有趣,但有点虎头蛇尾 您的代码确实适用于标签,但实际情况是:
- 所有标签都与输入控件关联(通常如此)
- 停用组时,禁用输入控件(
).Enabled=Enabled
- 这会自动将关联标签设置为(系统定义的)浅灰色文本颜色,无法更改
- 此“禁用标签”颜色与您的
颜色非常相似,因此切换时很难看到更改。但它确实改变了LabelForeColor.Default
Public Enum LabelForeColor
默认值=vbRed'8355711
'除非向组中添加未关联的标签,否则“关闭”颜色永远不可见
关闭=vbBlue'14277081
结束枚举
编辑:您的测试代码
FormCommon.EnableControl iCtrl,False有效,因为它只影响标签,但不禁用其关联的列表框。使用条件格式,而不是VBA。@June7我不确定是否知道您在说什么。Bing:访问条件格式。我在一个上为Me.Controls中的每个iCtrl运行了您的代码,它对所有指定的控件都有效,包括标签。在这里访问2010。您可以在循环后尝试使用myForm.Repaint
。你能发布你表格的截图吗?@Andre