|
|
|
| Помогите особо одарённому разобраться всё таки с модулями классов
========================
имеется модуль формы
Option Explicit
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)
Set bt = Controls.Add("VB.CommandButton", "bt" & i)
bt.Visible = True
bt.Move (ScaleWidth - bt.Width) / 2, bt.Height * (i + 1)
Set cl = New clsBT
Set cl.Button = bt
If i = UBound(m_bt) Then
bt.Tag = "#"
bt.Caption = "Close"
Set cl.OwnerForm = Me
Else
bt.Caption = "Button " & i + 1
End If
Set m_bt(i) = cl
Next i
End Sub
|
| |
|
| |
|
|
|
| имеется модуль класса clsBT
Option Explicit
Dim WithEvents m_bt As VB.CommandButton
Dim m_OwnerForm As Form
Public Property Get Button() As VB.CommandButton
Set bt = m_bt
End Property
Public Property Set Button(bt As VB.CommandButton)
Set m_bt = bt
End Property
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
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
|
Помогите хотяба коментами к коду
================================
у мну всё конечна работает.........
но никак не въеду - как это всё работает.......... | |
|
| |
|
|
|
| на форме программно создаются 3 кнопки
и потом они даже откликаются на воздействие.....
переделал всё под Image - работает нормально, но я не догоняю как........ | |
|
| |
|
|
|
| может начать с того, что именно вам непонятно?
Достаточно прозрачный код.
Почитайте о ключевом слове WithEvents.
Видимо именно это определяет трудность понимания кода. | |
|
| |
|
|
|
|
| вот это не понятно -Set cl.Button = bt | |
|
| |
|
|
|
| и вот это не понятно
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
|
| |
|
| |
|
|
|
| Непонятно, что непонятно.
Приведены процедуры для чтения и установки значения свойства OwnerForm в классе clsBT. | |
|
| |
|
|
|
|
Приведены процедуры для чтения и установки значения свойства OwnerForm в классе clsBT.
|
Но, простите у формы нет такого свойства... OwnerForm | |
|
| |
|
|
|
| Это свойство класса clsBT | |
|
| |
|
|
|
| Класс clsBT имеет свойство Button.
В этой строке этому свойству присваивается значение - добавленный на форму контрол CommandButton.
А так как переменная m_bt объявлена с использованием WithEvents, то процедура обработки события m_bt_Click будет срабатывать на нажатие кнопки. | |
|
| |
|
|
|
|
Класс clsBT имеет свойство Button
|
А как это определить - какие свойства имеются у класса
- кто и как их предопределил? | |
|
| |
|
|
|
| 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) ' добавление элементов на форму
Set bt = Controls.Add("VB.CommandButton", "bt" & i)
bt.Visible = True
bt.Move (ScaleWidth - bt.Width) / 2, bt.Height * (i + 1)' добавление элементов на форму
Set cl = New clsBT ' Создаём экземпляр класса
Set cl.Button = bt
If i = UBound(m_bt) Then
bt.Tag = "#" ' отгуда то в tag "#"
bt.Caption = "Close"
Set cl.OwnerForm = Me ' это как то свойство класса OwnerForm почемуто равно форме ???
Else
bt.Caption = "Button " & i + 1
End If
Set m_bt(i) = cl ' это очередная кнопка - становиться классом???
Next i
End Sub | |
|
| |
|
|
|
| Set cl.OwnerForm = Me ' это как то свойство класса OwnerForm почемуто равно форме ???
Чтобы потом класс мог выполнить какие-либо действия с этой формой.
Set m_bt(i) = cl ' это очередная кнопка - становиться классом???
нет. Просто все созданные классы собираются в один массив. Чтобы потом с ними можно было что-то сделать, например уничтожить. | |
|
| |
|
|
|
| АААААААААААААААААААААААААААААААААА - вот это ни ХР сбе......... | |
|
| |
|
|
|
| Какие программисту нужны свойства класса, те он и создает.
Смотрим Help VBA Office 97:
Процедура Property представляет собой последовательность инструкций языка Visual Basic, которые позволяют программисту создавать собственные свойства и оперировать с ними.
· Процедуры Property создают допускающие только чтение свойства для форм, стандартных модулей и модулей класса.
· Процедуры Property следует использовать вместо переменных Public в программе, которая должна выполняться после задания значение свойства.
· В отличие от переменных Public процедуры Property могут иметь справочные строки, присвоенные им в окне Просмотр объектов.
Когда создается процедура Property, она становится свойством модуля, содержащего эту процедуру. ... | |
|
| |
|
|
|
| Вон оно как ...
Property и переводтся как свойство..
угу..... | |
|
| |
|
|
|
| Пока ясность не аступила | |
|
| |
|
|
|
|
|
| Попробую:
Сначала класс.
'внутренняя переменная соответствующая свойству 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, в остальных оно пустое.
ну вроде все... | |
|
| |
|
|
|
| СПАСИБО - ИЗУЧАЮ.... | |
|
| |
|
|
|
| Бъюся башкой о простые слова
Кругом от кода идёт голова
Вроде простое имеем решенье
Что же меня оно вводит в смущенье
Да не в смущщенье ,
а прямо в тупик
Я как не знавший урок ученик
Руки вспотели и высох язык
В суть описалова -
я не проник
сделал пример - и его истязаю
суть WithEwents_a я изучаю
И заодно разбираюсь как в классе
Я о строении в модуле класса | |
|
| |
|
|
|