gpt4 book ai didi

ms-access - 为什么在循环中更改时该标签的前景色不会发生明显变化?

转载 作者:行者123 更新时间:2023-12-02 23:19:41 25 4
gpt4 key购买 nike

我正在制作一个包含控件组的表单,我想使用相关的切换按钮(让我们称它们为“组切换”)来明显地启用/禁用这些控件。每个组都有不同的控件类型,因此我制作了一个通用程序来处理切换:

'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 时,标签会明显发生变化。
    • 无论我将标签对象专门传递给子例程还是从其组集合中传递它都没有关系;在这两种情况下变化都是可见的
  • 如果我在 Group Toggle 事件中切换禁用了某个标签,然后专门在该标签上调用 EnableControl 来尝试再次禁用它,则不会出现明显的变化(可能是因为 >ForeColor 属性已设置为“关闭”颜色)
  • 在 Group Toggle 事件运行时使用 Application.Echo 关闭屏幕更新,然后在事件结束时重新打开屏幕更新不会产生任何影响。
  • 使用 For i = 1 to .Count 而不是 For Each 运行 Group Toggle 事件不会产生任何影响。
  • 更改不同的视觉属性(例如 ForeTint)时也会出现此问题。
  • (根据评论)重新绘制没有什么区别
  • (根据评论)DoEvents 没有什么区别

为什么会发生这种情况?

(第一个问题,如果我在帖子中弄乱了一些东西,请道歉)

最佳答案

这很有趣,但有点虎头蛇尾。

您的代码确实适用于标签,但发生的情况是这样的:

  • 所有标签都与输入控件相关联(像往常一样)
  • 停用组时,您会禁用输入控件 (.Enabled = Enabled)
  • 这会自动将关联标签设置为(系统定义的)浅灰色文本颜色,且无法更改。
  • 此“禁用标签”颜色与 LabelForeColor.Default 颜色非常相似,因此切换时很难看到变化。但它确实发生了变化。

更改颜色常量​​以使效果更加明显:

Public Enum LabelForeColor
Default = vbRed ' 8355711
' the "Off" color is never visible, unless you add an un-associated label to a group
Off = vbBlue ' 14277081
End Enum

enter image description here

编辑:您的测试代码 FormCommon.EnableControl iCtrl, False 有效,因为它只影响标签,但不会禁用其关联的列表框。

关于ms-access - 为什么在循环中更改时该标签的前景色不会发生明显变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46553268/

25 4 0