Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

delegados en vb .net

520 views
Skip to first unread message

Racsus

unread,
Oct 30, 2003, 12:49:12 PM10/30/03
to
hola

necesito informacion y definición de lo que es un delegado
en .net

ejemplos de código si puede ser tb.

gracias

Emilio Perez

unread,
Oct 30, 2003, 2:01:16 PM10/30/03
to
Del libro Programación en Visual Basic .NET, de Luis Miguel Blanco (EIDOS). Un saludo,

Emilio Pérez Egido
La Robla - León - España
http://www.miliuco.com

______________________________________________________

Un delegado es un objeto al que otros objetos ceden (delegan) la ejecución de su código. También se conocen como punteros a función con seguridad de tipos. Al instanciar un delegado, se asocia con un método de instancia o compartido de un objeto, y posteriormente, durante la ejecución, será el delegado el que se encargue de ejecutar dicho método y no el propio objeto. También se pueden asociar los delegados con procedimientos Sub o Function de módulos.
Para declarar un delegado, debemos utilizar la palabra clave Delegate, seguida del tipo de método (Sub o Function) al que posteriormente deberemos asociar el delegado; y finalmente, el nombre del delegado con la lista de parámetros y valor de retorno si es necesario. El lugar de declaración debe ser la zona de declaraciones de la clase o módulo:

' delegado sin parámetro
Public Delegate Sub VerMensaje()

' delegado con parametros
Public Delegate Sub Aviso(ByVal lsTexto As String)

' delegado de tipo function
Public Delegate Function Obtener(ByVal ldtFecha As Date) As String

Creación de delegados: en un procedimiento, declaramos una variable correspondiente al tipo del delegado. A continuación, conectamos el delegado con el procedimiento que posteriormente deberá ejecutar, empleando la palabra clave AddressOf, seguida del nombre del procedimiento. AddressOf devuelve el puntero o dirección de entrada al procedimiento, que será lo que utilice el delegado para saber la ubicación del procedimiento que debe ejecutar. Por último, para ejecutar el procedimiento al que apunta el delegado, llamaremos a su método Invoke( ):

Module Module1
Public Delegate Sub VerMensaje()

' Modo 1 -----------------------------
Sub Main()
' declarar un delegado
Dim loDelegTexto As VerMensaje

' obtener la dirección del procedimiento a ejecutar
' y asignarla al delegado
loDelegTexto = AddressOf MostrarTexto

' ejecutar el procedimiento a través del delegado
loDelegTexto.Invoke()
End Sub

' Modo 2 -----------------------------
Sub Main()
' declarar el delegado y asociar con una dirección
' o puntero a un procedimiento
Dim loDelegTexto As New VerMensaje(AddressOf MostrarTexto)
loDelegTexto.Invoke()
End Sub

' ***********************************************
' este será el procedimiento invocado (ejecutado)
' por el delegado
Public Sub MostrarTexto()
Console.WriteLine("Hola, esto es una prueba con delegados")
End Sub
End Module

______________________________________________________


"Racsus" escribió: "...necesito información y definición de lo que es un delegado en .net, ejemplos de código si puede ser tb..."

SqlRanger

unread,
Oct 30, 2003, 4:31:29 PM10/30/03
to
Je je, no sé para quien hablará Luis Miguel Blanco, pero te puedo asegurar que no he entendido su explicación, decir  "Un delegado es un objeto al que otros objetos ceden (delegan) la ejecución de su código." no dice absolutamente nada ¿qué significa ceder la ejecución del código? y decir "También se conocen como punteros a función con seguridad de tipos" para alguien que no ha programado con C o  C++ tampoco dice nada ¿qué es un puntero a función?.
 
Quizá tampoco yo no sea el más indicado para dar la explicación más clara de lo que es un delegado, pero voy a intentar aclarar el concepto. Esta sería mi definición de delegado:
 
Un delegado es una variable que hace referencia a un método, mediante dicha variable podemos invocar al método que referencia.
 
Como todo en .NET son objetos, un delegado también lo es, ¿pero de qué tipo? pues si a lo que hace referencia es a un método, en realidad deberíamos definir "tipos o clases de métodos". ¿Cómo definir clases de métodos? pues diciendo su firma.por ejemplo, un método que devuelve un entero y tiene como parámetro un String. Así definiríamos este tipo de delegado:
 
Public Delegate Function MiDelegado( Param As String) As Integer
 
Con esto hemos definido un tipo de delegado o si lo preferimos un tipo o clase de método: aquellos métodos que tienen un parámetro de tipo string y devuelven un entero.
 
Esta función por ejemplo, coincidiría con el patrón o tipo:
 
Public Function MiFuncion( s As String ) As Integer
...
End Function
 
 
 
¿Como creamos una instancia de esta clase?, o si lo preferimos, ¿como creamos un objeto delegado de este tipo?. Pues fácil:
 
Dim MiDel As New MiDelegado( AddressOf MiFuncion )
 
¿Cómo invocamos al método por medio del objeto delegado?. Fácil, como si fuera el propio método:
 
Dim Resultado As Integer = MiDel( "UnaCadena")
 
En el tema de delegados a veces, confundimos un objeto delegado con un tipo o clase delegado. Esto es así porque la mayoría de las veces omitimos las palabra objeto y clase.
 
En el código:
 
Dim MiDel As New MiDelegado( AddressOf MiFuncion )
 
MiDel es un objeto delegado. Una variable que hace referencia al método MiFuncion, y mediante el cual podemos invocar al método MiFuncion a la cual hace referencia.
 
MiDelegado es sin embargo el tipo o clase de delegado. Todos los objetos de esta clase deben ser objetos delegados que hagan refererencia a funciones que devuelvan un entero y tengan una cadena como parámetro, como MiFuncion
 
Si decimos que MiDel es un delegado y decimos que MiDelegado es un delegado. ¿Dónde está la diferencia entre objeto y clase ? Por eso yo recomiendo que se diga "objeto delegado" y "tipo o clase de delegado"

--

Saludos:
 
Jesús López
MVP Microsoft .NET
 
"No darás tropezón ni desatino que no te haga adelantar camino"

Racsus

unread,
Oct 31, 2003, 4:01:58 AM10/31/03
to
Hola

muchas gracias a jesus de antemano por su detallada
explicacion. Bien, teniendo en cuenta dicha teoria, como
aplicariamos esto al siguiente ejemplo:

Tengo una libreria botonera incrustada en un formulario.
Mediante un parametro creado en la libreria le paso el
nombre del formulario que contiene a la libreria.


Con esta información como hago para que cuando pulse un
boton se abra un formulario del proyecto que contiene a la
libreria?

gracias
>-----Mensaje original-----

>....

SqlRanger

unread,
Oct 31, 2003, 5:19:48 AM10/31/03
to
La verdad es que no entiendo bien tu pregunta. ¿Podrías explicarte de otra
manera que pueda entenderlo?

--


Saludos:

Jesús López
MVP Microsoft .NET

MCP SQL Server


anon...@discussions.microsoft.com

unread,
Oct 31, 2003, 5:52:21 AM10/31/03
to
Vamos a ver

he creado una libreria con varios botones. Dentro de esta
libreria he creado varias propiedades, una para decirle a
a la libreria en que formulario esta incrustada y el resto
para decirle a cada boton que funcion tiene que hacer.

en la mayoría de los casos lo que tiene que hacer el botón
es abrir otro formulario del proyecto(ej: nuevo,
modificar,...). Para ello le tendré que pasar el nombre
del formulario que quiero que abra; aqui esta el problema,
una vez se el nombre del formulario que ha de abrir, que
codigo utilizo para abrirlo? no me sirve el codigo:

Dim oform as new <nombre_formulario>
oform.show

no me sirve, ya que el formulario no pertenece a la
libreria. no se si me he explicado bien, sabrias ayudarme?

muchas gracias
>-----Mensaje original-----

>.
>

SqlRanger

unread,
Oct 31, 2003, 9:01:43 AM10/31/03
to
Habría muchas formas de hacer eso:
 
(1) El control de usuario (la botonera) podría lanzar un evento informando del botón que se ha pulsado y actuar en consecuencia
 
(2) El control de usuario podría tener una propiedad del tipo de un interfaz donde se definieran las acciones a realizar cuando se pulsa un botón
 
(3) El control podría tener una propiedad que fuera de tipo delegado y que se invocara el método referenciado por el delegado al hacer click en un botón
 
(4) El control podría tener una propiedad que indicara el tipo de formulario a crear. Esta quizá es la más exótica, se utilizaría reflection para instanciar el formulario:
 
 
    Public Property TipoFormulario() As Type
        Get
            Return mTipoFormulario
        End Get
   
        Set(ByVal Value As Type)
            ' Comprobamos que el tipo es un formulario o una clase derivada
            If Not Value.IsSubclassOf(GetType(Form)) Then
                Throw New ArgumentException(Value.ToString() & " no es un formulario")
            End If
            mTipoFormulario = Value
        End Set
    End Property
   
 
' Al pulsar el botón abrimos el formulario
    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        AbrirFormulario()
    End Sub
 
    Sub AbrirFormulario()
        Dim frm As Form
        frm = Activator.CreateInstance(TipoFormulario)
        frm.Show()
    End Sub
 
 
Paa signar la propiedad harímos algo así:
 
    ControlUsuario.TipoFormulario = GetType( Form2 )
 
 
 

--

Saludos:
 
Jesús López
MVP Microsoft .NET
 
"No darás tropezón ni desatino que no te haga adelantar camino"
 
 

Mike MS

unread,
Oct 31, 2003, 3:00:51 PM10/31/03
to
Mil disculpas por mi intromisión a esta charla. Me permito enviarles un ejemplo de esto de los delegados como solución al problema de abrir formularios (los delegados sirven para muchas otras cosas más como lo comentaron ya).
 
El ejemplo utiliza un proyecto windows que incorpora un control que contiene un boton.
Cuando damos click al boton, se abre un formulario contenida en la aplicación windows. Cualquier comentario es bienvenido. De igual forma si es necesario puedo enviarles los dos proyectos fuente.
 
 
Saludos!!!!
 
 
 
Este es el código en el control:
 
Public Class MisBotones
    Inherits System.Windows.Forms.UserControl
'Aqui va el código generado por el diseñador
'Windows Form Designer generated code 
 
 
'Aqui va mi código
 
   'Defino la declaración del procedimiento que abrira un formulario.
   'El procedimeinto al que le delegue yo la tarea de abrir formularios 
   'y que debe estar declarado en la clase que llame a este control, 
   'deberá tener los mismos argumentos

   Delegate Sub delAbreFormulario(ByVal NombreFormulario As String)
 
   'La clase que use esta clase, debera poner aqui la dirección
   'del procedimiento delegado
   Public direccionAbreFormulario As delAbreFormulario
 
    'Propiedad para poner el nombre del formulario a abrir
    Public NombreDelFormulario As String
    'Cuando le demos click al boton abrira el formulario correspondiente
    'del cual tengo su nombre
    Private Sub btnAbre_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)  Handles btnAbre.Click
        'Transfiere el control del código a la dirección del
        ' procedimiento delegado
        direccionAbreFormulario.Invoke(NombreDelFormulario)
    End Sub
End Class
 
 
Código del proyecto windows
 
   'este es el procedimiento al que le delego la tarea de abrir formularios
   Sub MiSubAbreformulario(ByVal nombre As String)
        MessageBox.Show("aqui val el codigo para abrir un formulario:" & nombre)
        Dim f As New Form2
        f.Show()
    End Sub
 
    Private Sub FrmPadre_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'Configuro propiedades del control. Formulario a abrir
        MisBotones1.NombreDelFormulario = "Form2"
        'Le doy la dirección del procedimiento que debe ejecutarse 
        MisBotones1.direccionAbreFormulario = AddressOf MiSubAbreformulario
 
    End Sub
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0 new messages