Иллюстрированный самоучитель по VB.NET

       

Все вместе


А теперь давайте объединим все сказанное на практическом примере. Создайте консольное приложение и включите следующий фрагмент в первый (стартовый) модуль:

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. При нажатии кнопки ОК окно сообщения исчезает, и в консольном окне выводится строка, из которой видно, что зарплата Тома не изменилась.

Переменные WithEvents потребляют системные ресурсы. Как только такая перемен-ная становится ненужной, присвойте ей Nothing.



Рис. 6.4. Окно сообщения, вызываемое при обработке события


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