Practica Cajas de Dialogo [email protected]
Cree una aplicación denominada VentanaMarco que utilice un objeto Form como ventana principal, con la intención de visualizar, a partir de ella otros diálogos, a partir de ella, otros diálogos. Para ello, cree el esqueleto de la aplicación y añada al formulario una barra de menús como se muestra a continuación:
El menú Archivo contendrá sólo una orden, y el menú Diálogos inicialmente estará vacio.
Se desea que el usuario introduzca una palabra clave en el momento de ejecutar la aplicación. Por lo tanto, añada a la clase del formulario Form1 el controlador de su evento Load como se indica a continuación:
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load If (Not contraseña()) Then Me.Close() End If End Sub
El método contraseña de la clase Form1 devolverá true si la contraseña fue correcta y false si, después de tres intentos, fue incorrecta.
Crear una caja de dialogo para la contraseña
1. Agregue un formulario de diálogo al proyecto y asígnele el nombre de DlgPalabraDePaso .2. Como titulo llevara “Palabra de Paso”3. Las cajas de diálogo no suelen incluir barra de menús, barras de desplazamiento de
ventana, menú de control, botones minimizar y maximizar, barra de estado ni borde de tamaño ajustable. Por lo tanto, en la ventana de propiedades, cambie la propiedad FormBorderStyle a FixedDialog y ControlBox a False
4. Haga los cambios que considere necesarios para personalizar la apariencia y características del formulario.
5. Añada al formulario los siguientes controles
Objeto Propiedad ValorEtiqueta Name
TextetPalabraDePasoIntroduzca la palabra de paso:
Caja de texto NamePasswordChar
ctPalabraDePaso*
Boton1 NameTextDialogResult
btAceptar&AceptarOK
Boton2 NameTextDialogResult
btCancelar&CancelarCancel
Asigne a la propiedad AcceptButton de la caja de diálogo el valor de btAceptar para que este botón pueda ser activado, además de con un clic, también con la tecla Enter, y a CancelButton el valor de btCancelar para que este otro botón pueda ser activado también con la tecla Cancelar.
Mostrar caja de dialogo.
El formulario de inicio se cargará automáticamente cuando se ejecute la aplicación. Para hacer que aparezca en la aplicación un segundo formulario o caja de dialogo, desde este formulario de inicio habrá que crear un objeto de su clase (New) y mostrarlo (ShowDialog o Show). Por ejemplo.
' Crear la caja de diálogo de entrada Dim Dlg As DlgPalabraDePaso = New DlgPalabraDePaso ' Mostrar el diálogo y recuperar sus datos If (Dlg.ShowDialog() = Windows.Forms.DialogResult.OK) Then sPalabraDePaso = Dlg.ctPalabraDePaso.Text Else Return False End If
Del mismo modo, para hacer que desaparezca el formulario o caja de dialogo hay que escribir código para descargarlo u ocultarlo; esto ocurrirá automáticamente cuando el objeto creado salga fuera del ámbito, instante en que se invocara el destructor de su clase (método dispose).
Analizando la propiedad DialogResult del botón btAceptar. Si el valor de esta propiedad es distinto de None y el formulario se muestra mediante el método ShowDialog, al hacer clic en el botón se cierra el formulario (ocultándolo, no destruyéndolo) sin necesidad de responder a ningún evento, y la propiedad DialogResult del botón. ShowDialog devuelve el valor de la propiedad DialogResult del diálogo.
Introducción de los datos y recuperación de los mismos.
Para recuperar los datos de una caja de diálogo, es importante saber como se cerró: valor DialogResult devuelto por ShowDialog. Por ejemplo, si el usuario hace clic en el botón Aceptar los datos se recuperarán, pero si lo hace en Cancelar, los datos escritos por el usuario se desecharan en lugar de conservarse.
Private Function contraseña() As Boolean Dim nCuenta As Integer Dim sPalabraDePaso As String ' Crear la caja de diálogo de entrada Dim Dlg As DlgPalabraDePaso = New DlgPalabraDePaso ' Se admiten tres intentos para introducir la palabra de paso Do ' Mostrar el diálogo If (Dlg.ShowDialog() = Windows.Forms.DialogResult.OK) Then sPalabraDePaso = Dlg.ctPalabraDePaso.Text Else Return False End If
' Verificar si la palabra de paso es correcta If (sPalabraDePaso.Length <> 0 And _ sPalabraDePaso.CompareTo("Javier") <> 0) Then MessageBox.Show("La palabra de paso no es correcta", _ "Error", _ MessageBoxButtons.OK, MessageBoxIcon.Error) nCuenta += 1 Else nCuenta = 4 End If Loop While (nCuenta < 3) If (sPalabraDePaso.Length = 0 Or nCuenta = 3) Then Return False ' salir de la aplicación End If Return True End Function
Casillas de verificación
Una casilla de verificación es un control que indica sí una opción particular está activada o desactivada. Cada casilla de verificación es independiente de las demás, ya que cada una de ellas tiene su propio identificador.
La funcionalidad para manipular este tipo de controles se proporciona por la clase CheckBox del espacio de nombres System.Windows.Forms.
Cargue la aplicación VentanaMarco creada anteriormente y añada una nueva caja de dialogo, como la de la figura.
La caja de diálogo será un objeto de la clase DlgCasillaVerificación derivada de Form.
Objeto Propiedad ValorCaja de Dialogo Name
TextFormBorderStyleMaximBox
DlgCasillaVerificacionCasilla de verificaciónFixedDialogFalse
Caja de texto Name ctTextoCasilla de verificación
NameText
cvConverMayus&Convertir a mayúsculas
Para mostrar un dialogo de la clase DlgCasillaVerificacion, se añadirá al menú Diálogos de la aplicación ventana marco un nuevo elemento DialogoCasillaV y después se escribirá el controlador para su evento Click, como sigue:
Private Sub DialogoCasillaV_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DialogoCasillaV.Click Dim Dlg As DlgCasillaVerificacion = New DlgCasillaVerificacion Dlg.ShowDialog() End Sub
Asigne a la propiedad ThreeState de la casilla el valor True, y en segundo lugar, intercéptela tecla pulsada (evento KeyPress) y en función del estado de la casilla de verificación visualice el carácter como corresponda.
Private Sub ctTexto_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles ctTexto.KeyPress If (cvConverMayus.CheckState = CheckState.Unchecked) Then If (Char.IsUpper(e.KeyChar)) Then e.KeyChar = Char.ToLower(e.KeyChar) End If ElseIf (cvConverMayus.CheckState = CheckState.Checked) Then If (Char.IsLower(e.KeyChar)) Then e.KeyChar = Char.ToUpper(e.KeyChar) End If End If End Sub
El método cvConverMayus_Click sitúa el foco, que estaba sobre la casilla de verificación, en la caja de texto y coloca el punto de inserción a continuación del ultimo carácter.
Private Sub cvConverMayus_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cvConverMayus.Click, cvConverMayus.CheckedChanged ctTexto.Focus() ctTexto.SelectionStart = ctTexto.Text.Length End Sub
Botones de Opción
Un botón de opción es un control que indica si una determinada opción está activada o desactivada. Cada botón de opción es independiente de los demás, ya que cada uno de ellos tiene su propio identificador. El número de opciones representadas de esta forma puede ser cualquiera, y de ellas el usuario puede seleccionar una cada vez. La funcionalidad para manipular este tipo de controles se proporciona mediante por la clase RadioButton .
Un clic sobre un objeto RadioButton genera un evento Click, y cuando su estado cambia, un evento CheckedChanged. Para saber el tipo de cambio experimentado por la opción que originó el evento, hay que verificar el valor de la propiedad Checked de la misma. Este valor puede ser False, el botón aparece vacío, o True, el botón aparece con una señal.
La propiedad Appearence determina si la apariencia de este control es la típica o como un botón de pulsación. La propiedad FlatStyle, determina el estilo y la apariencia del control: Flat, Popup, Standard o System, valores definidos por el tipo enumerado FlatStyle. El valor predeterminado es Standard. Cuando el valor es System, la apariencia del control estará determinada por el sistema operativo del usuario.
Considérese que cuando se hace clic sobre un botón de opción que pertenece a un grupo, hay dos que cambian de estado: el que estaba seleccionado y el nuevo seleccionado.
Cargue la aplicación denominada VentanaMarco, y añada una nueva caja de diálogo; de tal forma que cuando se seleccione uno de los botones de opción “Decimal”, “Octal”, o “Hexadecimal”, el número tecleado en la caja de texto aparezca en la base indicada. La caja de diálogo será un objeto de la clase DlgBasesNum derivada de Form.
Objeto Propiedad ValorCaja de Diálogo Name
TextFormBorderStyleMaximizeBox
DlgBasesNumBotones de opciónFixedDialogFalse
Caja de texto Name ctDatoGroupBox Name
TextbgGrupoBotones1(Nada)
Botón de opción NameTextChecked
btopDecimal&DecimalTrue
Botón de opción NameText
btopOctal&Octal
Botón de opción NameText
btopHexadecimal&Hexadecimal
Añada la orden Bases numéricas al menú Diálogos de la aplicación VentanaMarco, para que cuando el usuario haga clic en esa orden, se visualice una caja de diálogo de la clase DLGBasesNum. Por lo que debe añadir a la clase Form1 el controlador del evento Click de este nuevo elemento y edítelo como se indica a continuación:
Private Sub DialogoBtOpcion_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DialogoBases.Click Dim Dlg As DlgBasesNum = New DlgBasesNum Dlg.ShowDialog() End Sub
A continuación programe las operaciones para las que se diseño el diálogo:
1. Cuando el usuario escriba o modifique el contenido de la caja de texto, ésta se lo notifica a la caja de dialogo con el evento TextChanged; para manipularlo, añada el controlador correspondiente. (en el diálogo DlgBasesNum haga doble clic en la caja de texto
2. Lo que va hacer el método ctDato_TextChanged es almacenar el valor decimal, octal o hexadecimal de la caja de texto en una variable miembro denominada numeroActual de tipo Int32, de la clase DlgBassNum . Añada esta variable a la clase citada (su valor inicial predeterminado es cero).
Public Class DlgBasesNum Private numeroActual As Int32
…
End Class
3. Después, edite el método privado ctDato_TextChanged como se indica a continuación:
Private Sub ctDato_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ctDato.TextChanged If (ctDato.Text.Length = 0) Then Return Dim texto As String = ctDato.Text Dim base As Integer = 0
If (btopDecimal.Checked) Then base = 10 ElseIf (btopOctal.Checked) Then base = 8 ElseIf (btopHex.Checked) Then base = 16 End If Try numeroActual = Convert.ToInt32(texto, base) Catch ex As FormatException If (texto = "-" Or texto = "+") Then Return MsgBox(ex.Message) Catch ex As Exception MsgBox(ex.Message) End Try End Sub
El método ToInt32 de la clase Convert convierte una cadena de caracteres a un número entero de tipo Int32
4. Cuando el usuario seleccione una de las opciones Decimal, Octal o Hexadecimal, se producirá entre otros, el evento CheckedChanged asociado con ese control (puede ser el mismo para los tres). Para añadir el control correspondiente diríjase al diálogo DlgBasesNum, seleccione uno a uno los botones de opción, elija ese evento en la ventana de propiedades y vincule con cada uno de los botones el método especificado a continuación:
Private Sub btopDecOcHex_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btopDecimal.CheckedChanged, btopHex.CheckedChanged, btopOctal.CheckedChanged… End Sub
5. El método btopDecOcHex_CheckedChanged tiene que mostrar en la caja de texto el valor numeroActual en decimal, octal o hexadecimal. El boton de acción sobre el cual se hizo clic quedara enfocado, para situar el foco de nuevo en la caja de texto, invocaremos su método Focus.
Private Sub btopDecOcHex_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btopDecimal.CheckedChanged, btopHex.CheckedChanged, btopOctal.CheckedChanged If (btopDecimal.Checked) Then ctDato.Text = Convert.ToString(numeroActual, 10) ElseIf (btopOctal.Checked) Then ctDato.Text = Convert.ToString(numeroActual, 8) ElseIf (btopHex.Checked) Then ctDato.Text = Convert.ToString(numeroActual, 16).ToUpper End If ctDato.Focus() End Sub
El método ToString de la clase Convert convierte un entero en la cadena de caracteres equivalente y el método ToUpper de la clase String convierte a mayúsculas una cadena de caracteres.
Listas Simples
Una lista es un control de la clase ListBox que pone a disposición del usuario un conjunto de elementos, que podrá elegir haciendo clic en ellos.
Diseño.
Cargue la aplicación denominada VentanaMarco, de tal modo que cuando seleccione uno o más elementos de la lista y pulse el botón Aceptar, muestre su contenido en un diálogo predefinido. La caja de diálogo será un objeto de la clase DlgListaSimple derivada de Form.
Objeto Propiedad ValorCaja de Diálogo Name
TextFormBorderStyleMaximizeBox
DlgListaSimpleLista SimpleFixedDialogFalse
Lista Name lsListaBotón de pulsación Name
TextbtAceptar&Aceptar
Botón de pulsación NameText
btAñadirAña&dir
Botón de pulsación NameText
btBorrar&Borrar
Para mostrar un diálogo de la clase DlgListaSimple, añadiremos al menú Diálogos de la aplicación VentanaMarco una nueva orden Lista Simple. El controlador asociado con esta orden será el siguiente:
Private Sub DialogoListaSimple_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DialogoListaSimple.Click Dim Dlg As DlgListaSimple = New DlgListaSimple Dlg.ShowDialog() End Sub
Iniciar una lista.
La iniciación de una lista se puede hacer durante el diseño a través de su propiedad Items, o durante la ejecución en el instante en que se carga el formulario, respondiendo al evento Load.
Para añadir a la lista una serie de elementos de tipo String, se añadirá a la clase DlgListaSimple_Load que se ejecute como respuesta al evento Load del diálogo.
Private Sub DlgListaSimple_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim elemento() As String = New String() { _ "uno", "dos", "tres", "cuatro", "cinco", "seis", "siete", _ "ocho", "nueve", "diez", "once", "doce", "trece", "catorce"} Me.lsLista1.Items.AddRange(elemento) End Sub
Acceder a los elementos seleccionados
Mediante el método btAceptar_Click
Private Sub btAceptar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btAceptar.Click If (lsLista1.SelectedIndex < 0) Then Return 'Dim elementoSeleccionado As Object 'elementoSeleccionado = lsLista1.SelectedItem 'MsgBox(elementoSeleccionado)
Dim s As String = "" Dim i As Integer For i = 0 To lsLista1.SelectedItems.Count - 1 s = s & lsLista1.SelectedItems(i).ToString & Environment.NewLine Next MsgBox(s) End Sub
Para añadir un nuevo elemento
Al botón añadir se le debe agregar un controlador de eventos Click como se muestra a continuación.
Private Sub btAñadir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btAñadir.Click Dim elemento As String elemento = InputBox("Introducir elemento de la lista:") ' Añadir el elemento If (elemento.Length <> 0) Then lsLista1.Items.Add(elemento) End If End Sub
Para borrar un elemento
Repita el procedimiento anterior
Private Sub btBorrar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btBorrar.Click If (lsLista1.SelectedIndex < 0) Then Return lsLista1.Items.RemoveAt(lsLista1.SelectedIndex) End Sub
Clase CheckedListBox, es un objeto ListBox en el que se muestra una casilla de verificación a la izquierda de cada elemento.
Listas Desplegables.
Una lista desplegable es un objeto de la clase ComboBox y es una combinación de una lista simple y una caja de texto que permite la selección de un solo elemento cada vez. Los estilos de listas desplegables son: editable, no editable y estática, que pueden fijarse mediante la propiedad DropDownStyle.
Por omisión, el número de elementos que muestra una lista emergente es ocho. Este valor puede modificarse asignando a la propiedad MaxDropDownItems el valor deseado.
Para buscar en una lista un elemento que contiene una determinada cadena de caracteres, se dispone del método FindString y FindStrinExact.
Diseñar la lista
Cargue la aplicación VentanaMarco, y añada una nueva caja de diálogo como se muestra.
De tal forma que cuando seleccione un elemento de la lista y pulse el botón Aceptar, muestre su contenido en un diálogo predefinido. La clase de diálogo será un objeto de la clase DlgListaDesplegable derivada de Form.
Objeto Propiedad ValorCaja de Diálogo Name
TextFormBorderStyleMaximizeBox
DlgListaDesplegableLista desplegableFixedDialogFalse
Lista desplegable Name ldLista1Botón de pulsación Name
TextbtAceptar&Aceptar
Botón de pulsación NameText
btAñadirAña&dir
Botón de pulsación Name btBorrar
Text &BorrarPara mostrar este dialogo desde el menú Diálogos de la clase VentanaMarco, añada al mismo una orden Lista desplegable.
Private Sub DialogoListaDesplegable_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DialogoListaDesplegable.Click Dim Dlg As DlgListaDesplegable = New DlgListaDesplegable Dlg.ShowDialog() End Sub
Iniciar Lista.
Los elementos de la lista pueden ser cadenas de caracteres, imágenes o cualquier otro elemento capaz de pintarse a sí mismo.
Acceder al elemento seleccionado.
Se utiliza el método SelectedItem de la clase ComboBox. Se utiliza el controlador de eventos Click del botón aceptar.
Private Sub btAceptar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btAceptar.Click If (ldLista1.SelectedIndex < 0) Then Return Dim elementoSeleccionado As Object elementoSeleccionado = ldLista1.SelectedItem MsgBox(elementoSeleccionado) End Sub
Este método será invocado cuando el usuario haga click en el botón btAcpetar.
Elementos de una lista desplegable
La colección Items de un objeto ComboBox se corresponde con los elementos mostrados por esa lista. Esta colección es de la clase ComboBox.ObjectCollection. Por lo tanto, las operaciones de la colección Items se reflejaran automáticamente en la lista. Estas operaciones se pueden resumir en: añadir (Add o AddRange), insertar (Insert) o quitar uno o más elementos de la lista (Remove, RemoveAt, o Clear).
Para realizar las operaciones anteriores se hará lo siguiente:
1. Eliminar el controlador del evento Load del dialogo DlgListaDesplegable.2. Al botón Añadir asígnele un controlador de eventos Click como se muestra:
Private Sub btAñadir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btAñadir.Click Dim elemento As String elemento = InputBox("Introducir elemento de la lista:") ' Añadir el elemento If (elemento.Length <> 0) Then ldLista1.Items.Add(elemento) End If End Sub
3. En el botón borrar, asignar un controlador de eventos Click, como se muestra a continuación.Private Sub btBorrar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btBorrar.Click If (ldLista1.SelectedIndex < 0) Then Return ldLista1.Items.RemoveAt(ldLista1.SelectedIndex) End Sub
La propiedad SelectedIndex de ComboBox devuelve el índice del elemento seleccionado en la lista (el primer índice es el cero; -1 si no hay ningún elemento seleccionado) y el método RemoveAt de ComboBox.OjectCollection elimina el elemento de la lista índice especificado.
Controles de Rango Definido
Se trata de controles que definen un valor entero perteneciente a un rango previamente definido. A este grupo pertenecen los controles VScrollBar, HScrllBar y progressBar.
Todos estos controles de biblioteca .NET definen básicamente las siguientes propiedades:
Minimum – indica el extremo inferior del rango de valores. Maximum – indica el extremo superior del rango de valores. Value – indica el valor del rango actualmente seleccionado.
Cuando se modifica la propiedad value, el control correspondiente, excepto ProgressBar, generara un evento ValueChanged.
ScrollBar
Es una barra de desplazamiento horizontal o vertical. Se trata de un control que tiene un cuadrado que se desplaza a lo largo de la misma para fijar un valor. ScrollBar es la clase base de VscrollBar y HScrollBar, clases que dan lugar a las barras de desplazamiento vertical y horizontal, respectivamente.
Como ejercicio se añadirá al menú Diálogos de la aplicación VentanaMarco, un nuevo elemento “Controles de rango definido”, para que cuando el usaurio haga clic cobre ella se muestre el siguiente cuadro de diálogo.
La actualización del contador se hará cada 10 * k milisegundos, donde k será un valor entre 1 y 150 proporcionado por la barra de de desplazamiento que se muestra en la figura; la velocidad de conteo será menor cuanto más a la derecha este el cuadrado de desplazamiento.
Cuadro de Dialogo Controles de Rango Definido con los controles que se especifican en la siguiente tabla.
Objeto Propiedad ValorCaja de Diálogo Name
TextFormBorderStyleMaximizeBox
DlgRangosControles de rango definidoFixedDialogFalse
Barra de Desplazamiento
NameMinimumMaximumValueLargeChangeSmallChange
bdhIntervalo115080101
Etiqueta NameAutosizeBorderStyleTextTextAlign
etContadorFalseFixed3D0MiddleCenter
Para mostrar este diálogo desde el menú de diálogos se debe añadir el siguiente código
Private Sub DialogoRangos_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DialogoRangos.Click Dim Dlg As DlgRangos = New DlgRangos Dlg.ShowDialog() End Sub
Para que necesitamos la barra de desplazamiento, para variar el retardo del temporizador entre 10 x 1 y 10 x 150 milisegundos con el fin de con el fin de variar la velocidad de conteo.
Añada a la clase DlgRangos un temporizador y el controlador que responda a su evento Elapsed. Este método tiene que actualizar el valor de la etiqueta etContador
Private Sub Temporizador_Elapsed(ByVal sender As System.Object, _ ByVal e As System.Timers.ElapsedEventArgs) _ Handles Temporizador.Elapsed Dim inc As Integer = 1 ' incremento ' La cuenta es hasta 1000: carga 'Dim tpHecho As Integer = 0, carga As Integer = 1000 'Dim cuenta As Integer = Convert.ToInt32(etContador.Text) + inc 'etContador.Text = Convert.ToString(cuenta) etContador.Text = (Convert.ToInt32(etContador.Text) + 1).ToString ' Mostrar progreso 'tpHecho = CInt(CSng(cuenta) / carga * 100) 'If (tpHecho > bpCuenta.Value) Then bpCuenta.Value = tpHecho 'If (cuenta = carga) Then Temporizador.Stop() End Sub
Añada a la clase DlgRangos un controlador de eventos ValueChanged que responda que responda a las variaciones del cuadrado de desplazamiento que el usuario haga sobre la barra de desplazamiento y compételo como se indica:
'Private Sub bdhIntervalo_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bdhIntervalo.ValueChanged ' Temporizador.Interval = 10 * desIntervalo.Value 'End Sub
El valor inicial para la propiedad Interval lo podemos establecer en el método que responda al evento Load del formulario:
Private Sub DlgRangos_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Temporizador.Interval = 10 * desIntervalo.Value End Sub