Все вместе
Чтобы пример стал более интересным, вместо простого вывода в консольное окно мы включим в процедуру события команду вызова диалогового окна:
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. При нажатии кнопки ОК окно сообщения исчезает, и в консольном окне выводится строка, из которой видно, что зарплата Тома не изменилась.
Примечание
Переменные WithEvents потребляют системные ресурсы. Как только такая перемен-ная становится ненужной, присвойте ей Nothing.
Рис. 6.4. Окно сообщения, вызываемое при обработке события