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
    以再次尝试禁用它,则不会出现可见的更改(可能是因为
    ForeColor
    属性已设置为“off”颜色)
  • 在“组切换”事件运行时,使用
    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