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

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

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



· Използване на Delegate като указател на функция - Function Pointer

Следният пример илюстрира използването на делегат в контекста на callback функция. Искаме да създадем генерална сортираща функция за сортиране на целочислени (integer) масиви. Функцията използва метода на мехурчето, но е генерална в смисъл, че един от нейните параметри е сравняваща функция, използвана за сравнение на съседни цели числа. Така чрез вариране на външна сравняваща функция, можем да сменим типа на сортирането (нарастващо, намаляващо, или друг метод) без да сменяме главната (main) сортираща функция. Сравняващата функция е callback function, в смисъл че осигуряваме да бъде извикана от главната сортираща функция. Първо, декларираме делегата. Като част от декларацията на делегата трябва да специфицираме сигнатурата на метода, асоцииран с делегата, който в нашия случай е сравняващата функция. Когато сравняващата функция вземе две (съседни) цели числа и върне True ако се нуждаем от разменяне на числата в алгоритъма по метода на мехурчето, само тогава декларираме делегата както следва:

' връща True ако е нужна размяна

Delegate Function Func_Sravnyava(ByVal x As Integer, ByVal y As Integer) As Boolean

Тук има два алтернативни целеви метода за делегата--един за нарастващо сортиране и един за намаляващо:

Function SortAscending(ByVal x As Integer, ByVal y As Integer) As Boolean

If y < x Then

SortAscending = True

End If

End Function

Function SortDescending(ByVal x As Integer, ByVal y As Integer) As Boolean

If y > x Then

SortDescending = True

End If

End Function



Сега можем да дефинираме сортиращата подпрограма. Забележете викането на метод Invoke на делегата:

Sub BubbleSort(ByVal CompareMethod As Func_Sravnyava, ByVal IntArray( ) As Integer)

Dim i, j, temp As Integer

For i = 0 To Ubound(IntArray)

For j = i + 1 To Ubound(IntArray)

If CompareMethod.Invoke(IntArray(i), IntArray(j)) Then

Temp = IntArray(j)

IntArray(j) = IntArray(i)

IntArray(i) = Temp

End If

Next j

Next i

End Sub



Тук има малко код за упражнение:

Protected Sub Button1_Click(ByVal sender As Object, _

ByVal e As System.EventArgs)

Dim i As Integer

Dim iArray() As Integer = New Integer( ) {6, 2, 4, 9}

BubbleSort(AddressOf SortAscending, iArray)

For i = 0 To 3

Debug.WriteLine(CStr(iArray(i)))

Next

BubbleSort(AddressOf SortDescending, iArray)

For i = 0 To 3

Debug.WriteLine(CStr(iArray(i)))

Next

End Sub

Изходът е: 2 4 6 9 9 6 4 2



- Събития и свързване на събития

Събитието (event) е акция, която се случва. Акцията може да е от страна на потребителя на апликацията (например, когато натисне команден бутон), от страна на кода на апликацията (например, когато е направена промяна в записа на множество от записи), или от страна на операционната система (например таймер събитие). Когато се случи събитие, казваме, че се вдига (raised), или запалва (fired). Всяко събитие има източник (source). Това е обекта върху който се извършва акцията, като бутона, който се щраква с мишката. Източникът е отговорен за актуализирането на Операционната Система, че се случило събитие. Това става с известяващо събитието съобщение, основно към родителския контейнерен прозорец. По тази причина, Microsoft смята източника на събитие за изпращач (sender). Събитието често има аргумент (event argument), обикновено данни, които принадлежат към събитието. Например натискането на клавиш от клавиатурата генерира събитие, което включва аргументи описващи кода на натиснатия клавиш и информация за състоянието на модифициращите клавиши (Shift, Alt, Ctrl).



Фигура 69 Изпълнение на програма DelegateFuncPointer за възходящо и низходящо сортиране - виж Output Debug.



Събитийните аргументи са част от съобщението изпратено от източника на събитието. Event handler е процедура (или метод) която се изпълнява като резултат на известието от събитието. Процесът на деклариране на event handler на събитието се нарича свързване (binding) на процедурата към събитието.


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

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


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