Форумы HiProg.com - MS ACCESS, VBA, VB

 

Ответить на сообщение

Вернуться к теме

Вы отвечаете на сообщение:

ник: osmor
Попробую:
Сначала класс.

'внутренняя переменная соответствующая свойству Button
'WithEvents указывает что будут обрабатываться события данного объекта (в нашем случает это кнопка)
Dim WithEvents m_bt As VB.CommandButton
'внутренняя переменная соответствующая свойству OwnerForm в нем будет сохраняться форма содержащая кнопку
Dim m_OwnerForm As Form

'описание процедуры для получения значения свойства, она будет вызываться всякий раз когда кода будет попытка считать значение 
'свойства т.е. ЭкземплярКласса.Button
'будет возвращено значение сохраненное в переменной m_bt 
'кстати на мой взгляд здесь ошибка 
'вместо Set bt = m_bt должно быть 
'Set button = m_bt
Public Property Get Button() As VB.CommandButton
    Set bt = m_bt
End Property
'описание процедуры для ПРИСВОЕНИЯ значения свойству, она будет вызываться всякий раз когда кода будет попытка присвоить
'свойству значение 
' т.е. Set ЭкземплярКласса.Button = me.Кнопка0
'в этом случае переданное значение будет сохранено в переменной m_bt
Public Property Set Button(bt As VB.CommandButton)
     Set m_bt = bt
End Property

'то же самое но для свойства OwnerForm
Public Property Get OwnerForm() As Form
     Set OwnerForm = m_OwnerForm
End Property
Public Property Set OwnerForm(frm As Form)
      Set m_OwnerForm = frm
End Property

'процедура которая выполнится при возникновении события Click нашено объекта который мы описали как WithEvents
Private Sub m_bt_Click()
   Select Case m_bt.Tag
           Case "#"
               Unload m_OwnerForm
          Case Else
                MsgBox "O, Yes! " & m_bt.Caption, vbInformation
     End Select
End Sub

теперь сама процедура


Option Explicit
'объявляем переменную (массив) на уровне формы, в нем будет сохраняться экземпляры нашего клаccа
'если объявить переменную в процедуре то переменная разрушиться сразу после окончания процедуры, а нам нужно что бы она
'жила пока открыта форма 
Dim m_bt() As Object

Private Sub Form_Load()
Dim bt As Object, i As Integer, cl As Object
'при загрузке формы определяем размер массива для сохранения экземпляров класса
ReDim m_bt(2)
'для всех элементов массива
For i = 0 To UBound(m_bt)
     ' на форме создаем кнопку в именем btИндексВМАссиве
     Set bt = Controls.Add("VB.CommandButton", "bt" & i)
     'делаем ее видимой
     bt.Visible = True
     'позиционируем кнопку
     bt.Move (ScaleWidth - bt.Width) / 2, bt.Height * (i + 1)
'создаем экземпляр класса clsBT
Set cl = New clsBT
' говорим что свойство Button в созданном ЭКЗЕМПЛЯРЕ класса будет равно
'созданной кнопке
Set cl.Button = bt
'если это последний элемент массива, то у него будет другая подпись и свойство TAG
If i = UBound(m_bt) Then
    bt.Tag = "#"
    bt.Caption = "Close"
    ' присваиваем свойство OwnerForm в этом ЭКЗЕМПЛЯРЕ класса равным текущей форме
   Set cl.OwnerForm = Me
Else
    bt.Caption = "Button " & i + 1
End If
   'добавляем созданный экземпляр класса в массив
   Set m_bt(i) = cl
Next i
End Sub


В итоге мы получим для каждой созданной кнопки экземпляр класса clsBT, свойство button которого будет ссылаться на конкретную кнопку, и при нажатии на эту кнопку будет вызываться обработчик события из экземпляра класса "соответствующего" данной кнопке.
И только в одном экземпляре класса будет определено свойство OwnerForm, в остальных оно пустое.

ну вроде все...


Ваше имя:

Пароль:

Цитировать: [quote][/quote] Код: [code][/code]
Жирный: [b][/b] Наклонный: [i][/i]
URL: [url][/url] 

Сообщение:

 Размер файла не более 50 Кбт. Большие файлы можно размещать на www.slil.ru

Прикрепить:

 

Для вставки смайлов в текст щелкните по значку.