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

No hay comentarios: