Написание функции обновления ярлыков OnClick Access VBA - PullRequest
0 голосов
/ 26 сентября 2018

Я создаю форму, которая позволяет пользователю выбирать любое количество сигнат, чтобы я мог автоматически заполнить набор записей значениями.Я воссоздал группу опций флажков, потому что менеджеры / супервизоры сказали, что флажки по умолчанию слишком малы.

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 логических значений, которые я использую, чтобы я мог быстро перебирать их все.Я делал это раньше, но только с четырьмя значениями, где повторение всего кода не было проблемой.Теперь, когда у меня есть более широкий набор опций, я решил изменить его, чтобы сделать его многоразовым.

Я придумал эту функцию в качестве замены, но я не могу понять, как динамически изменить, какая метка обновляется.

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

Я выяснил, когда искал решения, которые помечают метки.не может быть активным контролем формы.Я также попытался

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

, но это тоже не сработало.Я не знаю, куда идти дальше.Я не уверен, что это даже можно сделать, но было бы очень полезно, если бы было решение.

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

Я хочу знать, есть ли способ создать более общую функцию, которую я могу повторно использовать для каждого события OnClick вместо вставки одного и того же кода с небольшими изменениями 36 раз.

Это именно то, для чего WithEvents .

У меня была форма с 60 элементами управления, и я написал статью о том, как это сделать:

Создать WindowsЦветовая палитра и селектор телефона с помощью 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

0 голосов
/ 27 сентября 2018

Вы можете использовать кнопки переключения, они могут даже иметь ассоциированную метку, которая при нажатии переключает кнопку.Вы можете использовать белый X в качестве заголовка для всех кнопок переключения, чтобы они отображались с белыми передними цветами (чтобы вы не видели белый X) и темно-зеленым цветом при нажатии.Просто играйте с цветами, пока они не подойдут.Таким образом, вам не понадобится код для переключения цвета или заголовка.

В качестве примера я использовал

  • Заголовок: X
  • BackColor: #FFFFFF
  • BorderStyle: Solid
  • BorderWidth: Hairline
  • BorderColor: # 000000
  • HoverColor: # 008000
  • PressedColor: # 008000
  • HoverForeColor: # 008000
  • PressedForeColor: # FFFFFF
  • TextColor: # FFFFFF

Снимок экрана:

Example

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...