Как мне зациклить это утверждение? - PullRequest
0 голосов
/ 15 сентября 2018

Вместо того, чтобы проходить через каждую частную подпрограмму и писать один и тот же код, как я могу перебрать каждую подпрограмму и применить код?

Private Sub cmdMenu1_GotFocus()
Me.cmdMenu1.BackColor = RGB(92, 131, 180)
Me.cmdMenu1.ForeColor = RGB(92, 131, 180)
End Sub
Private Sub cmdMenu1_LostFocus()
Me.cmdMenu1.BackColor = RGB(255, 255, 255)
Me.cmdMenu1.ForeColor = RGB(0, 0, 0)
End Sub
Private Sub cmdMenu2_GotFocus()
Me.cmdMenu2.BackColor = RGB(92, 131, 180)
Me.cmdMenu2.ForeColor = RGB(92, 131, 180)
End Sub
Private Sub cmdMenu2_LostFocus()
Me.cmdMenu2.BackColor = RGB(255, 255, 255)
Me.cmdMenu2.ForeColor = RGB(0, 0, 0)
End Sub
Private Sub cmdMenu3_GotFocus()
Me.cmdMenu3.BackColor = RGB(92, 131, 180)
Me.cmdMenu3.ForeColor = RGB(92, 131, 180)
End Sub
Private Sub cmdMenu3_LostFocus()
Me.cmdMenu3.BackColor = RGB(255, 255, 255)
Me.cmdMenu3.ForeColor = RGB(0, 0, 0)
End Sub
Private Sub cmdMenu4_GotFocus()
Me.cmdMenu4.BackColor = RGB(92, 131, 180)
Me.cmdMenu4.ForeColor = RGB(92, 131, 180)
End Sub
Private Sub cmdMenu4_LostFocus()
Me.cmdMenu4.BackColor = RGB(255, 255, 255)
Me.cmdMenu4.ForeColor = RGB(0, 0, 0)
End Sub
Private Sub cmdMenu5_GotFocus()
Me.cmdMenu5.BackColor = RGB(92, 131, 180)
Me.cmdMenu5.ForeColor = RGB(92, 131, 180)
End Sub
Private Sub cmdMenu5_LostFocus()
Me.cmdMenu5.BackColor = RGB(255, 255, 255)
Me.cmdMenu5.ForeColor = RGB(0, 0, 0)
End Sub

и т.д ...

Любая помощь будетс благодарностью.

1 Ответ

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

Первым шагом является создание функции (одна функция, а не две) для покрытия повторения.

Private Sub ChangeMenuColour(Menu as ControlMenu, GotFocus as Boolean)
    If GotFocus then
        ControlMenu.BackColor = RGB(92, 131, 180)
        ControlMenu.ForeColor = RGB(92, 131, 180)
    Else
        ControlMenu.BackColor = RGB(255, 255, 255)
        ControlMenu.ForeColor = RGB(0, 0, 0)
    End If
End Sub

Примечание: объявите Menu как правильный тип управления (тип безопасности), я просто использовал ControlMenu, так как не знаю, какой тип управления вы используете.

Теперь для каждого элемента управления вам нужно только вызвать функцию. Например:

Private Sub cmdMenu1_LostFocus()
    ChangeMenuColour Me.cmdMenu1, False
End Sub

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

Для вашего следующего шага вы можете создать собственный класс, включающий член WithEvents, который также обрабатывает соответствующее событие. См. Excel VBA добавить обработчик для каждого флажка в форме для этого примера. Однако работа по достижению этого может быть больше, чем простое повторение, которое у вас есть выше.

Используя код по ссылке, приведенной выше, с учетом вашего примера:

'This is in a class module called MenuHandler
Private WithEvents menu As MSForms.ControlMenu ' substitute with your specific control

Property Set TargetMenu(targetobject as ControlMenu)
    set menu = targetobject
End Property

Private Sub menu_GotFocus()
    ChangeMenuColour True
end sub

Private Sub menu_LosttFocus()
    ChangeMenuColour False
end sub

Private Sub ChangeMenuColour(GotFocus as Boolean) ' Note change in signature, change in context on how this is used
    If GotFocus then
        menu.BackColor = RGB(92, 131, 180)
        menu.ForeColor = RGB(92, 131, 180)
    Else
        menu.BackColor = RGB(255, 255, 255)
        menu.ForeColor = RGB(0, 0, 0)
    End If
End Sub

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

' This is in the user form
' Declare the handler links as module-level, not within any sub or event handler
Private menuHandler1 as new MenuHandler
Private menuHandler2 as new MenuHandler
Private menuHandler3 as new MenuHandler

' The following code would go in the initialise/load event handler
    Set menuHandler1.TargetMenu = cmdMenu1 ' now you don't have to add any other focus handlers for this menu - but you can anyway
    Set menuHandler2.TargetMenu = cmdMenu2
    Set menuHandler3.TargetMenu = cmdMenu3

С другой стороны

' This is in the user form
' Declare the handler links as module-level, not within any sub or event handler
Private menuHandlerCollection as new Collection ' will store the MenuHandlers

' The following code would go in the initialise/load event handler or where you create your menus
    Dim menuHandlerInstance as MenuHandler
    ' Usually some other code here
    ' the following may be in a loop, or you might just have a list of items to add
    ' only a single instance included here as an example
    Set menuHandlerInstance = new MenuHandler
    Set menuHandlerInstance .TargetMenu = cmdMenuX ' now you don't have to add any other focus handlers for this menu
    menuHandlerCollection.Add menuHandlerInstance
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...