CONTROLADORES DE EVENTOS CONTROLADORES DE EVENTOS .............................................................................. 1 1. Compartir controladores de eventos ........................................................................................ 1 2. Recorrer controles en iteración ........................................................................................... 1 3. Agregar controles en tiempo de ejecución.............................................................................. 1 4. Compartir controladores deeventos.................................................................................... 2 5. Recorrer controles en iteración ........................................................................................... 2 6. Agregar controles en tiempo de ejecución.............................................................................. 3 7. Ejemplos....................................................................................................................... 4 Aunque ya no se admiten matrices de control en Visual Basic 2008, mediante el modelo de evento puede duplicar y expandir más allá de la funcionalidad de matrices de control. Diferencias conceptuales En Visual Basic 2008, ya no se admiten las matrices de control. Los cambios en el modelo de evento hacen que las matrices de control sean innecesarias y .NET Framework proporciona las mismas funciones para trabajar con controles.
1. Compartir controladores de eventos Visual Basic 2008 permite a cualquier controlador de eventos controlar los eventos de varios controles, incluso los controles con nombres diferentes y de tipos distintos. Por ejemplo, es posible que quiera agregar dos controles Button (Button1 y Button2) y un control CheckBox (CheckBox1) a un formulario y, a continuación, crear un controlador de eventos a fin de controlar el evento Click para los tres controles.
Private Sub MixedControls.Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click, Button2.Click, CheckBox1.Click
2. Recorrer controles en iteración En Visual Basic 2008 se pueden seguir recorriendo en iteración los controles de un formulario o contenedor mediante ControlCollection de la clase Control. En Visual Basic 2008, la colección Controls sólo devuelve controles que se encuentran en un único contenedor. Debe recorrer en iteración los controles de cada control de contenedor por separado; esto se puede hacer mediante una función recursiva.
3. Agregar controles en tiempo de ejecución En Visual Basic 2008, los controles se agregan en tiempo de ejecución mediante la palabra clave New de una instrucción Dim y, a continuación, se utiliza el método Add para el contenedor al que desea agregar el control.
Ramón Mateos Mondéjar/ Lola Cano Gil
1
En Visual Basic 2008, debe definir los controladores de eventos para los controles que se agregan en tiempo de ejecución. Esto se realiza mediante la instrucción AddHandler.
4. Compartir controladores de eventos El ejemplo siguiente muestra cómo se comparte el controlador de eventos Change (TextChanged en Visual Basic 2008) en un grupo de tres controles TextBox. En Visual Basic 2008, la cláusula Handles del controlador de eventos especifica qué control controlará el evento. El controlador de eventos devuelve un Object genérico, por lo que se debe convertir en el tipo de objeto específico (en este caso, TextBox) que desea controlar mediante el método DirectCast. Se utiliza la palabra clave DirectCast de la misma manera que se utiliza la palabra clave CType (Función) y TryCast. Se proporciona una expresión como primer argumento y un tipo para convertir como segundo argumento.
' Visual Basic 2008 Private Sub TextBoxes_TextChanged(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles TextBox1.TextChanged, _ TextBox2.TextChanged, TextBox3.TextChanged Select Case DirectCast(sender, TextBox).Name Case TextBox1.Name MsgBox("The text in the first TextBox has changed") Case TextBox2.Name MsgBox("The text in the second TextBox has changed") Case TextBox3.Name MsgBox("The text in the third TextBox has changed") End Select End Sub
Nota El comportamiento de eventos es ligeramente diferente en Visual Basic 2008. El evento TextChanged se produce cuando se inicializa un control (por ejemplo, en el evento Form_Load) así como cuando se cambia texto en tiempo de ejecución. En Visual Basic 6.0, el evento Change sólo se producía cuando se cambiaba texto.
5. Recorrer controles en iteración En Visual Basic 2008, un objeto Control se pasa como un argumento; tiene una colección ControlCollection que incluye todos los controles que se encuentran en ese control. El operador Typeof se utiliza para determinar si cada control es de tipo TextBox.
Nota Un objeto Form es de tipo Control; también puede pasar un
Ramón Mateos Mondéjar/ Lola Cano Gil
2
objeto Form como un argumento. Como no se incluyen controles anidados en la colección ControlCollection, el método HasChildren se utiliza para determinar si un control contiene otros controles, en ese caso, se llama a la función ClearText de forma recursiva.
' Visual Basic 2008 Private Sub ClearText(ByVal container As Control) Dim ctrl As Control For Each ctrl In container.Controls If TypeOf (ctrl) Is TextBox Then ctrl.Text = "" End If If ctrl.HasChildren Then ClearText(ctrl) End If Next End Sub
6. Agregar controles en tiempo de ejecución El ejemplo siguiente muestra cómo se agrega un control de cuadro de texto a un formulario en tiempo de ejecución. En Visual Basic 2008, el control se agrega a la colección ControlCollection. En Visual Basic 2008, debe enlazar el control de eventos mediante la instrucción AddHandler. Se supone que se agrega un control de cuadro de texto a un formulario en tiempo de ejecución ,en el ejemplo de Visual Basic 2008 se supone que existe un controlador de eventos denominado TextChangedHandler para el primer control TextBox.
' Visual Basic 2008 ' Declare a new TextBox. Dim TextBox2 As New TextBox ' Set the location below the first TextBox TextBox2.Left = TextBox1.Left TextBox2.Top = TextBox1.Top + 30 ' Add the TextBox to the form's Controls collection. Me.Controls.Add(TextBox2) AddHandler TextBox2.TextChanged, AddressOf TextChangedHandler Notas de actualización Cuando una aplicación creada con Visual Basic 6.0 se actualiza a Visual Basic 2008, cualquier matriz de control se actualiza a las clases de matrices de controles específicas del control especial. Estas clases están contenidas en el espacio de nombres Microsoft.VisualBasic.Compatibility.VB6 y las utilizan las herramientas de actualización para emular el comportamiento de las matrices de controles de Visual Basic 6.0.
Ramón Mateos Mondéjar/ Lola Cano Gil
3
Aunque es posible utilizar estas clases de matrices de controles en el nuevo desarrollo de Visual Basic 2008, se recomienda utilizar el modelo de evento y las funciones de .NET Framework en su lugar.
--------------------------------------------- oOo --------------------------------------------------
7. Ejemplos El ejemplo siguiente muestra dos usos de DirectCast, uno con un resultado satisfactorio en tiempo de ejecución y otro que no lo tiene.
Visual Basic 2005 Dim q As Object = 2.37 Dim i As Integer = CType(q, Integer) ' The following conversion fails at run time Dim j As Integer = DirectCast(q, Integer) Dim f As New System.Windows.Forms.Form Dim c As System.Windows.Forms.Control ' The following conversion succeeds. c = DirectCast(f, System.Windows.Forms.Control) En el ejemplo anterior, el tipo en tiempo de ejecución de q es Double. CType tiene un resultado satisfactorio porque Double se puede convertir en Integer. No obstante, el primer DirectCast no tiene un resultado satisfactorio porque el tipo en tiempo de ejecución de Double no tiene relación de herencia con Integer, aunque existe una conversión. El segundo DirectCast tiene un resultado satisfactorio porque convierte del tipo Form al tipo Control del que Form hereda.
Ejercicio: programar dos botones con diferente IVA con un controlador de eventos
Public Class Form1 'Creación de un Controlador de Eventos Private Sub Buttons_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles B1.Click, B2.Click Ramón Mateos Mondéjar/ Lola Cano Gil
4
Dim Impuesto As Single Select Case DirectCast(sender, Button).Name Case B1.Name Impuesto = Val(Tc.Text) * 6 / 100 Case B2.Name Impuesto = Val(Tc.Text) * 15 / 100 End Select Tiva.Text = Impuesto Ttotal.Text = Val(Tc.Text) + Impuesto End Sub Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click End End Sub End Class Ejemplo de presupuesto de compra de un ordenador
Public Class Form1 Dim opc As Long = 0 'Creación de un Controlador de Eventos Private Sub CheckBox_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ChLector.CheckedChanged, ChPantalla.CheckedChanged, ChKit.CheckedChanged, ChImpresora.CheckedChanged 'Select Case DirectCast(sender, CheckBox).Name ' Case ChLector.Name 'If ChLector.Checked = True Then opc += 500 Else opc -= 500 ' Case ChPantalla.Name ‘If ChPantalla.Checked = True Then opc += 250 Else opc-=250 ' Case ChKit.Name 'If ChKit.Checked = True Then opc += 150 Else opc -= 150 ' Case ChImpresora.Name
Ramón Mateos Mondéjar/ Lola Cano Gil
5
'If ChImpresora.Checked = True Then opc +=200 Else opc-=200 'End Select '
Ttotal.Text = Format(opc + 1300, "#,###,###") End Sub
Private Sub ChLector_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ChLector.CheckedChanged If ChLector.Checked = True Then opc += 500 Else opc -= 500 End If Ttotal.Text = Format(opc + 1300, "#,###,###") End Sub Private Sub ChPantalla_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ChPantalla.CheckedChanged If ChPantalla.Checked = True Then opc += 250 Else opc -= 250 End If Ttotal.Text = Format(opc + 1300, "#,###,###") End Sub Private Sub ChKit_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ChKit.CheckedChanged If ChKit.Checked = True Then opc += 150 Else opc -= 150 End If Ttotal.Text = Format(opc + 1300, "#,###,###") End Sub Private Sub ChImpresora_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ChImpresora.CheckedChanged If ChImpresora.Checked = True Then opc += 200 Else opc -= 200 End If Ttotal.Text = Format(opc + 1300, "#,###,###") End Sub
Ram贸n Mateos Mond茅jar/ Lola Cano Gil
6
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click End End Sub End Class EJERCICIO DE CREAR CONTROLES Y SUS EVENTOS EN TIEMPO DE EJECUCIÓN PictureBox 1 Programa para crear Imágenes y sus eventos en tiempo de ejecución. Etiquetas: label1 y label2
Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load PictureBox1.Enabled = False PictureBox1.Visible = False Dim t As New TextBox Dim x As New Point 'añadir el control(CAJA DE TEXTO) al formulario Me.Controls.Add(t) x.X = 152 x.Y = 370 t.Location = x t.BackColor = Color.Blue t.ForeColor = Color.Chocolate t.Visible = True ' AÑADIR PICTUREBOX'S AL FORMULARIO Dim i, Z, W, M As Integer W = 1 'VARIABLE PARA EL NUMERO DE PICTUREBOX M = 0 ' VARIABLE PARA EL Y DE LA LOCALIZACION (INCREMENTO) For i = 1 To 3 For Z = 1 To 3 Dim ima As New PictureBox x.X = Z * 102 x.Y = i + M Me.Controls.Add(ima) ima.Location = x ima.Width = 100 ima.Height = 100 ima.BorderStyle = BorderStyle.FixedSingle ima.SizeMode = PictureBoxSizeMode.StretchImage ima.Visible = True ima.Image = My.Resources._135098_iron_man_400
Ramón Mateos Mondéjar/ Lola Cano Gil
7
ima.Name = "pic" & W W = W + 1 Label1.Text = "LA ULTIMA PICTUREBOX CREADA ES: " & ima.Name Next M = M + 102 Next 'AÑADIR LAS PICTUREBOX AL CONTROLADOR DE EVENTOS Dim ctrl As Control For Each ctrl In Me.Controls If TypeOf (ctrl) Is PictureBox Then AddHandler ctrl.Click, AddressOf PictureBox_Click End If Next End Sub Private Sub PictureBox_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox1.Click Label2.Text = "HAS HECHO CLICK EN..." & DirectCast(sender, PictureBox).Name.ToString End Sub End Class
EL RESULTADO ES:
Ramón Mateos Mondéjar/ Lola Cano Gil
8