2015-03-26 6 views
0

Я работаю над проектом и имею несколько блоков ярлыков (25) и нескольких меток в форме, которые являются именами SC1, SC2 ... SCN и Lbl1, Lbl2 ... LblN в зависимости от записей. Когда я нажимаю tickbox я хочу метку рядом с ней, чтобы отобразить информацию, смотрите ниже -Новое в классах Доступ к VBA

Private Sub SC1_Click() 
    If (Me!SC1) = True Then 
    Form.Controls("Lbl1").Caption = ("Completed by " & (Environ$("Username"))) 
    Form.Controls("Lbl1").ForeColor = vbGreen 
Else 
    Form.Controls("Lbl1").Caption = ("Please tick if Complete") 
    Form.Controls("Lbl1").ForeColor = vbBlack 
End If 

End Sub 

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

Option Compare Database 
Option Explicit 


Private pName As String 
Private pCaption As String 
Private pVisiblity As Boolean 
Private pValue As Boolean 


Public Property Get Name() As String 
    Name = pName 
End Property 
Public Property Let Name(Value As String) 
    pName = Value 
End Property 

Public Property Get Caption() As String 
    Caption = pCaption 
End Property 
Public Property Let Caption(Value As String) 
    pCaption = "Please Tick Box if complete" 
End Property 

Public Property Get Visibility() As Boolean 
    Visibility = pVisibility 
End Property 
Public Property Let Visibility(Value As Boolean) 
    pVisibility = True 
End Property 

Public Property Get Value() As Boolean 
    Value = pValue 
End Property 
Public Property Let Value(Value As Boolean) 
    pValue = True 
End Property 

ответ

0

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

  1. Использовать обработчики событий по умолчанию и вызывать одну настраиваемую функцию из каждого. Это немного улучшит вашу ситуацию.
  2. Используйте один специальный обработчик событий для всех флажков вместо обработчиков событий по умолчанию.
  3. Используйте класс и приложите экземпляр к каждому из этих флажков. Затем класс может получить любое событие из флажка. Это мощно, но вам все равно нужно зарегистрировать свой класс с каждым элементом управления и удерживать все экземпляры где-то, чтобы это работало.

Для вашей проблемы, я бы с раствором 2:

Во-первых, написать обработчик события, как это в Form-модуль:

Private Function chkClick(sName As String) 
    Debug.Print "Clicked: " & sName 
    Me.Controls(sName).Controls(0).Caption = "x" 
End Function 

Далее, введите дизайн режим вы формируете и переходите ко всем флажкам. В флажке «SC1» вы переходите к событию «OnClick» и вводите =chkClick("SC1") в качестве обработчика события вместо [Eventprocedure]. Убедитесь, что вы используете правильное имя элемента управления в качестве параметра функции.

Поздравляем! С этого момента все ваши флажки будут вызывать один и тот же обработчик событий и передавать их имя. Поскольку метка флажка является связанным с ней элементом управления, вы можете перейти к этой метке из поля с номером .Controls(0), что означает первый «суб» -контроль этого флажка. Таким образом, вам не нужно знать имя связанного ярлыка вообще!

+0

Спасибо Оливер, я дам, что выстрел – Gablet

1

Существует две части для создания и связывания элементов управления формы с пользовательскими объектами поддержки (классами). В вашем случае

Модуль Класс: clsMyCheckbox

Option Explicit 
Option Compare Database 
Public WithEvents chkBox As CheckBox 
Public chkLabel As Label 

Private currentUser As String 

Private Sub chkBox_Click() 
    If chkBox.Value = True Then 
     chkLabel.Caption = "Completed by " & currentUser 
     chkLabel.ForeColor = vbGreen 
    Else 
     chkLabel.Caption = "Please tick if Complete" 
     chkLabel.ForeColor = vbBlack 
    End If 
End Sub 

Private Sub Class_Initialize() 
    currentUser = Environ$("Username") 
End Sub 

А в вашем модуле формы:

Option Explicit 
Option Compare Database 

Private localCheckboxes As New Collection 

Private Sub Form_Load() 
    '--- find all the checkboxes on the form and create a 
    ' handler object for each one 
    Dim ctl As Control 
    Dim chknum As String 
    Dim cbObj As clsMyCheckbox 
    Dim chkLbl As Label 
    For Each ctl In Me.Controls 
     If ctl.ControlType = acCheckBox Then 
      '--- you can filter by name if needed 
      If ctl.Name Like "SC*" Then 
       chknum = Right(ctl.Name, Len(ctl.Name) - 2) 
       Set chkLbl = Me.Controls.Item("Lbl" & chknum) 
       chkLbl.Caption = "initialized" 'optional during form load 
       Set cbObj = New clsMyCheckbox 'class object for this checkbox 
       Set cbObj.chkBox = ctl   'link the control to the object 
       Set cbObj.chkLabel = chkLbl 'link the label too 
       '--- add it to a local store so the object persists 
       ' as long as the form is open 
       localCheckboxes.Add cbObj 
      End If 
     End If 
    Next ctl 
End Sub 

Private Sub Form_Unload(Cancel As Integer) 
    '--- guarantee the objects are destroyed with the form 
    Set localCheckboxes = Nothing 
End Sub 
+0

Благодаря PeterT, что действительно полезно. Один вопрос, почему в модуле класса нет команды Get или Set? Я читал какой-то код из книги, и это меня путало – Gablet

+0

Я сделал переменные 'chkBox' и' chkLabel' общедоступными в пространстве имен классов, потому что нет необходимости (в этом простом проекте) заставить вызывающего пользователя использовать метод Set ,Когда вы изучаете классы и объектно-ориентированный дизайн, понимание методов доступа (get и set) очень важно, но они не всегда требуются, если будет выполняться простой доступ общественности. (Это всегда можно обсуждать экспертами и стандартами кода, но приведенный выше код прост и удобен в обслуживании. Проверка ошибок и обработка - это то, что вы можете добавить по мере необходимости.) – PeterT

Смежные вопросы