· Събития свързани с контролите (Control-Related Events)
Повечето контроли имат дълги редици от събития (built-in events) асоциирани с тях. Примерно контролът текстова кутия има събития асоциирани със
смяната на текст в текстовата кутия. VB IDE може да бъде използвана за вмъкване на празен event handler, заедно с характерните събитийни параметри, за всеки вграден (built-in) контрол. Процедурата е само за селектиране
на контрол, след това
щракнете на бутон Events в прозореца Properties. Показва се списък на вградените
(built-in) събития за контрола. Селектирането на едно от тези
събития, указва на VB IDE да вмъкне празен event handler за това събитие в прозореца на
редактора на кода (code editor window).
Забележете, че всеки контрол има събитие по подразбиране (default event). За команден бутон е Click. За бързо влизане (shortcut), можем да дадем на VB IDE да вмъква празен event handler за събитие по подразбиране (default)
просто при двукратно щракване върху контрола. Примерно двукратно щракване върху
команден бутон произвежда следния код:
Private Sub button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles button1.Click
End Sub
Изпращащата променлива е източника на събитието. Вторият параметър е обекта, чиито
свойства описват аргументите на събитието.
Примерно двукратно щракване върху Windows форма указва на VB IDE да вмъкне следния празен event handler:
Protected Sub
Form1_Click(ByVal sender As Object, ByVal e As System.EventArgs)
End Sub
· Ключова дума WithEvents
За да дефинираме потребителско събитие в клас модул, можем да използваме WithEvents ключова дума. Да създадем клас модула:
Public Class Class1
' деклариране на събитие - event
Public Event Subitie(ByVal
EventParam As Integer)
' метод за вдигане (raise) на събитието
Public Sub
RaiseTheEvent(ByVal iEventNumber As Integer)
RaiseEvent Subitie(iEventNumber)
End Sub
End Class
В клас модула с Windows form, декларираме променлива от тип Class1 използвайки ключова
дума WithEvents за да закачим клас събитията:
Public WithEvents ev As Class1
Този ред автоматично указва на VB IDE да прибави променлива с име ev към левия падащ списък над прозореца за кода. Когато селектираме тази
променлива, десния падащ списък показва събитията за
този клас. В този случай, списъка съдържа само събитие ev_Subitie. Селектирането на това събитие
поставя празен събитиен скелет в прозореца за кода (ние сме въвели един ред код вътре):
Public Sub ev_Subitie(ByVal
EventParam As System.Integer) _
Handles ev.Subitie
MsgBox("Event raised:
" & EventParam)
End Sub
Накрая, в събитието Click на бутона, можем да поставим код за
изпълнение на нашия прост пример:
Protected Sub
Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles
Button1.Click
' дефиниране на нова инстанция на класа Class1
ev = New Class1( )
' вдигане (Raise) на събитието (event)
ev.RaiseTheEvent(7)
End Sub
Недостатък на ключова дума WithEvents
е, че не можем да
използваме ключова дума New така:
Public WithEvents ev As New
Class1
Така че обектът трябва да бъде инстанциран отделно от
декларацията на променливата.
· Инструкция AddHandler
Инструкция AddHandler може да бъде използвана за свързване на event handler с вградено или потребителско
събитие, използвайки код. Това прави възможно да свържем няколко манипулатори
на събитие (event handlers) към едно събитие. За илюстрация, добавете събитиен манипулатор по подразбиране (default event handler) за събитието Click на формата:
Protected Sub
Form1_Click(ByVal sender As Object, ByVal e As _
System.EventArgs)
msgbox("Default Click
Event")
End Sub
След това добавете друга процедура със същата сигнатура като default event handler:
Protected Sub
Frm1Click(ByVal sender As Object, ByVal e As _
System.EventArgs)
msgbox("Custom Click
Event")
End Sub
Накрая, за да свържем функция Frm1Click със събитие Click, използваме инструкция AddHandler:
AddHandler Form1.Click,
AddressOf Me.Frm1Click
Това е съкратения запис на:
AddHandler Form1.Click, New
EventHandler(AddressOf Me.Frm1Click)
Генерално, инструкция AddHandler има следния синтаксис:
AddHandler NameOfEventSender, AddressOf NameOfEventHandler
- Примери
Следващия пример форма и клас демонстрира използването на
делегати: Следващият код е използван да построи формата; кодът на конструктора на формата
се изтрива за пестене на място. Формата има два бутона: Един за команда BLUE и един за команда RED. Натискането им визуализира
диалогов прозорец за съобщения с blue или red.
Първо да хвърлим поглед на клас delegatedemo:
Public Class delegatedemo
Delegate Function ColorValue(ByVal sMessage As String) As String
Public Function showcolor(ByVal clr As ColorValue, ByVal sMessage As
String) As String
' извикване - invoke
return(clr.Invoke(sMessage))
End Function
End Class
В класа delegatedemo, делегатът (delegate) ColorValue е деклариран и след това използван от функция ShowColor. В
този клас, делегатът ColorValue се извиква и връща съобщение от съответната функция, или redMessage или blueMessage, в зависимост от това чий адрес се
подава.
Делегатът действа като указател (pointer) към функцията. Той е multicast delegate, защото може да сочи функция redMessage или blueMessage.
След това да погледнем формата, която използва класа delegatedemo.
1 Imports
System.ComponentModelww.syngress.com
Imports System.Drawing
Imports System.WinForms
Public Class testform
Inherits
System.WinForms.Form
2 Protected Sub
cmdBlue_Click(ByVal sender As Object, ByVal e
As System.EventArgs)
3 Dim delMess As New
delegatedemo()
4 Dim sMessage As String
5
delmess.showcolor(AddressOf blueMessage, "Hello World B ")
6 msgbox(sMessage)
7 End Sub
8 Protected Sub cmdRed_Click(ByVal
sender As Object, ByVal e
As System.EventArgs)
9 Dim delMess As New
delegatedemo()
10 Dim sMessage As String
11
delmess.showcolor(AddressOf redMessage, "Hello World R")
12 msgbox(sMessage)
13 End Sub
14 Private Function
redMessage(ByVal sSmessage As String) As
String
' тази функция връща sSmessage и 'red'.
15 return "RED "
& sSmessage
16 End Function
17 Private Function
blueMessage(ByVal sSmessage As String) As
String
' тази
функция връща sSmessage и 'blue'.
18 return "Blue " &
sSmessage
19 End Function
20 End Class
Този клас форма консумира класа delegatedemo. Базирано
върху щракване на бутона, делегата в клас delegatedemo се извиква и ще
вдигне или функция redMessage или функция blueMessage, в
зависимост от стойността подадена с ключова дума AddressOf . AddressOf
връща адреса на виканата подпрограма. С кодовия фрагмент:
delmess.showcolor(AddressOf
redMessage, "Hello World R")
AddressOf redMessage инструктира Visual Basic да върне адреса на redMessage така че да можем да го използваме
в подпрограмата. Това е необходимо за коректното използване на
делегати.
Събитието на бутона започва от ред 2.Това събитие инстанцира класа delegatedemo и след това вика метод showcolor (ред 5) вътре в класа delegatedemo. Адреса на функция blueMessage се подава в delegate така че той може да извика функцията. Стрингът съобщение също се подава
в него. Върнатата
стойност се визуализира в прозореца за съобщения (message box). За да използваме delegate, трябва да изпълним неговия викащ
метод. Той указва на делегата да се вдигне. другото събитие на бутона.
Функцията redMessage е подобна.