Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Matrices con WithEvents en NET?

Iniciado por Hechelion, 27 de Octubre de 2010, 07:57:28 AM

« anterior - próximo »

Hechelion

Tengo el siguiente problema, tengo programada una clase para crear menús y botones y para determinar la función de cada objeto devuelvo los eventos de clic, dobleclic, etc.  Hasta acá va todo bien, pero quería mejor la clase creando jerarquías padre-hijo, de está forma si deshabilito un menú padre, automáticamente quedarían deshabilitado todos los menús o botones hijos por lo cual el padre tiene un procedimiento para crea objetos hijos  y agregarlos a la lista.

El problema es que NET no me permite definir una lista de objetos con withEventes (Es requisito para que el objeto pueda devolver un evento).

Código (vb) [Seleccionar]

   Dim WithEvents Child() As ClsVentana

Me marca error ("Las variables con WithEventes no se pueden escribir como matrices").

La  única solución que se me ocurre es eliminar la opción de crear objetos hijos, crear todos los menús como objetos diferentes en el programa principal y luego pasarlos como referencia a la lista, o sea, no crear hijos, si no, indicar cuales son hijos, pero  asumo que NET ¿debe tener alguna soluciones que permita tener listas de objetos con eventos o no?.

Vicente

No entiendo muy bien que quieres hacer la verdad, quieres tener un array, pero que el array exponga los eventos de los objetos que contiene???

Hechelion

Efectivamente es eso, tal como indica la linea de código que coloqué.

Lo que pasa es que si lograba crear un array o matriz de objetos con withevents, podía meter la generación de hijos dentro de la misma clase.

Actualmente tengo lo siguiente:

Código (vbnet) [Seleccionar]

Padre = new ClsVentana
hijo1 = new ClsVentana
hijo2 = new ClsVentana
....
Padre.Add_Hijo(hijo1)
Padre.Add_Hijo(hijo2)
....
....
Private sub hijo1_clic
  'Acción 1
end private

Private sub hijo1_clic
  'Acción 2
end private



como ves, tengo que crear los hijos en el mismo nivel que el padre y luego enlazarlo.
Lo que quería lograr, era que la administración (creación, inicio y destrucción) de los hijos, fuera dentro de la misma clase, de esa forma me quedaba con lo siguiente:



Padre = new ClsVentana
......
Padre.Nuevo_Hijo(Hijo1)
Padre.Nuevo_Hijo(Hijo2)
......
......
Private sub Padre_hijoClic(index as integer)

Select case index
     case 1: 'acción 1
     case 2: 'acción 2
end case



Vicente

Yo no sé mucho de VB.NET, pero parece que el WithEvents es simplemente para facilitar el asociar eventos:

http://msdn.microsoft.com/en-us/library/ms172877.aspx

Porque no asocias los manejadores de forma normal? (creo que es AddHandler). Así podrías declarar tu variable como un array y luego hacer:

array.Evento.AddHandler(...) o como se escriba en Visual Basic.

No te vale así? Un saludo!

Vicente

[EX3]

Cita de: Vicente en 27 de Octubre de 2010, 02:38:38 PM
Yo no sé mucho de VB.NET, pero parece que el WithEvents es simplemente para facilitar el asociar eventos.
WithEvents es la instruccion en Visual Basic 6.0 y anteriores para indicar en la declaracion de un objeto que este tiene eventos definidos y que los exponga en el ambito donde se declara la variable, y obviamente, estara en Visual Basic .NET por temas de retrocompatibilidad.

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

Vicente

Por lo que leo en la MSDN simplemente parece "syntax sugar": si la declaras con el WithEvents, puedes usar Handles para el manejador, pero si la declaras sin el WithEvents simplemente asignas los manejadores como se hace en .NET (+= en C#, creo que VB es AddHandler).

Supongo que lo han mantenido porque la gente de VB estaba acostumbrada sip...

Hechelion

Lo que pasa Vicente, es que yo vengo de VB6 (En realidad aún lo sigo usando) y ahí, tal como dice Ex3, el withevents no una forma, es LA forma de hacerlo, de ahí que usaba el mismo sistema en NET.

Por lo que he leído, ha cambiado bastante la estructura de los array de objetos y entre lo que me pasaste y buscando por los Handler creo que he conseguido lo que quiero, así que me pondré a mejorar la clase para poder generar cosas como una ventana de mensaje con botones "OK" y "Cancelar" como un único objeto (La gracia, es que ahora podré definir los menú mediante XML de forma dinámica en vez de tener que programarlos a mano en el código)

Código (Net) [Seleccionar]


Sub Main()
        Dim c1 As New Class1
        ' Associate an event handler with an event.
        AddHandler c1.AnEvent, AddressOf EventHandler1
End Sub

Sub EventHandler1(ByVal Index As Integer)
        ' Handle the event.
        MsgBox("EventHandler" & cstr(Index) & " caught event.")
    End Sub


Public Class Class1
       Public Indice as integer
        ' Declare an event.
        Public Event AnEvent(ByVal Index as Integer)
        Sub CauseTheEvent()
            ' Raise an event.
            RaiseEvent AnEvent( Indice)
        End Sub
End Class


.

Vicente

Ya que vienes de VB6, te recomiendo que mires algunas cosillas del tema en la MSDN, más que nada porque a pesar de que se puedan hacer las cosas a los VB 6 por facilitar la vida a la gente, es mejor hacerlas a lo .NET.

Usar y lanzar eventos:

http://msdn.microsoft.com/en-us/library/edzehd2t.aspx

Como diseñar eventos:

http://msdn.microsoft.com/en-us/library/ms229011.aspx

Un saludo!

Vicente

Hechelion

En su momento lo leí y lo aplique, pero ahora volví para releer algo que se me había olvidado y me dí cuenta que nuca te dí las gracias por los link. Igual un poco tarde pero gracias.







Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.