Foros del Web » Programación para mayores de 30 ;) » .NET »

Uso de AddHandler

Estas en el tema de Uso de AddHandler en el foro de .NET en Foros del Web. Amigo Buenos Dias: Estoy intentando pasar como argumento el nombre de una sub que tengo en unos formularios para poder enlazarla a algunos eventos de ...
  #1 (permalink)  
Antiguo 19/07/2011, 14:19
 
Fecha de Ingreso: enero-2008
Mensajes: 16
Antigüedad: 16 años, 2 meses
Puntos: 0
Uso de AddHandler

Amigo Buenos Dias:

Estoy intentando pasar como argumento el nombre de una sub que tengo en unos formularios para poder enlazarla a algunos eventos de los controles que estan dentro de los formularios de forma centralizada.

para explicarme mejor:

1. Formulario 1: Boton 1
Boton 2
Boton 3
Sub Click_Buttons

2. Formulario 2: Boton1
Boton2
Sub Click_botones

3. Libreria de clases: Sub UnirEventos(nombreformulario,nombresub)

Con la Sub UnirEventos deseo recorrer los controles de los formularios y el nombre de la sub que debo unir a algunos eventos de los controles usando el famoso AddHandler.

Lo he intentado de muchas formas (todas imaginadas por mi) y no he podido saber como hacer esto.

Alguien Me Puede Ayudar?

Gracias
  #2 (permalink)  
Antiguo 19/07/2011, 14:24
Avatar de HaverRamirez  
Fecha de Ingreso: junio-2011
Ubicación: Guatemala
Mensajes: 273
Antigüedad: 12 años, 9 meses
Puntos: 33
Respuesta: Uso de AddHandler

La verdad no entendi un caray...mira mi chavo, creo que la idea general si, si quieres manejar varios eventos por un solo manejador, entran en juego las sobrecargas y los delegados, para manejar mas de un evento puedes declara un delegado que maneje dos delegados mas...es algo complicadon, ahora si solo quieres recorrer y adjuntar, lo que tienes que hacer es una clase generica que haga la de unir eventos, porque como te digo no muy te entiendo...
  #3 (permalink)  
Antiguo 19/07/2011, 14:29
 
Fecha de Ingreso: enero-2008
Mensajes: 16
Antigüedad: 16 años, 2 meses
Puntos: 0
Respuesta: Uso de AddHandler

Gracias Haver:

A ver si puedo explicarlo mejor.

Necesito unir un metodo a un evento de un control mediante Addhandler, pero desde una libreria de clases donde ni el metodo ni el control estan en la misma libreria estan en un formulario que esta en otra libreria.

Mi idea es centralizar todo en una libreria de clases de forma que pueda llamar esta rutina y ella se encargue de enlazar los respectivos controles con los respectivos metodos.

Ahora si... o peor

Muchas Gracias
  #4 (permalink)  
Antiguo 19/07/2011, 14:32
Avatar de HaverRamirez  
Fecha de Ingreso: junio-2011
Ubicación: Guatemala
Mensajes: 273
Antigüedad: 12 años, 9 meses
Puntos: 33
Respuesta: Uso de AddHandler

Bueno entonces dentro de tu dll, tienes que pasar el boton como parametro, ya se como object, cosa que no te recomiendo por el boxing, simplente manda un boton como parametro

public sub AmarraEventosControl(Byval Ctrl as Control)

addhandler ctype(ctrl,button).Click, addressof EventoClick()

end sub

es algo asi o no?

mm cero que ya medio entendi, has de cuentas que lo que quieres es como por ejemplo que todos los textbox del form cambien de color en el focus, lo que puedes hacer es crear un formulario padre que herede a sus hijos los evetos en el load
algo asi

si creas este formulario y le pones este codigo, todos los forms que hereden de el tendran amarrados estos eventos a el

Código vb:
Ver original
  1. Imports System.ComponentModel
  2. Imports System.Drawing
  3. Imports System.Windows.Forms
  4.  
  5. Public Class FormEntradaDatosBase
  6.  
  7.     Private m_ColorEnfoqueFrente As Color
  8.     Private m_ColorEnfoqueFondo As Color
  9.  
  10.     <Description("El color del frente de los controles.")> _
  11.     <Category("Aspecto")> _
  12.     Public Property ColorEnfoqueFrente() As Color
  13.         Get
  14.             Return m_ColorEnfoqueFrente
  15.         End Get
  16.         Set(ByVal Valor As Color)
  17.             m_ColorEnfoqueFrente = Valor
  18.         End Set
  19.     End Property
  20.  
  21.  
  22.     <Description("El color de fondo de los controles.")> _
  23.     <Category("Aspecto")> _
  24.     Public Property ColorEnfoqueFondo() As Color
  25.         Get
  26.             Return m_ColorEnfoqueFondo
  27.         End Get
  28.         Set(ByVal Value As Color)
  29.             m_ColorEnfoqueFondo = Value
  30.         End Set
  31.     End Property
  32.  
  33.     Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)
  34.         MyBase.OnLoad(e)
  35.         ' Registra eventos para controles de entrada.
  36.        For Each ctrl As Control In ObténControlesSecundarios(Me)
  37.             If ctrl.BackColor.Equals(SystemColors.Window) Then
  38.                 AddHandler ctrl.Enter, AddressOf Control_Enter
  39.                 AddHandler ctrl.Leave, AddressOf Control_Leave
  40.             End If
  41.         Next
  42.     End Sub
  43.  
  44.     ' Almacenamiento temporal para los colores del control
  45.    Private guardaColorFrente As Color = SystemColors.WindowText
  46.     Private guardaColorFondo As Color = SystemColors.Window
  47.  
  48.     ' Cambia los colores cuando el control obtiene el enfoque.
  49.    Private Sub Control_Enter(ByVal sender As Object, ByVal e As EventArgs)
  50.         Dim ctrl As Control = DirectCast(sender, Control)
  51.         ctrl.ForeColor = ColorEnfoqueFrente
  52.         ctrl.BackColor = ColorEnfoqueFondo
  53.     End Sub
  54.  
  55.     ' Restaura los colores originales cuando el control pierde en enfoque.
  56.    Private Sub Control_Leave(ByVal sender As Object, ByVal e As EventArgs)
  57.         Dim ctrl As Control = DirectCast(sender, Control)
  58.         ctrl.ForeColor = guardaColorFrente
  59.         ctrl.BackColor = guardaColorFondo
  60.     End Sub
  61.  
  62.     ' Devuelve la lista de todos los controles contenidos en otro control.
  63.    Private Function ObténControlesSecundarios(ByVal parent As Control) As ArrayList
  64.         Dim resultado As New ArrayList()
  65.         For Each ctrl As Control In parent.Controls
  66.             ' Agregue este control al resultado.
  67.            resultado.Add(ctrl)
  68.             ' Llama recursivamente a este método para agregar también todos los controles secundarios.
  69.            resultado.AddRange(ObténControlesSecundarios(ctrl))
  70.         Next
  71.         Return resultado
  72.     End Function
  73.  
  74.     ' Eventos públicos
  75.    Public Event ApActivada As EventHandler
  76.     Public Event ApDesactivada As EventHandler
  77.  
  78.     Protected Overrides Sub WndProc(ByRef m As Message)
  79.         Const WM_ACTIVATEAPP As Integer = &H1C
  80.         ' Permite que el formulario base procese este mensaje
  81.        MyBase.WndProc(m)
  82.         ' Procesa sólo el mensaje WM_ACTIVATEAPP.
  83.        If m.Msg = WM_ACTIVATEAPP Then
  84.             If m.WParam.ToInt32 <> 0 Then
  85.                 AlActivarAp(EventArgs.Empty)
  86.             Else
  87.                 AlDesactivarAp(EventArgs.Empty)
  88.             End If
  89.         End If
  90.     End Sub
  91.  
  92.     ' Los métodos protegidos Onxxxx que general el evento
  93.    Protected Sub AlActivarAp(ByVal e As EventArgs)
  94.         RaiseEvent ApActivada(Me, e)
  95.     End Sub
  96.  
  97.     Protected Sub AlDesactivarAp(ByVal e As EventArgs)
  98.         RaiseEvent ApDesactivada(Me, e)
  99.     End Sub
  100.  
  101. End Class
  #5 (permalink)  
Antiguo 19/07/2011, 14:41
 
Fecha de Ingreso: enero-2008
Mensajes: 16
Antigüedad: 16 años, 2 meses
Puntos: 0
Respuesta: Uso de AddHandler

Gracias por responder Haver:

Lo que deseo es lo que me indicaste en el sub pero deseo pasar tambien como parametro el evento, algo así:

public sub AmarraEventosControl(Byval Ctrl as Control, EventoClick)
addhandler ctype(ctrl,button).Click, addressof EventoClick()
end sub


Pero no se como pasar ese eventoClick si byval o byref y menos de qué tipo

Muchas Gracias
  #6 (permalink)  
Antiguo 19/07/2011, 14:52
Avatar de HaverRamirez  
Fecha de Ingreso: junio-2011
Ubicación: Guatemala
Mensajes: 273
Antigüedad: 12 años, 9 meses
Puntos: 33
Respuesta: Uso de AddHandler

Se puede, se tiene que hacer con delgados, pero tienes que tener bien claro los conceptos, los que a mi realmente me costaron el entender...ejemplos

http://dotnetref.blogspot.com/2007/07/passing-function-by-reference-in-vbnet.html
http://www.vb-helper.com/howto_net_plot_equation_with_delegate.html

Etiquetas: addhandler
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:46.