ПОНЯТНО О Visual Basic NET (том 3)

       

Второй способ создания и обработки событий: 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.

Заключение. В этом разделе я дал только основные наметки работы с событиями. Более квалифицированная работа включает в себя освоение понятия делегата и другие премудрости.



Содержание раздела