Visual Basic 2010 Express: событие, процедура, метод

Материал из УссуриВики
Перейти к: навигация, поиск
Автор Надежда Кузнецова

Все объекты в языке Visual Basic имеют собственные свойства, методы и события. Это относится и к формам, и к элементам управления.


Событие

Событие – действие, инициированное пользователем или операционной системой. Примерами событий могут служить: нажатие клавиши, щелчок мыши, истечение определённого интервала времени, получение данных из порта и т.д

События в классах, структурах, модулях и интерфейсах объявляются с помощью ключевого слова Event, как показано в следующем примере.

VB
 Event  AnEvent( ByVal  EventNumber  As Integer  )

Событие похоже на сообщение о том, что случилось что-то важное. Рассылка сообщения называется созданием события. В Visual Basic события вызываются с помощью инструкции RaiseEvent, как в следующем примере:

VB
 RaiseEvent  AnEvent(EventNumber)

События должны вызываться в рамках класса, модуля или структуры, где они объявлены. Например, производный класс не может вызывать события, унаследованные из базового класса.

Любой объект, способный вызывать события, является отправителем событий, также называемым источником событий. Формы, элементы управления и пользовательские объекты являются примерами отправителей событий.

Обработчики событий – это процедуры, вызываемые при возникновении соответствующего события. Можно использовать любые допустимые подпрограммы с соответствующей сигнатурой в качестве обработчика событий. Функция, тем не менее, не может быть использована в качестве обработчика событий, так как возвращение значения в источник события с ее помощью невозможно.

В Visual Basic используется стандартное положение об именовании обработчиков событий. Имя должно состоять из имени отправителя события, знака подчеркивания и имени события. Например, событие Click кнопки с именем button1 будет иметь имя Sub button1_Click. Примечание

Рекомендуется следовать положению об именовании при определении обработчиков событий для пользовательских событий, но это необязательно, можно использовать любое допустимое имя подпрограммы.

Для того, чтобы обработчик событий был готов к использованию, его необходимо связать с событием посредством оператора Handles или AddHandler. Инструкция WithEvents и условие Handles предоставляют декларативный способ задания обработчиков событий. Событие, инициированное объектом, который объявлен с помощью ключевого словаWithEvents, могут обрабатываться любой процедурой с оператором Handles для данного события, как показано в следующем примере:

VB
 ' Объявите переменную WithEvents. 
  Dim WithEvents  EClass  As New  EventClass
 ' Вызов метода, который генерирует события объекта. 
  Sub  TestEvents()
   EClass.RaiseEvents()
 End Sub 
  ' Объявите обработчик события, который обрабатывает несколько событий 
 Sub  EClass_EventHandler()  Handles    EClass.XEvent, EClass.YEvent
   MsgBox("Received Event.")
 End Sub  
 Class   EventClass
    Public Event  XEvent()
    Public Event   YEvent()
    'RaiseEvents обращается к обоим событиям 
    Sub   RaiseEvents()
       RaiseEvent   XEvent()
        RaiseEvent  YEvent()
   End Sub  
 End Class 

Применение оператора WithEvents и предложения Handles часто является лучшим вариантом для обработчиков событий, поскольку используемый ими декларативный синтаксис делает обработку события проще для кодирования, чтения и отладки. Однако при использовании переменных WithEvents необходимо помнить о следующих ограничениях:

  • Нельзя использовать переменную WithEvents как объектную переменную. То есть ее невозможно объявить как Object – при объявлении переменной необходимо указать имя класса.
  • Поскольку общие события не связываются с экземплярами класса, нельзя использовать WithEvents для декларативной обработки общих событий. Нельзя также использовать WithEvents илиHandles для обработки событий из Structure. В обоих случаях для обработки этих событий можно использовать оператор AddHandler.
  • Невозможно создать массивы переменных WithEvents.

Переменные WithEvents позволяют одному обработчику событий обрабатывать один или несколько видов событий или нескольким обработчикам событий обрабатывать один вид событий. Хотя условие Handles является стандартным способом связывания события с обработчиком, связь посредством него может осуществляться только во время компиляции.

В некоторых случаях, например, когда события связаны с формами или элементами управления, Visual Basic автоматически задействует пустой обработчик событий и сопоставляет его с событием.Например, при двойном щелчке мышью командной кнопки на форме в режиме разработки Visual Basic создает пустой обработчик событий и переменную WithEvents для командной кнопки, как в следующем коде:

VB
 Friend WithEvents    Button1  As  System.Windows.Forms.Button
 Protected Sub   Button1_Click()  Handles   Button1.Click
 End Sub 

Оператор AddHandler аналогичен условию Handles в том, что оба позволяют задавать обработчик события. Однако AddHandler, использованный с RemoveHandler, обеспечивает большую гибкость, чем условие Handles,и позволяет динамически добавлять, удалять и изменять обработчик событий, связанный с событием. Если необходимо обработать общие события или события из структуры, следует использовать AddHandler.

AddHandler принимает два аргумента: имя события от отправителя событий, например элемента управления, и выражение, определяющее делегат. Не требуется явного определения класса делегата при использовании AddHandler, так как оператор AddressOf всегда возвращает ссылку на делегат. В следующем примере обработчик событий связывается с событием, вызванным объектом.

VB
 AddHandler   Obj.XEvent,  AddressOf   Me.XEventHandler

RemoveHandler , отсоединяет событие от обработчика событий, используя при этом тот же синтаксис, что и AddHandler. Например:

VB
 RemoveHandler   Obj.XEvent,  AddressOf   Me.XEventHandler

В следующем примере обработчик событий связывается с событием, событие происходит. Обработчик событий перехватывает событие и выводит сообщение. Затем первый обработчик событий удаляется и с событием сопоставляется другой обработчик событий. Когда событие происходит во второй раз, выводится другое сообщение. Наконец, второй обработчик событий удаляется, а событие происходит в третий раз. Поскольку теперь нет связанного с событием обработчика событий, ничего не происходит.

VB
 Module  Module1
    Sub   Main()
       Dim    c1   As New   Class1
       'Свяжите обработчик событий с событием  
        AddHandler   c1.AnEvent,  AddressOf    EventHandler1
       ' Вызвать метод наступившего событие.   
       c1.CauseTheEvent()
        ' Остановить обработку события.   
        RemoveHandler   c1.AnEvent,  AddressOf   EventHandler1
       ' Теперь связать другой обработчик события с событием.    
        AddHandler   c1.AnEvent,   AddressOf     EventHandler2
        ' Вызвать метод наступившего события  
       c1.CauseTheEvent()
        ' Остановить обработку события. 
        RemoveHandler   c1.AnEvent,  AddressOf   EventHandler2
        ' Это событие не будет обработано  
       c1.CauseTheEvent()
    End Sub  
     Sub    EventHandler1()
        ' Обрабатывать событие.  
       MsgBox("EventHandler1 caught event.")
    End Sub 
    Sub   EventHandler2()
        ' Обрабатывать событие. 
       MsgBox("EventHandler2 caught event.")
   End Sub 
    Public Class  Class1
        ' Объявите событие.  
        Public Event   AnEvent()
        Sub    CauseTheEvent()
             ' Обратитесь к событию  
            RaiseEvent   AnEvent()
       End Sub   
    End Class  
 End Module  

Процедура

Процедура – это некий блок кода, который будет выполняться всякий раз при вызове этой процедуры. Каждая процедура начинается зарезервированным словом Sub и заканчивается End. Вот общий синтаксис процедуры:

[Private | Public | Friend] [Static] Sub name [(arglist)] 
   [здесь некий код]
   [Exit Sub]
   [здесь тоже может быть некий код]
End Sub

Всё, что заключено в квадратные скобки – является необязательным. Оператор Exit Sub позволяет досрочно выйти из процедуры. Иногда это очень удобно. Слова Public, Private имеют то же значение, что и при объявлении переменных.

arglist имеет следующий вид:

[Optional] [ByVal | ByRef] [ParamArray] varname[( )] 
[As type] [= defaultvalue]

Рассмотрим пример процедуры, которая будет выводить на экран сообщение "Hello World!":

Private Sub ShowMessage()
   MsgBox "Hello World!"
End Sub

Что можно сказать об этой процедуре? Процедура имеет тип Private, т.е. доступна будет только из кода именно той формы (модуля), где она объявлена (вспомните типы объявления переменных). Данная процедура не содержит параметров, о чём нам говорят пустые круглые скобки.. Назначение – вывести сообщение Hello World на экран. MsgBox – это встроенная функция Visual Basic, которая выводит на экран окно с сообщением, заданным в качестве параметра. Остальные параметры необязательны (их всего 5).

Подробнее о функции MsgBox можно прочитать здесь.

Как вызвать процедуру? Для этого достаточно написать имя процедуры:

ShowMessage

А можно и так:

Call ShowMessage' более наглядные вариант

Оба этих варианта абсолютно эквивалентны. Но для вызова процедур всё-таки лучше использовать второй вариант.

Теперь давайте изменим эту процедуру и добавим к ней параметр, значение которого будет выводиться функцией MsgBox (вместо Hello World):

Private Sub ShowMessage(message As String)
   MsgBox message
End Sub

Теперь при вызове процедуры необходимо указать параметр:

Call ShowMessage ("Наша первая процедура")

Результатом выполнения такой процедуры будет вывод на экран сообщения: "Наша первая процедура". Скобки, окружаемые параметр обязательны, если перед именем процедуры стоит оператор Call. Если Call отсутствует, то скобки ставить не нужно.

Давайте рассмотрим подробнее что же происходит при вызове нашей процедуры. Встретив строку с вызовом нашей процедуры Visual Basic проверяет, нужны ли данной процедуре параметры. Убедившись в том, что нужны (параметр message) он передает в процедуру строку "Наша первая процедура". Т.е. фактически в процедуре происходит присвоение переменной message значения "Наша первая процедура". Ну а далее происходит вызов функции MsgBox и вывод сообщения на экран. Если количество параметров, передаваемых при вызове процедуры не совпадёт с количеством параметров в объявлении процедуры – Visual Basic сгенерирует ошибку.

Метод

Метод – программный код, включённый в описание объекта и определяющий то, как объект работает с информацией и реагирует на заданные события. Например, форма имеет методы, которые показывают и скрывают форму.

Методы и свойства разделяются в значительной степени условно. К примеру, Move – это метод, который изменяет позицию объекта. Но есть и некоторые свойства (Top, Left), выполняющие аналогичные действия. Главное же различие между свойствами и методами заключается в том, что свойствами.можно оперировать как во время разработки проекта, так и во время выполнения приложения, тогда как методы доступны только во втором случае. Нужно учитывать и то, что некоторые свойства могут быть также недоступны при разработке приложения, а во время его работы доступны только для чтения.

Язык Visual Basic 2010 поддерживает перегрузку функций, т. е. позволяет создавать функции с одинаковым именем, но с разными параметрами. Точнее, перегрузка функции ведется по ее сигнатуре, т. е. по типу параметров.

Таким образом, можно объявить несколько функций с одинаковым именем, но разными параметрами.

Visual Basic 2010 позволяет передавать параметры по ссылке и по значению. При этом следует иметь в виду, что передача объектов фактически означает передачу ссылки на них, поэтому вызываемая функция будет иметь доступ к объекту.

Visual Basic 2010 позволяет объявлять параметры методов по умолчанию.

Пример объявления методов:

Class MyClass1 
   ' Закрытый (Private) метод класса   
 Shared Function Func1(ByVal par As String) As String 
 End Function 
  ' Открытый метод с параметром по умолчанию   
 Public Sub Sub2(ByVal par As Object, Optional ByVal p As Int16 = 0) 
 End Sub 
   ' Перегруженная версия метода с другим типом параметра    
 Public Sub Sub2(ByVal par As String) 
 End Sub 
End Class

Список источников