Académique Documents
Professionnel Documents
Culture Documents
En esta leccin:
1. Programando en Windows
2. Eventos
4. Controles ms comunes
8. Manejo de eventos
1
Aplicaciones con interfaz grfica
Una de las grandes ventajas de trabajar con Windows es que todas las ventanas se comportan de la
misma forma y todas las aplicaciones utilizan los mismos mtodos bsicos (mens desplegables,
botones) para introducir rdenes.
1. Barra de mens
2. Icono de la aplicacin y men de control
3. Barra de ttulo
4. Botn para minimizar la ventana
5. Botn para maximizar la ventana
6. Botn para cerrar la ventana
7. Barra de desplazamiento vertical
8. Marco de la ventana
9. Barra de desplazamiento horizontal
10. rea de trabajo
Programando en Windows
Una aplicacin para Windows presentar una interfaz grfica la que tiene bsicamente dos tipos de
objetos:
2
Ventanas (tambin llamadas formularios).
Controles (botones, cajas de texto, mens, listas, etc.)
Una vez diseada la interfaz grfica, el siguiente paso es escribir el cdigo fuente relacionado con la
funcin que tiene que realizar cada objeto de la interfaz. Por ejemplo, programar un botn para que al
hacer clic sobre l muestre un formulario solicitando unos determinados datos.
Por esto, se dice entonces que la programacin es conducida por eventos y orientada a objetos.
Para programar una aplicacin Windows, hay que escribir cdigo separado para cada objeto en
general, quedando la aplicacin dividida en pequeos procedimientos o mtodos conducidos por
eventos. Ejemplo:
El mtodo btSaludo_Click ser puesto en ejecucin en respuesta al evento Click del objeto
identificado por btSaludo; es decir, que cuando el usuario haga clic en el objeto btSaludo se
ejecutar el mtodo btSaludo_Click.
Esto es justamente lo que est indicando el delegado EventHandler.
El mtodo btSaludo_Click manejar el evento Click de btSaludo.
Eventos
Son mecanismos mediante los cuales los objetos (ventanas o controles) pueden notificar de la
ocurrencia de sucesos.
Cuando ocurre uno de estos eventos, Windows lo transforma en un mensaje que coloca en la
cola de mensajes de la aplicacin implicada.
3
Comienzo Mtodo 1
Mtodo 2
Recuperar Entregar
siguiente informacin
mensaje del mensaje Mtodo 3
Mtodo 4
Salir? No
Si
Fin
En la figura anterior se puede ver de forma grfica como acta el bucle de mensajes mientras la
aplicacin est en ejecucin.
4
base.Dispose(eliminar);
}
Cuando creamos una aplicacin Visual C# con Visual Studio, el cdigo generado aporta
explcitamente el mtodo Main en una clase Program localizada en el fichero Program.cs, pero se
puede personalizar si as lo desea.
Controles ms comunes
Cajas de texto. Se implementan a partir de la clase TextBox las de una sola lnea de texto, las de
varias lneas y las de "palabra de paso".
Primero hay que aadir a la clase del formulario una variable de tipo Label:
etSaludo.Name = "etSaludo";
etSaludo.Text = "etiqueta";
etSaludo.Font = new Font("Microsoft Sans Serif", 14, FontStyle.Regular);
etSaludo.TextAlign = ContentAlignment.MiddleCenter;
5
etSaludo.Location = new Point(53, 48);
etSaludo.Size = new Size(187, 35);
etSaludo.TabIndex = 1;
Controls.Add(etSaludo);
Hay que aadir a la clase del formulario una variable de tipo Button:
btSaludo.Name = "btSaludo";
btSaludo.Text = "Haga &clic aqui";
btSaludo.Location = new Point(53, 90);
btSaludo.Size = new Size(187, 23);
btSaludo.TabIndex = 0;
Controls.add(btSaludo);
Una descripcin abreviada se mostrar cuando el puntero del ratn se site encima del componente.
Primero hay que aadir a la clase del formulario una variable de tipo ToolTip:
El proceso de aadir los componentes resulta muy sencillo cuando utilizamos Visual Studio pues
simplemente tenemos que tomar los componentes de una paleta y dibujarlos sobre el formulario
utilizando el ratn. Esto hace que se aada automticamente todo el cdigo descrito anteriormente.
Manejo de eventos
Cuando una accin sobre un componente genera un evento, se espera que suceda algo, entendiendo
por evento, un mensaje que un objeto enva a algn otro objeto. Esto quiere decir que hay un
remitente del evento, por ejemplo, un botn, y hay un receptor del evento, por ejemplo, la ventana que
contiene ese botn.
6
Lgicamente ese algo hay que programarlo y para ello hay que saber cmo manejar ese evento. Los
eventos que se producen sobre un componente se manipulan a travs de los manejadores de esos
eventos. Un manejador de eventos es un objeto en el que un componente delega la tarea de
manipular un tipo particular de eventos.
evento
Componente Manejador de
ocurrido eventos
Mtodo
(respuesta al evento)
En la figura anterior puede ver que cuando un componente genera un evento, un manejador de
eventos vinculado con el componente se encarga de analizar qu evento ocurri para responder al
mismo ejecutando el mtodo adecuado.
7
ForeColorChanged El color del primer plano de un objeto cambia
MouseUp El puntero del ratn est encima del control y se suelta un botn del
ratn
De arrastrar y soltar
DragEnter Un objeto es arrastrado dentro de los lmites de otro control
8
DragDrop Se completa una operacin de arrastrar y soltar
El primer parmetro del mtodo btSaludo_Click hace referencia al objeto que produce el evento y el
segundo contiene informacin que depende del evento producido.
Para indicar que el mtodo btSaludo_Click es el manejador del evento Click se crea un delegado de
tipo EventHandler, pasndole la direccin del mtodo y aadiendo este delegado a la lista de mtodos
que seran llamados cuando el evento Click sea generado. Para aadir un delegado se utiliza el
operador += y para quitarlo de la lista, el operador -=.
Un delegado es un objeto de una clase que puede contener una referencia a un mtodo (el smil de
esto seran los punteros a funciones de C/C++).
Los controles ms comunes en una aplicacin Windows son: las cajas de texto, las etiquetas y los
botones de pulsacin.
Las cajas de texto, controles TextBox, son importantes porque permiten realizar la entrada de datos
para una aplicacin y visualizar los resultados producidos por la misma.
Las etiquetas, controles Label, son cajas de texto no modificables por el usuario. Su finalidad es
informar al usuario de qu tiene que hacer y cul es la funcin de cada control.
Los botones, controles Button, permiten al usuario ejecutar una accin cuando sea preciso.
Las clases mencionadas, que proporcionan la funcionalidad para los controles descritos, se derivan
directa o indirectamente de la clase Control del espacio de nombres System.Windows.Forms, que
aporta la funcionalidad comn a todos estos controles.
Cuando una ventana tiene uno o ms botones, uno y slo uno de ellos puede ser el botn por
omisin, lo que implica que la tecla Enter realice la misma funcin.
9
Para hacer que un botn sea el botn predeterminado de un formulario, hay que asignar a la
propiedad AcceptButton del formulario el nombre de ese botn. El botn por omisin se distingue de
los dems porque aparece rodeado con un borde ms oscuro.
Tecla de acceso
En la siguiente figura, se puede observar en el ttulo del botn Aceptar, que la letra A aparece
subrayada (si no se ve pulse la tecla Alt). Esto significa que el usuario podr tambin ejecutar la
accin especificada por el botn, pulsando las teclas Alt + A. Esta asociacin tecla-control recibe el
calificativo de nemnico y se realiza escribiendo el smbolo ampersand (&) antes de la letra que desea
d acceso al botn.
El controlador anterior est asociado a una caja de texto cuyo nombre es ctGradosC y ejecutar el
cdigo cuando se produzca el evento KeyPress sobre dicha caja. Es posible asociar un mismo
controlador con varios controles siempre y cuando queramos que se ejecute el mismo cdigo para el
evento producido por los controles.
10
Este controlador recibe un primer parmetro, sender, de tipo object que hace referencia al objeto para
el cual ha sido invocado, y un segundo argumento, e, de tipo KeyPressEventArgs que proporciona las
siguientes propiedades:
Handled. Esta propiedad de tipo bool, permite obtener o establecer si se control (true) o no
(false) el evento KeyPress. Si el evento no est controlado, se enviar al sistema operativo
para que se realice el procesamiento predeterminado.
KeyChar. Esta propiedad de tipo char, permite obtener, y modificar si fuera necesario, el
carcter correspondiente a la tecla pulsada.
Enfocar un objeto
Cuando un control posee el punto de insercin, se dice que dicho control est enfocado o que tiene el
foco.
Un usuario de una aplicacin puede enfocar un determinado control haciendo clic sobre l, o bien
pulsando la tecla Tab una o ms veces hasta situar el foco sobre l.
Asimismo, un control tambin puede ser enfocado desde la propia aplicacin y lo podemos hacer de
dos maneras:
Invocando al mtodo Focus para el control que requiere el foco una vez abierto el formulario.
Este proceso puede realizarse como respuesta al evento Load que se genera cuando se carga
el formulario por primera vez:
11
Seleccionar el texto de una caja de texto
En la mayora de las veces es necesario que cuando una caja de texto obtenga el foco, todo su
contenido quede seleccionado. Esto es fcil si sabemos que cuando un control obtiene el foco, genera
el mensaje foco obtenido (Enter o GotFocus) y cuando lo pierde, foco perdido (Leave o LostFocus).
Por ejemplo:
Otras propiedades/mtodos relacionadas con la seleccin de texto en un control de texto son las
siguientes:
SelectionStart. Propiedad que permite obtener o establecer el punto de inicio del texto
seleccionado en la caja de texto:
TextBox1.SelectionStart = 10;
pos = TextBox1.SelectionStart;
TextBox1.SelectionLength = 5;
n = TextBox1.SelectionLength;
SelectedText. Propiedad que permite obtener el texto seleccionado, o bien reemplazar el texto
seleccionado (puede ser nulo) por otro:
TextBox1.SelectionStart = TextBox1.Text.Length;
TextBox1.SelectedText = NuevoTexto;
Select (int pos_inicial, int pos_final). Selecciona el texto que se encuentra entre las posiciones
especificadas.
12
La propiedad KeyChar se utiliza para comprobar si se presion la tecla Enter. Si se presion, la
propiedad Handled se establece en true, lo que indica que ser nuestra aplicacin la que controlar el
evento, no el sistema operativo.
Si la validacin de los datos se hace despus de pulsar la tecla Enter en la caja de texto, el campo
podra contener un dato no vlido, pero podra ser validado antes de utilizarlo.
En cambio, si la validacin se hace verificando la validez de cada tecla pulsada (eventos KeyPress),
el campo de texto ya estar validado una vez finalizada la entrada.
Cuando una caja de texto tiene el foco y el usuario pulsa una tecla el control genera tres mensajes:
KeyDown, KeyPress y KeyUp.
KeyDown lo genera cuando se pulsa la tecla, KeyPress cuando se va a escribir el carcter y KeyUp
cuando se suelta la tecla.
A diferencia de los eventos KeyDown y KeyUp, el evento KeyPress se genera solamente cuando se
introduce un carcter ASCII. Esta definicin excluye teclas especiales, como teclas de funcin (F1 a
F12), teclas de movimiento del cursor ( ) o la tecla Supr (Del).
El juego de caracteres ASCII incluye todos los caracteres imprimibles, las combinaciones Ctrl+(A-Z) y
otros caracteres estndar como retroceso (ASCII 8 o BackSpace).
Para interceptar cualquier otra tecla o combinacin de teclas que no produzca un cdigo ASCII, se
utilizarn los eventos KeyDown y KeyUp.
Ejemplo: el contenido de la caja de texto ser vlido cuando sus caracteres pertenezcan al siguiente
conjunto: +-.1234567890. El signo + o slo puede aparecer al principio del dato y ste slo puede
contener una coma decimal:
Observe que la tecla pulsada se valida antes de que el procedimiento predeterminado por el sistema
aada el carcter a la caja de texto.
Estos eventos se producen en ese orden cuando el control pierde el foco (porque el usuario puls la
tecla Tab, hizo clic con el ratn en otro control, etc.), siempre y cuando su propiedad
CausesValidation valga true, que es el valor predeterminado.
En el controlador del evento Validating, debe probar una condicin determinada (por ejemplo, probar
si el dato es numrico); esto es, el control se est validando. Si la prueba da error, debe asignar a la
propiedad Cancel del parmetro CancelEventArgs del controlador el valor true. Esto cancela el evento
Validating y devuelve el foco al control.
El resultado es que el usuario no puede dejar el control hasta que los datos sean vlidos,
dependiendo esto de la propiedad AutoValidate del formulario que por defecto vale
EnablePreventFocusChange.
Si la prueba no da error, finaliz la validacin del control, se produce el evento Validate, en cuyo
controlador podremos utilizar el dato validado con toda seguridad.
14
private void CajaTexto_Validating(object sender, CancelEventArgs e)
{
TextBox objTextBox = (TextBox)sender;
try
{
datoCajaTexto = Convert.ToDouble(objTextBox.Text);
}
catch (Exception)
{
e.Cancel = true;
objTextBox.SelectAll();
ProveedorDeError.SetError(objTextBox, "Tiene que ser numrico");
//MessageBox.Show("Tiene que ser numrico");
}
}
El primer argumento del mtodo SetError indica el control para el que se va a establecer la
descripcin del error y el segundo, la cadena de descripcin del error, que puede ser vaca.
Cuando se especifica una cadena de descripcin del error para el control, se muestra un icono junto a
ste. El icono parpadea de la manera que especifica la propiedad BlinkStyle, con la frecuencia que
especifica BlinkRate. Cuando el ratn pase por encima del icono, se mostrar la descripcin del error.
Si lo prefiere, puede notificar el error mediante un dilogo en lugar de utilizar un objeto ErrorProvider.
Si despus de que el usuario haya introducido el dato y pulse la tecla Tab o haga clic en otro control,
la prueba no da error, se produce el evento Validate, en cuyo controlador podremos realizar las
operaciones que sean necesarias. Ejemplo:
Mientras los datos del control que tiene el foco no sean vlidos, no se puede cerrar el formulario por
los mtodos utilizados normalmente.
Si requiere cerrar el formulario aunque contenga datos no vlidos, puede crear un controlador para el
evento Closing del formulario y definir la propiedad Cancel como false. Esto obliga al formulario a
cerrarse. En este caso la informacin de los controles que no se haya guardado se perder.
MaskedTextBox
La clase MaskedTextBox, derivada de TextBoxBase, es un control TextBox mejorado que soporta una
sintaxis declarativa para aceptar o rechazar una entrada del usuario. Utilizando la propiedad Mask, se
puede especificar la siguiente entrada sin escribir una validacin personalizada:
15
El nmero de caracteres requeridos.
Caracteres opcionales.
El tipo de entrada esperada en una posicin determinada; por ejemplo, un dgito, un carcter
alfabtico, o un carcter alfanumrico.
Caracteres que componen la mscara, o caracteres que deberan aparecer directamente en el
control; por ejemplo, el guin ( - ) en una fecha, o el carcter que especifica la moneda
utilizada.
Los caracteres utilizados para componer la mscara que almacenaremos en la propiedad Mask son
los siguientes:
& Carcter; entrada requerida. Si la propiedad AsciiOnly se pone a true; este elemento
se comporta igual que L.
C Carcter; entrada opcional. Cualquier carcter que no sea de control. Si la propiedad
AsciiOnly se pone a true, este elemento se comporta igual que ?.
A Alfanumrico, entrada requerida. Si la propiedad AsciiOnly se pone a true, slo se
aceptarn las letras a-z y A-Z.
a Alfanumrico, entrada opcional. Si la propiedad AsciiOnly se pone a true, slo se
aceptarn las letras a-z y A-Z.
. Marcador de posicin decimal. El carcter que se mostrar (punto o coma decimal)
depender de la cultura actual.
, Separador de millares. El carcter que se mostrar (punto o coma de millares)
depender de la cultura actual.
: Separador de horas, minutos, segundos.
< Cambio a minsculas. Convierte todos los caracteres que le siguen a minsculas.
> Cambio a maysculas. Convierte todos los caracteres que le siguen a maysculas.
Ejemplos:
16
##-???-#### Fecha de la forma: 20-may-2012
##:## ?? Hora de la forma: 12:15 PM
00->L<LL-0000 Una fecha: da, mes abreviado y ao (20-May-2012)
La propiedad PromptChar especifica el carcter utilizado para rellenar las posiciones donde hay que
introducir un carcter (por omisin es _).
IncludeLiterals especifica si Text incluye los caracteres no reemplazables que componen la mscara,
como, por ejemplo, el guin ( - ) en una fecha.
Se puede poner la propiedad BeepOnError a true para avisar al usuario de que el carcter introducido
no es vlido. Tambin se puede utilizar el evento MaskInputRejected para realizar nuestro propio
tratamiento del error.
El constructor Font toma varios parmetros: nombre de la fuente, tamao, estilo, etc. A su vez, el
estilo puede ser: Regular, Bold o Italic, entre otros.
Establecer un color
Todo componente tiene un color de fondo y un color de primer plano. El color de fondo se utiliza para
rellenar los interiores de los componentes y el color de primer plano se utiliza para dibujar sobre el
color de fondo (por ejemplo, el color utilizado para pintar el texto sobre un componente).
Para establecer el color de fondo, utilizaremos la propiedad BackColor del control y para establecer el
color de primer plano, la propiedad ForeColor. Ambas propiedades toman un valor que se
corresponde con un objeto de la clase Color. Ejemplo:
etPantalla.BackColor = System.Drawing.Color.FromArgb(
((int)(((byte)(255)))),
((int)(((byte)(255)))),
((int)(((byte)(192)))));
17
Se puede observar que el mtodo FromArgb utilizado de la clase Color tiene tres parmetros que se
corresponden con tres valores enteros entre 0 y 255, que especifican el nivel de color rojo, verde y
azul, respectivamente. El objeto Color construido, devuelto por FromArgb, representa el color RGB
(Red, Green, Blue) especificado.
18