2016-11-27 4 views
0

Поскольку вы не можете иметь вертикальную вкладку управления в Access, я создаю поддельный.
Я написал этот кусок кода, чтобы выделить (изменить носовой белый цвет) текущую страницу:Access 2016 VBA - Создайте собственную коллекцию элементов управления, вручную указав имя элемента управления

Private Sub updateBtnColor() 
    Dim currentPageIndexSZero As Long 
    Dim ctl As Control 
    currentPageIndexSZero = Me.tab1 
    For Each ctl In Me.Controls 
     If ctl.Tag = "page" & CStr(currentPageIndexSZero) Then 
      ctl.ForeColor = white 
     ElseIf InStr(1, ctl.Tag, "page", vbBinaryCompare) Then 
      ctl.ForeColor = black 
     End If 
    Next ctl 
End Sub 

Каждой кнопку попавшей страницы она со ссылкой на в качестве тега, в виде:

page0 
page1 
... 
pageN 

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

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

Enum myButtons 
    button1 = Forms!myForm!button1 
    button2 = Forms!myForm!button2 
    button3 = Forms!myForm!button3 
    button4 = Forms!myForm!button4 
End Enum 

И потом:

Public Sub updateBtnColor() 
    Dim curPageZ as Long 
    Dim button as Control 
    For Each button in myButtons 
     With button 
      If Right$(CStr(.Name, 1)) = curPageZ 
       .ForeColor = 16777215 ' White 
      Else      ' No need for an additional ElseIf since I already know these are only the wanted buttons 
       .ForeColor = 0  ' Black 
      End If 
     End With 
    Next button 
End Sub 

Что является наиболее элегантным/быстрым/лучшим/правильным способом создания такого или, если моя идея не так хороша, создать такую ​​логику?
Спасибо!

+0

Вы имеете в виду, как это http://www.fmsinc.com /microsoftaccess/controls/components/tabs/index.html – tahwos

ответ

1

Cycling through the controls работает довольно быстро, но если вы хотите ускорить это, используйте Collection для хранения объектов, а не Enum. Сбор можно также задействовать, используя For Each....

На уровне модуля формы создает коллекцию для кнопок:

Dim mcolMyButtons As New Collection 

Затем заполните эту коллекцию в открытых или нагрузке событий. Вы можете использовать теги:

Dim ctl As Control 
For Each ctl In Me.Controls 
    If TypeOf ctl Is CommandButton Then 
     If ctl.Tag Like "page*" Then 
      mcolMyButtons.Add ctl 
     End If 
    End If 
Next 

Или просто непосредственно добавлять кнопки вы хотите:

mcolMyButtons.Add Me.Button1 
mcolMyButtons.Add Me.Button2 
mcolMyButtons.Add Me.Button3 
mcolMyButtons.Add Me.Button4 

Тогда ваш суб:

Private Sub updateBtnColor() 
    Dim ctl As Control 
    For Each ctl In mcolMyButtons 
     If ctl.Tag = "page" & Me.tab1 Then 
      ctl.ForeColor = vbWhite 
     Else 
      ctl.ForeColor = vbBlack 
     End If 
    Next ctl 
End Sub 
+0

Спасибо за руководство Сергея. Моя единственная забота и причина этого вопроса: я не знаю, как создать «коллекцию» объектов, поэтому я использовал «Enum» в качестве примера, поскольку они выглядят одинаково. Не могли бы вы показать мне пример того, как создать «Collection» и добавить в него элемент управления? Постскриптум Кнопки команд выровнены по вертикали, так что они находятся на разных Y и не перекрываются! –

+0

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

+0

Очень спасибо Сергею, это все, что я искал, как создать коллекцию, это очень просто! Однако, поскольку я хотел бы иметь все мои пользовательские «коллекции» в модуле, называемом «basCollection», например, есть способ объявить коллекцию в модуле, не получив ошибку «Недопустимая внешняя процедура» и не используя инициализацию функция по форме Открытие или загрузка? –