Второй способ создания и обработки событий: AddHandler
Для иллюстрации этого способа дополним предыдущую задачу двумя компонентами. Первый. Пусть Господь наградил вас бдительной супругой, которая при вашей попытке потратить больше, чем имеете, выдает сообщение «Куда ты хочешь потратить наши последние деньги?!». Создадим для этого класс clsСупруга. Второй. Пусть в самом банке при наступлении такого прискорбного события на стол руководства банка ложится сообщение «Этот клиент ненадежен». Сообщение это будет порождать уже имеющийся класс clsСчет. Для краткости откажемся от сообщения в метке на форме. Вот код:
Форма:
Private Счет As New clsСчет
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Счет.Снятие_со_счета(Val(TextBox1.Text))
End Sub
Класс clsСчет:
Public Class clsСчет
Private Супруга As New clsСупруга
Private Сумма_на_счете As Decimal = 1000
Private Event Не_хватает_денег()
Public Sub New()
AddHandler
Не_хватает_денег, AddressOf Обработчик_в_банке
AddHandler
Не_хватает_денег, AddressOf Супруга.Обработчик_дома
End Sub
Public Sub Снятие_со_счета(ByVal Сумма_к_снятию As Decimal)
If Сумма_на_счете - Сумма_к_снятию >= 0 Then
Сумма_на_счете = Сумма_на_счете - Сумма_к_снятию
Else
RaiseEvent
Не_хватает_денег()
End If
End Sub
Private Sub Обработчик_в_банке()
MsgBox("Этот клиент ненадежен")
End Sub
End Class
Класс clsСупруга:
Public Class clsСупруга
Public Sub Обработчик_дома()
MsgBox("Куда ты хочешь потратить наши последние деньги?!")
End Sub
End Class
Пояснения: Здесь, как и при первом способе, программист сначала объявляет событие:
Private Event
Не_хватает_денег()
а затем вставляет во все нужные места программы оператор RaiseEvent.
Дальше начинаются различия. Мы объявили наше событие как Private. Это значит, мы не хотим, чтобы его обрабатывали все, кому не попало. Теперь не получится объявлять объект класса clsСчет словом WithEvents. Обработчиков для нашего события мы назначаем сами при помощи операторов AddHandler. Эти обработчики могут находиться как в clsСчет, так и в других классах. В других классах их приходится объявлять Public, так как иначе их нельзя будет упомянуть в операторе AddHandler.
Заключение. В этом разделе я дал только основные наметки работы с событиями. Более квалифицированная работа включает в себя освоение понятия делегата и другие премудрости.