编写函数以更新标签OnClick Access VBA

时间:2018-09-26 17:39:46

标签: ms-access access-vba ms-access-2016

我正在创建一个表单,该表单允许用户选择任意数量的Sig,因此我可以使用值自动填充记录集。我重新创建了一个复选框选项组,因为管理层/主管说默认复选框太小。

My Sig Form我有此代码,该代码可以正常工作,但我想知道是否有一种方法可以创建一个更通用的函数,以便可以在每个OnClick事件上重用,而不用粘贴相同的代码并进行较小的更改36次。

Private Sub lblChkSig1_Click()
    mblnArray(0) = Not (mblnArray(0))
    If mblnArray(0) Then
        lblChkSig1.Caption = Chr(80)    'check mark
        lblChkSig1.BackColor = RGB(0, 128, 0)     'Dark Green
    Else
        lblChkSig1.Caption = ""
        lblChkSig1.BackColor = RGB(255, 255, 255)    'White
    End If
End Sub

数组mblnArray只是36个布尔值的数组,我经常使用它们,因此我可以快速遍历它们。我之前已经做过,但是只有多达4个值才是重做所有代码的问题。既然我有更多的选择集,我决定要对其进行更改以使其可重用。

我想出了此功能的替代品,但我不知道如何动态更改更新的标签。

Private Sub UpdateChecks(iPos As Integer)
    Dim ctlCurrentControl as Label
    Set cltCurrentControl = Me.ActiveControl

    mblnArray(iPos) = Not (mblnArray(iPos))
    If mblnArray(iPos) Then
        ctlCurrentControl.Caption = Chr(80)    'check mark
        ctlCurrentControl.BackColor = RGB(0, 128, 0)     'Green
    Else
        ctlCurrentControl.Caption = ""
        ctlCurrentControl.BackColor = RGB(255, 255, 255)    'White
    End If

End Sub

我在寻找标签不能作为表单的Active Control的解决方案时发现了。我也尝试过

Dim ctlCurrentControl as Label
Set ctlCurrentControl = "lblChkSig" & iPos

但是那也不起作用。我不知道从这里开始。我不确定这是否可以完成,但是如果有解决方案,那将非常有帮助。

2 个答案:

答案 0 :(得分:2)

您可以使用切换按钮,它们甚至可以具有关联的标签,单击该标签可以切换按钮。您可以将白色X用作所有切换按钮的标题,让它们在显示时具有白色前景色(因此您将看不到白色X)和深绿色。只是玩弄颜色,直到适合为止。这样,您将不需要任何代码来切换颜色或标题。

例如,我使用

  • 标题:X
  • BackColor:#FFFFFF
  • BorderStyle:纯色
  • BorderWidth:发际线
  • BorderColor:#000000
  • HoverColor:#008000
  • PressedColor:#008000
  • HoverForeColor:#008000
  • PressedForeColor:#FFFFFF
  • TextColor:#FFFFFF

屏幕截图:

Example

答案 1 :(得分:1)

  

我想知道是否有一种方法可以创建更通用的函数   我可以在每个OnClick事件上重用,而不必粘贴相同的事件   代码进行了36次细微改动。

这正是 WithEvents 的目的。

我有一个包含60个控件的表单,并写了一篇有关如何执行此操作的文章:

Create Windows Phone Colour Palette and Selector using WithEvents

核心是这个简单的类:

Option Explicit

' Helper class for form Palette for event handling of textboxes.
' 2017-04-19. Gustav Brock, Cactus Data ApS, CPH.
' Version 1.0.0
' License: MIT.

' *

Private Const EventProcedure    As String = "[Event Procedure]"

Private WithEvents ClassTextBox As Access.TextBox


Public Sub Initialize(ByRef TextBox As Access.TextBox)

    Set ClassTextBox = TextBox

    ClassTextBox.OnClick = EventProcedure

End Sub


Public Sub Terminate()

    Set ClassTextBox = Nothing

End Sub


Private Sub ClassTextBox_Click()

    ' Select full content.
    ClassTextBox.SelStart = 0
    ClassTextBox.SelLength = Len(ClassTextBox.Value)
    ' Display the clicked value.
    ClassTextBox.Parent!CopyClicked.Value = ClassTextBox.Value
    ' Copy the clicked value to the clipboard.
    DoCmd.RunCommand acCmdCopy

End Sub

表格中所需的代码仅是:

Option Explicit

' Form to display the Windows Phone 7.5/8.0 colour theme.
' Also works as a basic example of implementing WithEvents for a form.
' 2017-04-19. Gustav Brock, Cactus Data ApS, CPH.
' Version 1.0.0
' License: MIT.

' *

Private ControlCollection   As Collection


Private Sub Form_Load()

    ' Load events for all colour value textboxes.

    Dim EventProcedure  As ClassTextboxSelect
    Dim Control         As Access.Control

    Set ControlCollection = New Collection

    For Each Control In Me.Controls
        If Control.ControlType = acTextBox Then
            Set EventProcedure = New ClassTextboxSelect
            EventProcedure.Initialize Control
            ControlCollection.Add EventProcedure, Control.Name
        End If
    Next

    Set EventProcedure = Nothing
    Set Control = Nothing

End Sub


Private Sub Form_Unload(Cancel As Integer)

    ' Unload events for all colour value textboxes.

    Dim EventProcedure  As ClassTextboxSelect

    For Each EventProcedure In ControlCollection
        EventProcedure.Terminate
    Next

    Set EventProcedure = Nothing
    Set ControlCollection = Nothing

End Sub

完整代码也位于 GitHub 上:VBA.ModernTheme