RSS

Archivos Mensuales: julio 2011

Hacer una Relación de Tablas

 
Deja un comentario

Publicado por en julio 30, 2011 en Sin categoría

 

Formulario de Contactos en PHP

 
1 comentario

Publicado por en julio 30, 2011 en Sin categoría

 

Etiquetas:

Delegates en Visual Basic .NET

En Visual Basic. NET viaje, tiene más probabilidades de encontrar un fenómeno muy utilizado, pero poco entendido, llama a un delegado. Los usa todos los días, pero puede que no lo saben. En este artículo vamos a echar un vistazo a lo que un delegado es y cómo se le ayudará para desarrollar mejor software.

Un delegado puede ser definido como un puntero a función con seguridad de tipos. Que encapsula la dirección de memoria de una función en el código. Cada vez que cree o utilice un evento en el código, que está utilizando un delegado. Cuando el evento se lanza, el marco examina el delegado detrás del evento y luego llama a la función que el delegado apunta. Como veremos más adelante, los delegados se pueden combinar para formar grupos de funciones que pueden ser convocados.

Primero vamos a echar un vistazo rápido a cómo definir y llamar a un delegado.

En primer lugar, declaramos nuestro delegado en la clase de la forma:

 

Lista 1

 

Private Delegate Sub MyDelSub()

 

Luego usamos el delegado simplemente declarando una variable de delegado y la asignación de los sub o función a ejecutar cuando se le llama. En primer lugar los sub que se llama:

 

Listado 2

 

Private Sub WriteToDebug()

Debug.WriteLine(«Delegate Wrote To DebugWindow»)

End Sub

 

Usted se dará cuenta también de que coincide con nuestra declaración de MyDelSub, es una subrutina sin parámetros.

Y luego nuestro código de prueba:

 

Listado 3

 

Dim del As MyDelSub

del = New MyDelSub(AddressOf WriteToDebug)

del.Invoke()

 

Cuando se invoca el delegado, el sub WriteToDebug se ejecuta. Visual esconde el más básico de la aplicación de los delegados al utilizar los eventos, que están basados ​​en la invocación de un delegado. Esto es el equivalente del delegado por encima de invocar también.

 

Listado 4

 

Private Event MyEvent() ‘se declara en la clase

‘Para usarlo, agregar un controlador y provocar el evento.

 

AddHandler MyEvent, AddressOf WriteToDebug

RaiseEvent MyEvent()

 

Si los delegados se detuvo en este punto, que sería inútil ya que los eventos son menos trabajo y hacer lo mismo. Vayamos a algunas de las características más avanzadas de los delegados. Vamos a empezar con los delegados de multidifusión.

Delegados de multidifusión le permiten encadenar varias funciones o submarinos que están llamados todos juntos cuando se invoca al delegado. Para la iteración actual del marco, no puede designar el orden en que las funciones se ejecutan, sólo que son todos corren, uno tras otro. Veamos el código para el delegado de multidifusión.

 

En primer lugar se añade un nuevo sub para nuestro segundo delegado.

 

Listado 5

 

Private Sub WriteToDebug2()

Debug.WriteLine(«Delegate Wrote To DebugWindow 2»)

End Sub

 

Nuestra declaración de la MySubDelegate sigue siendo el mismo, y aquí está nuestro código nuevo uso.

 

Listado 6

 

Dim del As MyDelSub

Dim del2 As MyDelSub

Dim delAll As [Delegate]

del = New MyDelSub(AddressOf WriteToDebug)

del2 = New MyDelSub(AddressOf WriteToDebug2)

delAll = MulticastDelegate.Combine(del, del2)

delAll.DynamicInvoke(Nothing)

 

A medida que examinemos este código podemos ver tres variables delegado, dos de nuestros delegados normal que llame a nuestro submarinos y un combinado de los otros dos delegados. Hemos creado nuestros delegados normales como siempre, uno de los puntos WriteToDebug y el otro a WriteTodebug2. Cuando se combinan los dos delegados en nuestra tercera, utilizamos la función estática Combine de la clase MulticastDelegate. Cuenta con dos sobrecargas, que combina dos delegados como antes y que toma una matriz de delegados. A continuación se invoca a todos los delegados con la propiedad DynamicInvoke los delegados combinados, pasando por Nada para su parámetro. Podríamos también han pasado en un conjunto de objetos que serían utilizados para los parámetros de los submarinos se invoca.

Si usted echa un vistazo a la declaración de la última muestra, aparece otro gran beneficio de los delegados. Tenga en cuenta que tanto del punto de del2 y funciones diferentes, pero son del mismo tipo, MyDelSub. Esto abre un montón de posibilidades de programación. Que le permite apuntar una variable MyDelSub a cualquier sub que tiene la misma firma que sí. En nuestro caso, se trata de un sub simple sin parámetros. Este comportamiento le permite programar de manera más genérica. A continuación vamos a examinar este comportamiento genérico en detalle. Funciona bien en ambos lados de la ecuación, ya sea invocando un delegado de su clase en el interior o recibir un delegado de fuera de su clase para trabajar en.

Usted ya está familiarizado con el concepto de tener una clase de invocar un delegado que se origina en su interior. Cada vez que manejar un evento de un control que se están poniendo un delegado que se ha invocado desde el interior del control. Sólo recuerde que cuando usted se registra una función a través de los mangos o AddHandler, le está diciendo a un delegado en algún lugar para asegurarse de que llama a su función cuando se la invoca. Si usted tiene múltiples funciones que tienen asas para el mismo evento, usted está usando un delegado de multidifusión.

Echemos un vistazo a algunas de personalización con los delegados. Puede crear clases que permiten a los usuarios a los delegados de entrada de determinadas rutinas. Las clases tienen una lista de delegados para llamar durante horas específicas. Esto puede ser usado para agregar comportamientos diferentes a los de su clase, tales como las rutinas de clasificación diferentes. Esta es una versión más moderna y un poco diferente del patrón de diseño visitantes como se describe en el libro de GOF. Más información sobre el patrón de diseño visitantes pueden encontrar aquí.

 

Implementar el patrón de diseño visitantes

 

Para empezar nuestro ejemplo, tomar una clase simple que representa un perro. Es muy simple, con sólo un método y una definición de nuestro delegado.

 

Listado 7

 

Clase pública Bulldog

Public Delegate Sub BarkMethod ()

Public Sub DoBark (ByVal BarksToRun AsBarkMethod)

BarksToRun.DynamicInvoke (Nada)

End Sub

 

El subdelegado BarkMethod es lo que vamos a utilizar para crear variables. El sub DoBark toma una instancia del delegado para ejecutar.

Ahora para nuestro código de prueba.

 

Listado 8

 

Dim bk1 As Bulldog.BarkMethod

Dim bk2 As Bulldog.BarkMethod

Dim MyDog As Bulldog

MyDog = New Bulldog

bk1 = New Bulldog.BarkMethod(AddressOf Bark1)

bk2 = New Bulldog.BarkMethod(AddressOf Bark2)

MyDog.DoBark(bk1)

MyDog.DoBark(bk2)

 

Creamos dos variables delegado de la Bulldog.BarkBethod tipo. A continuación, asignar a cada variable en un sub en nuestro código de prueba, lo que vemos aquí:

 

Listado 9

 

Private Sub Bark1()

Debug.WriteLine(“Woof Woof”)

End Sub

Private Sub Bark2()

Debug.WriteLine(“Yip Yip”)

End Sub

 

Los submarinos, simplemente escribir en la ventana de depuración. A medida que creamos y el uso de nuestro objeto de perro, decidimos que queremos hacer el ladrido de un perro mediante el uso de Bark1 y luego mediante el uso de Bark2. Simplemente pasar el delegado correcto al objeto de perro que llama la subs externos para hacer el trabajo. Como puede ver, este modelo hace que la expansión es muy fácil. Si decidimos hacer hablar al perro, entonces sólo tiene que añadir una variable de delegado que señala a un sub que devuelve “Hola”.

El siguiente paso sería la necesidad de tener varios delegados de la función, en lugar del singular o BK1 BK2. Para facilitar esto se puede cambiar la clase de perro que contiene agregar y quitar subs. Estos controlan un delegado interno de lo que ladra a correr. Aquí está nuestra clase nuevo perro:

 

Listado 10

 

Clase pública Bulldog Public Class Bulldog

Private _Barks As [Delegate]

Public Delegate Sub BarkMethod()

Public Sub DoBark()

If Not IsNothing(_Barks) Then ‘check to see ifthere is anthing to Invoke

_Barks.DynamicInvoke(Nothing)

End If

End Sub

Public Sub AddBark(ByVal Bark As BarkMethod)

_Barks = MulticastDelegate.Combine(_Barks, Bark)

End Sub

Public Sub RemoveBark(ByVal Bark As BarkMethod)

_Barks = MulticastDelegate.Remove(_Barks, Bark)

End Sub

End Class

 

Se puede ver que hemos añadido una propiedad privada, _Barks, para realizar un seguimiento de nuestros delegados a la llamada. Nuestra AddBark y subs RemoveBark utilizar las funciones estáticas del MulticastDelegate para añadir y eliminar el delegado. Estas funciones también pueden ser fácilmente sobrecargados para tomar una serie de BarkMethods en lugar de casos individuales.

Aquí está nuestro código de prueba.

 

Listado 11

 

Dim bk1 As Bulldog.BarkMethod

Dim bk2 As Bulldog.BarkMethod

Dim MyDog As Bulldog

MyDog = New Bulldog

bk1 = New Bulldog.BarkMethod(AddressOf Bark1)

bk2 = New Bulldog.BarkMethod(AddressOf Bark2)

MyDog.AddBark(bk1)

MyDog.AddBark(bk2)

MyDog.DoBark()

MyDog.RemoveBark(bk2)

MyDog.DoBark()

 

Nuestra Bark1 y Bark2 subs no ha cambiado, así que no les haya mostrado. En el código de prueba, creamos nuestra normal de dos delegados, y luego, con nuestros nuevos métodos, añadirlos a nuestra clase de perro. Después de hacer el ladrido de un perro, se elimina la variable BK2 del perro y ladrar de nuevo. El resultado es el siguiente:

 

Woof Woof

 Yip Yip

 Woof Woof

 

Los delegados también se puede utilizar como devoluciones de llamada. Devoluciones de llamada se utiliza en muchas llamadas a la API de Windows. Se pasa en un puntero de función a la llamada a la API. Cuando la llamada a la API se haya terminado con su trabajo, entonces se “vuelve a llamar” a la función a través del puntero a función que pasó. Esto permite que el código para saber cuando la llamada a la API que se hace.

El marco proporciona una forma fácil de usar un delegado con una API que necesita una devolución de llamada. Puede definir y pasar un delegado como puntero de función nativa de varias maneras. Aquí hay dos. En primer lugar, declaramos nuestro delegado y la llamada a la API que queremos hacer.

 

Listado 12

 

Public Delegate Function MyDelegateCallBack( _

ByVal hwnd As Integer, ByVal lParam As Integer) As Boolean

Declare Function EnumWindows Lib “user32″(ByVal x As MyDelegateCallBack, ByVal y As Integer) As Integer

 

A continuación, definir la función que queremos ser llamados por la llamada EnumWindows API, ya que se encuentra Windows.

 

Listado 13

 

Public Function EnumOutput(ByVal hwnd As Integer,ByVal lParam As Integer) As Boolean

Console.WriteLine(hwnd)

Return True

End Function

 

Y, por último, nuestro código de prueba que realiza la llamada a EnumWindow.

 

Listado 14

 

Dim del As MyDelegateCallBack

del = New MyDelegateCallBack(AddressOf EnumOutput)

EnumWindows(del, 0)

 

Declaramos nuestra variable de delegado y luego pasarlo a EnumWindows, al que llama cada vez que encuentra una nueva ventana. El código de prueba también se puede escribir así:

 

Listado 15

 

EnumWindows(AddressOf EnumOutput, 0)

 

La forma más breve crea un delegado para que usted y se lo pasa a EnumWindows.

Para pasar varios delegados a las devoluciones de llamada es igual de fácil. No se puede usar la forma corta del delegado CallBack como se mostró anteriormente, ya que es necesario combinar los delegados. En este ejemplo la definición de EnumWindows cambios junto con nuestro código de prueba. Aquí está el ejemplo completo.

 

Listado 16

 

Public Delegate Function MyDelegateCallBack( _

ByValhwnd As Integer, ByVal lParam As Integer) As Boolean

Declare FunctionEnumWindows Lib “user32″ (ByVal x As [Delegate], ByVal y As Integer)As Integer

 

Private Sub btnButton1_Click( ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnButton1.Click

Dim del As MyDelegateCallBack

Dim del2 As MyDelegateCallBack

del = New MyDelegateCallBack(AddressOf EnumOutput)

del2 = New MyDelegateCallBack(AddressOfEnumOutput2)

Dim delAll As [Delegate]

delall = MulticastDelegate.Combine(del, del2)

EnumWindows(delAll, 0)

End Sub

 

Public Function EnumOutput(ByVal hwnd As Integer,ByVal lParam As Integer) As Boolean

Console.WriteLine(hwnd)

Return True

End Function

 

Public Function EnumOutput2(ByVal hwnd As Integer,ByVal lParam As Integer) As Boolean

Console.WriteLine(“Found HWND”)

Return True

End Function

 

Te darás cuenta de que usamos un delegado genérico para el primer parámetro de EnumWindows. Esto es necesario porque queremos pasar un delegado de multidifusión a ella. Añadimos una nueva función llamada EnumOutput2 con la misma firma que EnumOutput y crear otro delegado que señala a la misma. Después de la creación de nuestro delegado de multidifusión, Borr tds, lo usamos para pasar a EnumWindows. El resultado muestra que ambas funciones se llama para cada ventana de encontrar. Tenga cuidado al hacer esto. Desde EnumWindows toma un delegado genérico, que son responsables de la transmisión de funciones con la firma correcta que se espera.

Ahora que sabemos cómo CallBack funciona, vamos a echar un vistazo a cómo poner en práctica uno de los nuestros y lo llaman de forma asíncrona. Como siempre, empezamos por definir un delegado.

 

Listado 17

 

Public Delegate Sub MyAsyncDelegate()

 

A continuación vamos a mostrar nuestro código de prueba y las funciones de delegado de reunir y analizar los

Listado 18

 

 

 

Private Sub MyWorker()

System.Threading.Thread.Sleep(2000)

Debug.WriteLine(“MyWorker Done!”)

End Sub

Private Sub ImDone(ByVal ar As System.IAsyncResult)

Debug.WriteLine(“AsyncDelegate is done”)

End Sub

Private Sub btnButton1_Click( _

ByVal sender As System.Object, ByVal e As System.EventArgs) _

Handles btnButton1.Click

Dim del As MyAsyncDelegate

del = New MyAsyncDelegate(AddressOf MyWorker)

Dim cb As AsyncCallback = NewAsyncCallback(AddressOf ImDone)

Dim oState As Object

Dim ar As IAsyncResult = del.BeginInvoke(cb,oState)

Debug.WriteLine(“After DelegateBeginInvoke”)

End Sub

 

Si nos fijamos en las dos funciones de delegado, se verá que la función MyWorker es el objetivo de nuestra MyAsyncDelegate normal. La otra función, ImDone, toma un parámetro de un System.IAsyncResult. Esta es la firma que usted necesita para la AsyncCallback clase.

Un delegado de AsyncCallback le permite llamar a una función de forma asíncrona. Se toma un parámetro de los resultados. En nuestro código de prueba, verá que hemos creado una variable llamada “CB” para nuestros AsyncCallback. Este es el delegado que será llamado cuando nuestra función es hacer.

A continuación se declara una variable, ar, del tipo IAsyncResult y establezca su valor en el método BeginInvoke nuestro delegado normal. Este método toma un delegado de devolución de llamada y un objeto que representa su estado. Esta llamada devuelve inmediatamente. El marco hace todo el trabajo de hacer la llamada a MyWorker en otro hilo para usted.

Cuando MyWorker acabados, tenemos nuestra salida de sub asíncrono de AsyncDelegate Hecho. Si usted examina toda la producción, se verá que el regreso llamada asincrónica de inmediato, los acabados

 

After Delegate BeginInvoke

MyWorker Done!

AsyncDelegate is done

 

En nuestro ejemplo, hemos hecho todo el trabajo a nivel local detrás de un formulario, pero fácilmente se podría definir un método que se llevó a un delegado para una devolución de llamada. En lugar de definir la variable de delegado a nivel local, deberá utilizar el pasado como una como la de destino del objeto AsyncCallback. Después de configurar, que llaman el delegado interno para hacer el trabajo y el retorno de procesamiento para la sub llamada. Como su delegado trabajado, llama a la AsyncCallback siempre que usted decida para notificar al cliente.

Esperemos que este artículo le ayudará a entender cómo los delegados y de Visual Basic. NET utiliza. Cuando se aplica correctamente, puede hacer que su programación muy genérico y capaz de manejar muchas situaciones diferentes. Buena suerte y la codificación feliz!

Autor: John Spano

Fuente: http://aspalliance.com/articleViewer.aspx?aId=814&pId=-1

Traducido: Alejandro E. Alba Hernández

 

 
Deja un comentario

Publicado por en julio 18, 2011 en Programación

 

Etiquetas: , , , ,