Помогни ни да направим Uroci.net по - богат! Добави урок

Делегати и събития

bubust   трудност:    видян: 9777



· Събития свързани с контролите (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 е подобна.


Страници: «1 2 3

Регистрирайте се, за да добавите коментар


Калдейта ЕООД - © 2003-2010. Всички права запазени.
Препоръчваме: IT Новини