miércoles, 29 de febrero de 2012

22 - Eventos y delegados

Dentro de un formulario MDI, es posible pasar información desde un formulario contenido a otro, utilizando delegados y lanzamiento de eventos, lo cual permite manejar eventos.

Dentro de este punto, utilizaremos controles treeview y listview, en formularios distintos, los cuales permitirán pasar la información entre ellos a través del formulario padre.

Adicionalmente veremos, como redimensionar formularios utilizando la configuración del equipos en el cual se esté trabajando.

Ejercicio 1

a) Crear un proyecto de WinForms.

b) Agregar un formulario con el nombre frmPadre, definiendo las siguientes propiedades:

frmPadre

Text = Formulario Padre

IsMDIContainer = True

StratPosition = Manual

FormBorderStyle = FxelSingle

c) Definidas las propiedades, en el Load del formulario frmPadre codificaremos las líneas de código que permitirán ajustar automáticamente los formularios al porte de la interfaz, sin necesidad de definir portes fijos, ya qe estos se acomodarán automáticamente. Las siguientes líneas de código, definen la automodificación de porte del formulario padre:

' Cambiamos el tamanio del formulario padre para que se ajuste al tamaño de la pantalla.

Me.Size = New Size(SystemInformation.VirtualScreen.Width, SystemInformation.VirtualScreen.Height)

' Establecemos la posici'on de inicio del formulario.

Me.Location = New Point(0, 0)

d) Agregar formulario asignándole el nombre frmOrigen, definiendo las siguientes propiedades

FromBorderStyle = None

e) Agregar un TabControl con 2 pestañas.

TabControl1

Text = Cliente.

Anchor = Top, Bottom, Left, Right

f) En el TabPage1 realizar los siguientes cambios:

TabPage2

Text = Producto.

Agregar dos controles

Label1

Name = lblCliente

Text = Ingresra Nuevo Cliente:

Anchor = Top, Right

Button1

Name = btnCliente

Text = …

FlatStyle = Popup

Anchor = Top, Right

TreeView1

Name = trwCliente

Anchor = Top, Bottom, Left, Right

Quedando de la siguiente forma.





g) En el TabPage2 realizar los siguientes cambios:

TabPage2

Text = Producto.

Agregar dos controles

Label2

Name = lblProducto

Text = Ingresra Nuevo Producto:

Button2

Name = btnProducto

Text = …

FlatStyle = Popup

TreeView2

Name = trwProducto

Anchor = Top, Bottom, Left, Right

Quedando de la siguiente forma.




h) En el formulario frmPadre, en la sección de declaración general de la clase formulario, agregar la variable:

Dim Origen As frmOrigen

i) Crear el método que controlará el despliegue dentro del formulario contenedor del formulario frmOrigen

Private Sub frmOrigen_Crear()

End Sub

j) Dentro del método creado, se deben agregar las siguientes líneas de código:

' Definimos sus dimensiones.

Origen.Size = New Size(Me.ClientSize.Width * 0.3, Me.ClientSize.Height - 4)

' Definimos la localizacion del formulario hijo dentro del padre.\

Origen.StartPosition = FormStartPosition.Manual

Origen.Location = New Point(0, 0)

' Indicamos al formulario cual es su padre.

Origen.MdiParent = Me

' Mostramos el formulario.

Origen.Show()


k) En el evento Load del formulario padre, agregar las siguientes líneas de código al final del bloque de codificación

' Inicializamos la instancia del objeto

Me.Origen = New frmOrigen

' Llamamos a la función que definirá las dimenciones del frmOrigen

frmOrigen_Crear()

Ejecutar la solución.

l) Agregar a la solución el formulario frmDestino, definiendo las siguientes opciones:

Nombre = frmDestino

FormBorderStyle = None

m) En el formulario frmDestino, agregar el control ListView

Nombre = lswProducto

Anchor = Top, Bottom, Left, Right

Quedando de la siguiente forma.





n) En el formulario frmPadre, definir en la sección global la siguiente variable:

Dim Destino As frmDestino

ñ) Crear, en el formulario frmPadre, el método que creará las dimensiones del formulario frmDestino.

Private Sub frmDestino_Crear()

End Sub

o) Agregar las siguientes líneas de código dentro del método frmDestino_Crear

' Definimos sus dimensiones.

Destino.Size = New Size((Me.ClientSize.Width * 0.7) - 6, Me.ClientSize.Height * 0.5)

' Definimos la localizacion del formulario hijo dentro del padre.\

Destino.StartPosition = FormStartPosition.Manual

Destino.Location = New Point((Me.ClientSize.Width * 0.3) + 1, 0)

' Indicamos al formulario cual es su padre.

Destino.MdiParent = Me

' Mostramos el formulario.

Destino.Show()

p) En el evento Load del formulario padre, agregar las siguientes líneas de código al final del bloque de codificación

' inicializamos la instancia del objeto

Me.Destino = New frmDestino

' llamamos a la función que definirá las dimenciones del frmDestino

frmDestino_Crear()

Al ejecutar la solución el despliegue que se observará será el siguiente:







TRABAJANDO CON TREVIEW

a) Agregar un nuevo formulario con el nombre frmCliente, definiendo los siguientes controles:

Label1

Name = lblNombre

Text = Nombres

Label2

Name = lblAppPaterno

Text = Apellido Paterno

Label3

Name = lblAppMaterno

Text = Apellido Materno

Label4

Name = lblMail

Text = e-mail

Label5

Name = lblAceptar

Text = Aceptar

Label6

Name = lblCancelar

Text = Cancelar

TextBox1

Name = txtNombre

TextBox2

Name = txtAppPaterno

TextBox3

Name = txtAppMaterno

TextBox4

Name = txtMail

Button1

Name = btnAceptar

FlatStyle = Popup

Button2

Name = btnCancelar

FlatStyle = Popup





b) En el evento clic del botón btnAceptar, agregar la siguiente línea de código.

Me.DialogResult = Windows.Forms.DialogResult.OK

c) En el evento clic del botón btnCancelar, agregar la siguiente línea de código.

Me.Close()

d) En el evento clic del botón btnCliente, que se encuentra en el TabControl1 del formulario frmOrigen, agregar las siguientes líneas de código:

Dim frm As New frmCliente

Dim res As DialogResult = frm.ShowDialog()

If res = Windows.Forms.DialogResult.OK Then

End If

f) Dentro del bloque if que se ha defindo anteriormente, agregar las siguientes líneas de código que cargarán la información ingresada en el formulario frmCliente al treview

Dim node As TreeNode

node = Me.trwCliente.Nodes.Add(frm.txtNombre.Text)

node.Nodes.Add(frm.txtAppPaterno.Text)

node.Nodes.Add(frm.txtAppMaterno.Text)

node.Nodes.Add(frm.txtMail.Text)


PASAR PARAMETROS DESDE UN FORMULARIO A OTRO UTILIZANDO DELEGADOS Y EVENTOS

Este ejercicio permitirá mostrar como es posible pasar parámetros desde un formulario a otro dentro de un contenedor utilizando eventos y variables delegadas.

Ejercicio

a) Agregar a la solución antes creada, el formulario frmProducto con los siguientes controles:

frmProducto

Text = Ingresar Producto

Label1

Name = lblNombre

Text = Nombre:

Label2

Name = lblCantidad

Text = Cantidad:

Label3

Name = lblPrecio

Text = Precio

Textbox1

Name = txtNombre

TextBox2

Name = txtCantidad

TextBox3

Name = txtPrecio

Button1

Name = btnAceptar

FlatStyle = Popup

Button2

Name = btnCancelar

FlatStyle = Popup

Quedando de la siguiente forma:






b) En el evento clic del botón btnAceptar, agregar la siguiente línea de código.

Me.DialogResult = Windows.Forms.DialogResult.OK

c) En el evento clic del botón btnCancelar, agregar la siguiente línea de código.

Me.Close()

d) Agregar en el evento clic, del botón btnProducto, que se encuentra en el TabPage2 del TabControl1, definido en el formulario frmOrigen, las siguientes líneas de código:

Dim frmP As New frmProducto

Dim resP As DialogResult = frmP.ShowDialog()

If resP = Windows.Forms.DialogResult.OK Then

Dim node As TreeNode

node = Me.trwPedidos.Nodes.Add(frmP.txtNombre.Text)

node.Nodes.Add(frmP.txtPrecio.Text)

node.Nodes.Add(frmP.txtCantidad.Text)

End If

e) En la sección de definición de variables, del formulario frmOrigen, especificar las siguientes variables:

Public Delegate Sub Param(ByVal nom As String, ByVal can As String, ByVal pre As String)

Public Event Par As Param

f) En el bloque if definido en el punto d) especificar la siguiente línea de comando, la cual estará encargada de lanzar un evento:

RaiseEvent Par(frmP.txtNombre.Text, frmP.txtCantidad.Text, frmP.txtPrecio.Text)

g) En el formulario frmDestino definir las siguientes líneas de código en el método que atiende el evento load del mismo:

Me.lvwDestino.View = View.Details

Me.lvwDestino.Columns.Add("Nombre", 150, HorizontalAlignment.Left)

Me.lvwDestino.Columns.Add("Cantidad", 150, HorizontalAlignment.Left)

Me.lvwDestino.Columns.Add("Precio", 150, HorizontalAlignment.Left)

Estas líneas definirán las columnas que administrará el listView definido en este formulario.

h) En el mismo formulario definir el método que cargará la información enviada desde el formulario padre, el cual estará encargado de capturar la información enviada desde el formulario frmOrigen:

Public Sub Capturar(ByVal nom As String, ByVal can As String, ByVal pre As String)

Me.lvwDestino.Items.Add(nom)

Me.lvwDestino.Items(0).SubItems.Add(can)

Me.lvwDestino.Items(0).SubItems.Add(pre)

End Sub

i) En el formulario frmPadre definir el método que enviará los parámetros al formulario de destino

Public Sub Par(ByVal nom As String, ByVal can As String, ByVal pre As String)

Me.Destino.Capturar(nom, can, pre)

End Sub

j) En el formulario frmPadre definir la captura del evento utilizando la sentencia addhandler, dentro del evento load, como se muestra en la siguiente líneas de código:

AddHandler Origen.Par, AddressOf Me.Par

21 - DialogResult pasar valores

Es posible capturar valores de otros formularios utilizando la propiedad DialogResult, asociada a la instancia que se ha creado del formulario en cuestión. Para ello el usuario debe:

a) Crear la instancia del formulario que va a retornar el o los valores deseados. Ejemplo

Dim frm as new frmNombre

b) Al abrir el formulario, se deben realizar las operaciones necesarias de ingreso de información, luego al cerrar el formulario se debe agregar en el evento que cierra este la opción:

Me.DialogResult = DialogResult.OK

c) Esta opción le indicará al formulario que ha llamado al otro formulario que entregará los valores que la operación se ha realizado, esto se debe hacer de la siguiente forma:

If result = DialogResult.OK Then

' Realizar la captura de información.

End If

El siguiente ejercicio muestra como se debe capturar información desde un formulario que se ha invocado

Ejercicio 1

a) Crear un nuevo Proyecto Windows

b) Agregar un formulario con el nombre frmFormularioInicio, modificando las siguientes propiedades.

FormBorderStyle = FixsedSingle

Text = Formulario Nueva Mascota

MaximizeBox = False

MinimizeBox = False

c) Arrastrar desde el cuadro de herramientas un control GroupBox y agregar 2 label, 2 Textbox, 2 button, con las siguientes características

GroupBox1

Nombre = grbDatos

Text = Datos Personales

Lable 1

Name = lblNombre

Text = Nombre completo:

Label 2

Name = lblDireccion

Text = Dirección completa:

TextBox1

Nombre = txtNombre

TextBox2

Nombre = txtDireccion

Multicine = True

Button1

Nombre = btnNombre

Text = …

FlatStyle = Popup

Button2

Nombre = btnDireccion

Text = …

FlatStyle = Popup

Quedando el formulario de la siguiente forma:



a) Crear el formulario frmNombre, el cual entregará la información al formulario frmFormularioInicio, agregando los siguientes objetos.

frmNombre

Text = Datos Personales

FormBorderStyle = FixsedSingle

MaximizeBox = False

MinimizeBox = False

Label1

Nombre = lblNombre

Text = Nombre:

Label2

Nombre = lblAppPaterno

Text = Apellido Paterno

Label3

Nombre = lblAppMaterno

Text = Apellido Materno

TextBox1

Nombre = txtNombre

TextBox2

Nombre = txtAppPaterno

TextBox3

Nombre = txtAppMaterno

Label4

Nombre = lblAceptar

Label5

Nombre = lblCancelar

Button1

Nombre = btnAceptar

Text = …

FlatStyle = Popup

Button2

Nombre = btnCancelar

Text = …

FlatStyle = Popup

Quedando este de la siguiente forma:




a) En el método btnNombre_Click, que atiende el evento btnNombre.Click se deben agregar las siguientes líneas de código:

Dim frm As New frmNombre

Dim res As DialogResult = frm.ShowDialog()

If res = Windows.Forms.DialogResult.OK Then

Me.txtNombre.Text = frm.txtNombre.Text + " " + frm.txtAppPaterno.Text + " " + frm.txtAppMaterno.Text

End If

b) En el evento btnAceptar.click del formulario frmNombre, agrege la siguiente línea de comando:

Me.DialogResult = Windows.Forms.DialogResult.OK

c) En el eventto btnCancelar.click del formulario frmNombre, agregar la siguiente línea de comando:

Me.Close()

O puede agregar la siguiente línea de comando

Me.DialogResult = Windows.Forms.DialogResult.Cancel

d) Ejecute la aplicación. Si se observa, cuando presiona el botón asociado al ingreso de nombre, aparecerá una interfaz que permitirá ingresar los datos del usuario, luego podrá verificar con el evento aceptar y el evento cancelar los resultados que se producen.

Ejericio 2

También la información se puede capturar mediante , como se muestra en el siguiente ejemplo, para lo cual utilizaremos parte de la solución creada con anterioridad.

a) Agregar a la solución que se ha creado un nuevo formulario, el cual se llamará frmDireccion, con los siguientes objetos:

frmDireccion

Text = Dirección Personal

FormBorderStyle = FixsedSingle

MaximizeBox = False

MinimizeBox = False

Label1

Nombre = lblCalle

Text = Calle:

Label2

Nombre = lblNumero

Text = Numero:

Label3

Nombre = lblPiso

Text = Piso:

Label4

Nombre = lblLetra

Text = Letra:

Label5

Nombre = lblCP

Text = CP:

Label6

Nombre = lblPoblacion

Text = Población:

Label7

Nombre = lblAceptar

Text = Aceptar

Label8

Nombre = lblCancelar

Text = Cancelar

Textbox1

Name = txtCalle

Textbox2

Text = txtNumero

Textbox3

Text = txtPiso

Textbox4

Text = txtLetra

Textbox5

Text = txtCP

Textbox6

Text = txtPoblacion

Button1

Name = btnAceptar

FlatStyle = Popup

Button2

Name = btnCancelar

FlatStyle = Popup

Quedando éste de la siguiente forma:




a) En el formulario frmDirección agregar la siguiente propiedad:

Public ReadOnly Property DireccionCompleta() As String

Get

Return Me.txtCalle.Text + " " + Me.txtNumero.Text + " " + Me.txtPiso.Text + " " + Me.txtLetra.Text + " " + Me.txtCP.Text + " " + Me.txtPoblacion.Text

End Get

End Property

b) En el evento clic del botón btnAceptar, agregar la siguiente línea de comando

Me.Visible = false

c) En el evento clic del botón btnCancelar, agregar la siguiente línea de comando

Me.Close()

d) Creamos una variable de tipo global, en el formulario frmFormularioInicio, en la clase del formulario, que será utilizada dentro del mismo:

Dim dfrm As frmDireccion

e) En el formulario frmFormularioInicio creamos el siguiente método, el cual estará encargado de capturar la información del formulario frmDirección y de cerrar el mismo:

Private Sub CierroDirecForm(ByVal bocata As Object, ByVal chorizo As EventArgs)

If Me.dfrm.Visible = False Then

' Colocamos la cadena devuelta por el form direccion en el textbox correspondiente.

Me.txtDireccion.Text = Me.dfrm.DireccionCompleta

' Cerramnos el formulario.

Me.dfrm.Close()

End If

End Sub

f) En el evento clic del botón asociado a la opción “Dirección completa:” del formulario frmFormularioInicio agregar las siguientes líneas de comando:

' Creamos la instancia

Me.dfrm = New frmDireccion

' Registramos el controlador para el evento VisibleChanged

AddHandler dfrm.VisibleChanged, AddressOf CierroDirecForm

' Mostramos el formulario.

Me.dfrm.Show()

Ejercicio 3 - Control de Posición de Foco

Se puede manejar la posición en donde se encuentra el cursor dentro de un formulario utilizando los eventos GotFocus y LostFocus de los textbox de un formulario.

Para mostrar como se realiza esta operación utilizaremos el formulario frmDirección

a) En el formulario frmDireccion crearemos un método que estará encargado de atender todos los eventos GotFocus de los TextBox que se encuentran dentro de este formulario, como se muestra en las siguientes líneas de comando:

Private Sub txt_GotFocus(ByVal sender As Object, ByVal e As EventArgs) Handles txtCalle.GotFocus, txtNumero.GotFocus, txtPiso.GotFocus, txtLetra.GotFocus, txtCP.GotFocus, txtPoblacion.GotFocus

End Sub

b) Dentro de éste método, definiremos el color que tomará la propiedad BackColor del texto en el cual se esta posicionado, para esto agregaremos en el método recién creado las siguientes líneas de comando:

' declaramos una variable para referenciar al control que obtiene el foco.

Dim txt As TextBox = CType(sender, TextBox)

' Cambiamos el color de fondo.

txt.BackColor = Color.Gold

c) Al cambiar a otro textbox el color de fondo debe ser restaurado, por lo cual, deberemos crear un método que atienda los eventos lostfocus de cada textbox, para esto se debe incluir el siguiente método:

Private Sub txt_LostFocus(ByVal sender As Object, ByVal e As EventArgs) Handles txtCalle.LostFocus, txtNumero.LostFocus, txtPiso.LostFocus, txtLetra.LostFocus, txtCP.LostFocus, txtPoblacion.LostFocus

End Sub

d) Dentro de éste método se debe hacer algo similar a lo anterior, pero con la salvedad de que el color de fondo de cada textbox debe volver a su color original, para esto, se deben incluir las siguientes líneas de código:

' declaramos una variable para referenciar al control que deja el foco.

Dim txt As TextBox = CType(sender, TextBox)

' Cambiamos el color de fondo.

txt.BackColor = Color.White