2017-10-03 4 views
3

私は、関連するトグルボタン(グループトグルと呼ぶ)で目に見えるように有効/無効にしたいコントロールのグループを持つフォームを作っています。各グループは、コントロールの種類の異なる様々なを持っているので、私はトグル動作を処理するための一般的な手順を行った。ループ内で変更されたときに、このラベルのForeColorが目に見える形で変化しないのはなぜですか?

'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 

コントロールの各グループがコレクションで表現されます。フォームが読み込まれると、特定のタグプロパティを持つすべてのコントロールが対応するコレクションに追加されます。グループを切り替え任意のコレクションに追加され、代わりに次のようになりイベントプロシージャ持っていません。私はGroupToggleをクリックすると、対応するグループ内のすべてのコントロールが目に見えて、適切にラベルを除いてを変更、

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 

。トラブルシューティングの時間後、ここで私が知っているものだ:

  • ラベルForeColorプロパティが変更を行いますが、目に見えません。
  • EnableControlをループ外のラベルに呼び出すと、ラベルが視覚的に変わります。
    • ラベルオブジェクトを特にサブルーチンに渡すか、グループコレクションから渡すかどうかは関係ありません。私はグループのトグルイベントの一部としてラベルを切り替える-無効にし、再度それを無効にしようとするそのラベルに特にEnableControlを呼び出すと変更は両方のケース
  • に表示され、(おそらく目に見える変化はありませんForeColorプロパティは既に「オフ」の色に設定されています)
  • グループトグルイベントが実行されている間に画面を更新してからオフにすることは、イベントの最後に再度オンにしても効果はありません。
  • For Eachの代わりにFor i = 1 to .Countを指定してグループトグルイベントを実行しても、違いはありません。
  • この問題はForeTintのような別のビジュアルプロパティを代わりに変更する場合にも発生します。
  • (パーコメント)Repaint
  • (コメントあたり)違いはありませんDoEventsは違い

ですが、なぜでしょうがありませんか?

+0

VBAではなく条件付き書式を使用します。 – June7

+0

@ June7あなたが何を言っているのか分かりません。 –

+0

Bing:アクセス条件付き書式設定。 https://support.office.com/en-us/article/Change-the-appearance-of-a-control-by-using-conditional-formatting-6BA9E9FA-4347-4183-B335-44E43B05E22F – June7

答えて

2

これは面白い、やや拍子抜けでした(まず、これまでの質問は、謝罪ので、私はポストに何かを台無しにした場合)。

あなたのコードはラベルのための作業を行いますが、何が起こるかはこれです:あなたがグループを無効にすると

  • は、あなたが入力を無効にする(それはいつものように)

    • すべてのラベルが入力コントロールに関連付けられていますコントロール(.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作品、それはラベルのみに影響しますが、そのは無効になりませんので、関連付けられたリストボックス。

  • 関連する問題