Все вместе
А теперь давайте объединим все сказанное на практическом примере. Создайте консольное приложение и включите следующий фрагмент в первый (стартовый) модуль:
Module Modulel
Private WithEvents anEmployee As EmployeeWithEvents
Sub Main()
Dim tom As New EmployeeWithEvents("Tom". 100000)
anEmployee = tom
Console.WriteLine(tom.TheName & "has salary " & tom.Salary)
anEmployee.RaiseSalary(0.2D) ' Суффикс D - признак типа Decimal
Console.WriteLinettom.TheName & "still has salary " & tom.Salary)
Console.WritelineC'Please press the Enter key")
Console.ReadLine() End Sub End Module
Рис. 6.2. Автоматически сгенерированный код обработчика события
Теперь выберите в раскрывающемся списке метод anEmployee_SalarySecurityEvent. Исходный текст этого метода приведен ниже (для удобства чтения он разбит на несколько строк, а ключевая секция Handles выделена жирным шрифтом):
Public Sub anEmployee_SalarySecur1tyEvent(ByVal Sender As
Event_Handling_I.EmployeeWithEvents, ByValeAs System.EventArgs) Handles
anEmployee.SalarySecurityEverrt
End Sub
End Module
Обратите внимание на символ подчеркивания, добавленный VB .NET между именем переменной с ключевым словом WithEvents (anEmployee) и именем события (SalarySecurityEvent), — с ним обработчик внешне почти не отличается от процедур событий в VB6.
Также обратите внимание на идентификацию объекта Sender полным именем (в формате пространство_имен. имя_класса). Наличие дополнительных символов подчеркивания в пространстве имен объясняется тем, что пробелы в них не разрешены, поэтому VB .NET автоматически преобразует имя решения «Event Handling 1» в «Event_Handling_l» (рис. 6.3). Наконец, ключевое слово Handles сообщает исполнительной среде, какое событие обрабатывается этой процедурой.
Рис. 6.3. Окно свойств решения с обработкой событий
Чтобы пример стал более интересным, вместо простого вывода в консольное окно 'мы включим в процедуру события команду вызова диалогового окна:
Public Sub anEmployee_SalarySecurityEvent(ByVal Sender As
Event_Handling_I.EmployeeWithEvents. ByVal e As System.EventArgs)
Handles anEmployee.SalarySecurityEvent
MsgBox(Sender.TheName &" had an improper salary raise attempted!")
End Sub
От приемника событий мы переходим к источнику. В класс Employee из главы 4 необходимо внести два изменения, выделенные в следующем листинге жирным шрифтом:
Public Class EmployeeWithEvents
Private m_Name As String
Private m_Salary As Decimal
Private Const LIMIT As Decimal =0.1D
Public Event SalarySecurityEventCByVal Sender As
EmployeeWithEvents,ByVal e As EventArgs)
Public Sub NewCByVal
aName As String. ByVal curSalary As Decimal)
m_Name = aName
m_Salary = curSalary
End Sub Readonly Property TheName() As String
Get
Return m_Name
End Get
End Property Readonly Property Salary() As Decimal s,
Get
Return m_Salary
End Get ' '
End Property
Public Overloads Sub RaiseSalary(ByVal Percent As Decimal)
If Percent > LIMIT'Then
'Операция запрещена - необходим пароль
RaiseEvent SalarySecurityEventtMe, New System.EventArgs())
Else
m_Sa1ary = (1 + Percent) * m_Salary
End If
End Sub
Public Overloads Sub RaiseSalary(ByVal Percent As Decimal.
ByVal Password As String)
If Password = "special" Then
m_Salary = (1 + Percent) * m_Salary
End If
End Sub
End Class
Первый выделенный фрагмент объявляет событие, а второй инициирует его при попытке недопустимого повышения зарплаты.
Примерный результат запуска программы показан на рис. 6.4. При нажатии кнопки ОК окно сообщения исчезает, и в консольном окне выводится строка, из которой видно, что зарплата Тома не изменилась.
Рис. 6.4. Окно сообщения, вызываемое при обработке события