Rambler's Top100
Форум: MS ACCESSVBVBA MS OfficeMS SQL server
Новые сообщения: 0000

Форум: 

Обновить визитку
Участники «Online»
Все участники

 
 

Доброго времени суток, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: прошу помощи
 
 автор: час   (26.10.2009 в 08:57)   личное сообщение
 
 

Помогите особо одарённому разобраться всё таки с модулями классов
========================
имеется модуль формы


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

  Ответить  
 
 автор: час   (26.10.2009 в 08:58)   личное сообщение
 
 

имеется модуль класса 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




Помогите хотяба коментами к коду
================================
у мну всё конечна работает.........
но никак не въеду - как это всё работает..........

  Ответить  
 
 автор: час   (26.10.2009 в 09:03)   личное сообщение
 
 

на форме программно создаются 3 кнопки
и потом они даже откликаются на воздействие.....
переделал всё под Image - работает нормально, но я не догоняю как........

  Ответить  
 
 автор: Serge Gavrilov   (26.10.2009 в 09:38)   личное сообщение
 
 

может начать с того, что именно вам непонятно?
Достаточно прозрачный код.
Почитайте о ключевом слове WithEvents.
Видимо именно это определяет трудность понимания кода.

  Ответить  
 
 автор: час   (26.10.2009 в 10:08)   личное сообщение
 
 

спасибо - читаю....
http://hiprog.com/index.php?option=com_content&task=view&id=301

  Ответить  
 
 автор: час   (26.10.2009 в 10:14)   личное сообщение
 
 

вот это не понятно -Set cl.Button = bt

  Ответить  
 
 автор: час   (26.10.2009 в 10:17)   личное сообщение
 
 

и вот это не понятно


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

  Ответить  
 
 автор: Serge Gavrilov   (26.10.2009 в 10:47)   личное сообщение
 
 

Непонятно, что непонятно.
Приведены процедуры для чтения и установки значения свойства OwnerForm в классе clsBT.

  Ответить  
 
 автор: час   (26.10.2009 в 12:29)   личное сообщение
 
 


Приведены процедуры для чтения и установки значения свойства OwnerForm в классе clsBT.



Но, простите у формы нет такого свойства... OwnerForm

  Ответить  
 
 автор: Serge Gavrilov   (26.10.2009 в 12:33)   личное сообщение
 
 

Это свойство класса clsBT

  Ответить  
 
 автор: Serge Gavrilov   (26.10.2009 в 10:44)   личное сообщение
 
 

Класс clsBT имеет свойство Button.
В этой строке этому свойству присваивается значение - добавленный на форму контрол CommandButton.
А так как переменная m_bt объявлена с использованием WithEvents, то процедура обработки события m_bt_Click будет срабатывать на нажатие кнопки.

  Ответить  
 
 автор: час   (26.10.2009 в 12:26)   личное сообщение
 
 


Класс clsBT имеет свойство Button



А как это определить - какие свойства имеются у класса
- кто и как их предопределил?

  Ответить  
 
 автор: час   (26.10.2009 в 12:38)   личное сообщение
 
 

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

  Ответить  
 
 автор: Serge Gavrilov   (26.10.2009 в 12:56)   личное сообщение
 
 

Set cl.OwnerForm = Me ' это как то свойство класса OwnerForm почемуто равно форме ???
Чтобы потом класс мог выполнить какие-либо действия с этой формой.
Set m_bt(i) = cl ' это очередная кнопка - становиться классом???
нет. Просто все созданные классы собираются в один массив. Чтобы потом с ними можно было что-то сделать, например уничтожить.

  Ответить  
 
 автор: час   (26.10.2009 в 14:20)   личное сообщение
 
 

АААААААААААААААААААААААААААААААААА - вот это ни ХР сбе.........

  Ответить  
 
 автор: Serge Gavrilov   (26.10.2009 в 12:45)   личное сообщение
 
 

Какие программисту нужны свойства класса, те он и создает.
Смотрим Help VBA Office 97:
Процедура Property представляет собой последовательность инструкций языка Visual Basic, которые позволяют программисту создавать собственные свойства и оперировать с ними.

· Процедуры Property создают допускающие только чтение свойства для форм, стандартных модулей и модулей класса.
· Процедуры Property следует использовать вместо переменных Public в программе, которая должна выполняться после задания значение свойства.
· В отличие от переменных Public процедуры Property могут иметь справочные строки, присвоенные им в окне Просмотр объектов.

Когда создается процедура Property, она становится свойством модуля, содержащего эту процедуру.
...

  Ответить  
 
 автор: час   (26.10.2009 в 14:23)   личное сообщение
 
 

Вон оно как ...
Property и переводтся как свойство..
угу.....

  Ответить  
 
 автор: час   (26.10.2009 в 16:44)   личное сообщение
 
 

Пока ясность не аступила

  Ответить  
 
 автор: Гоблин   (26.10.2009 в 20:42)   личное сообщение
 
 

Ясность... У меня, с выходом на форрум, 80% базы ХЗ как работает. И ничего. Даже собственные примеры, сделанные на время из спортивного интереса, расшифровать не могу. А тут всего 1 форма.

Не вдавайтесь в подробности. Программируйте, час, программируйте.

  Ответить  
 
 автор: час   (27.10.2009 в 09:52)   личное сообщение
 
 

Я так не МОГУ....
Мне нада тоба всё под контролем було.....
Меня изгложет непонятка, пока не проясниться....
мне нуна понимать чё я делаю - иначе какая -то каша , извините.. ...

  Ответить  
 
 автор: osmor   (27.10.2009 в 11:04)   личное сообщение
 
 

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

'внутренняя переменная соответствующая свойству 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, в остальных оно пустое.

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

  Ответить  
 
 автор: час   (27.10.2009 в 12:01)   личное сообщение
 
 

СПАСИБО - ИЗУЧАЮ....

  Ответить  
 
 автор: час   (27.10.2009 в 14:28)   личное сообщение
 
 

Бъюся башкой о простые слова
Кругом от кода идёт голова
Вроде простое имеем решенье
Что же меня оно вводит в смущенье

Да не в смущщенье ,
а прямо в тупик
Я как не знавший урок ученик
Руки вспотели и высох язык
В суть описалова -
я не проник

сделал пример - и его истязаю
суть WithEwents_a я изучаю
И заодно разбираюсь как в классе
Я о строении в модуле класса

  Ответить  
 
 автор: osmor   (27.10.2009 в 14:33)   личное сообщение
 
 

молодец!

  Ответить  
 
 автор: Гоблин   (27.10.2009 в 21:39)   личное сообщение
 
 

+5

  Ответить  
 
 автор: час   (29.10.2009 в 15:33)   личное сообщение
 
 

  Ответить  
HiProg.com - Технологии программирования
Rambler's Top100 TopList