Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
VBA For Excel Часть 02.doc
Скачиваний:
2
Добавлен:
01.05.2025
Размер:
1.08 Mб
Скачать

Создание событий пользовательского класса

В примере ниже нами приведен текст модуля класса. Экземпляр класса создается внутри модуля формы. Форма должна содержать на себе три объекта TexBox1,TextBox2, TextBox3(см. рис.26).

Рис. 26 Форма экземпляра класса

Через событие NoNuber объекта Events1 запрещается вводить не цифры в объекты TexBox1,TextBox2, и запрещается вводить точку (.) в объект TexBox1. Символы в TexBox3 вводятся без ограничения.

'Модуль класса Events

Option Explicit

'Объявляем событие класса

Public Event NoNuber(ByVal IndexObjec As Long, DelSimbol As String)

'Объявляем переменную для разрешения запуска события

Private EventsFormComponent As Boolean

'Объявляем переменную, указатель на пользовательскую форму

Private Form As UserForm

Private Sub FormComponent()

Dim IComponent As Variant, s As String, s1 As String, i As Long

Do While EventsFormComponent = True

'Прерываем работу подпрограммы события

DoEvents

'Опрашиваем все компоненты на форме указателе

For IComponent = 0 To Form.Controls.Count - 1

'Если компонент TextBox

If TypeName(Form.Controls(IComponent)) = "TextBox" Then

'Берем текст на объекте

s = Form.Controls(IComponent).Text

s1 = ""

i = Len(s)

'Удаляем не цифру, и вторую точку текста

While s <> ""

If Mid(s, 1, 1) >= "0" And Mid(s, 1, 1) <= "9" _

Or Mid(s, 1, 1) = "." And (InStr(s1, ".") = 0 Or s1 = "") Then

s1 = s1 + Mid(s, 1, 1)

End If

s = Mid(s, 2)

Wend

'Если текст содержал не цифру, или содержал точку

'запускаем событие

If Len(s1) <> i Or InStr(s1, ".") <> 0 Then

'Запускаем событие NoNuber

RaiseEvent NoNuber(IComponent, s1)

End If

End If

Next IComponent

Loop

End Sub

Public Property Set StartEvents(ByRef FormObject As UserForm)

'Устанавливаем указатель на пользовательскую форму

Set Form = FormObject

'Запускаем событие

EventsFormComponent = True

FormComponent

End Property

Public Sub StopEvents()

'Запрещаем выполнения события

EventsFormComponent = False

End Sub

'Модуль формы

'Объявляем переменную класса содержащего события

Private WithEvents Events1 As Events

Private Sub Events1_NoNuber(ByVal IndexObjec As Long, DelSimbol As String)

Dim s As String, Name As String

Name = Me.Controls(IndexObjec).Name

s = DelSimbol

If Name = "TextBox1" Then

'Удаляем точку

If InStr(s, ".") <> 0 Then

s = Mid(s, 1, InStr(s, ".") - 1)

End If

'Удаляем не цифру и точку в объекте TextBox1

Me.Controls(IndexObjec).Text = s

ElseIf Name = "TextBox2" Then

'Удаляем не цифру в объекте TextBox2

Me.Controls(IndexObjec).Text = s

End If

End Sub

Private Sub UserForm_Activate()

'Инициализируем класс

Set Events1 = New Events

'Запускаем событиe класса

Set Events1.StartEvents = Me

End Sub

Private Sub UserForm_Initialize()

'Очищаем текстовые редакторы

TextBox1.Text = ""

TextBox2.Text = ""

TextBox3.Text = ""

End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)

'Останавливаем событие класса и снимаем указатель

Events1.StopEvents

Set Events1 = Nothing

'Выгружаем форму

Unload Me

End Sub

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]