Vous êtes sur la page 1sur 8

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

Vous aimerez peut-être aussi