Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Proyectos Visuales en Csharp PDF
Proyectos Visuales en Csharp PDF
Como normas fundamentales de planificacin de un proyecto, vemos unos cuantos detalles a la hora de
generar un proyecto de este tipo (y de otros):
?
Siempre hay que poner la solucin en un sitio conocido y adecuado, no en el sitio por defecto
que propone el entorno.
No hay que dejar los nombres por defecto, tales como Solution1, Application1, etc. Cuando
tengamos varios proyectos no habr manera de identificarlos con las carpetas ni con sus
nombres, y todos parecern iguales.
No es buena idea meter en la misma carpeta la solution y el project. Hay que generar una
carpeta independiente para el proyecto, dentro de la carpeta de la solucin. Lo ms normal es
que una solution tenga varios proyectos, y que uno de ellos comparta el sitio con ella, sea cual
sea, no es lo ms indicado.
En general, cuando se dan de alta elementos de un proyecto o una solution mediante los
asistentes, hay que poner nombres a todo, porque si no, luego cuesta mucho ms el cambiarlos
una vez que se han generado.
Una vez generada la solution y el proyecto, tendremos una pantalla como la siguiente:
Lo primero que hemos de hacer es dar un nombre adecuado al formulario. No es bueno que los
formularios de un proyecto se llamen Form1, Form2, etc.
Hemos de cambiar su nombre (propiedad (name), tal como se ve en la pantalla anterior).
Hemos de cambiar el nombre del fichero donde se va a guardar.
En este caso, el formulario se va a llamar Principal, y su fichero ser Principal.cs
Hay que cambiar un pequeo detalle en el cdigo:
Hay que cambiar el new Form1() por un new Principal, ya que hemos cambiado el nombre al
formulario.
Es importante hacer estas tareas al principio, antes de todo lo dems, porque si no, luego tendremos un
montn de funciones con nombre que hacen referencia a Form1, y ser mucho ms complicado.
Ahora estamos en disposicin de ver como funciona nuestro proyecto. Ejecutndolo, aparecer un
programa totalmente vaco:
Para cambiar la vista de edicin entre el diseo del formulario y el cdigo, en la ventana de la solucion
tenemos los siguientes botones:
formulario
son
bastante
Name
Es el nombre del formulario. Todo formulario tiene que tener un nombre decente, no Form1, o Form2,
hay que cambiarlo siempre.
FormBorderStyle
Es el estilo del borde del formulario. Los valores ms usados son:
- Sizeable: El usuario puede cambiar el tamao del formulario durante la ejecucin del programa.
- FixedDialog: El tamao del formulario en ejecucin es fijo, no se puede modificar.
En general, no se debe dejar como sizeable un formulario que no resizee su interior convenientemente
al cambiar de tamao, da muy mala imagen y sensacin de dejadez y poca profesionalidad.
GridSize
Es el tamao de separacin entre los puntitos que aparecen en tiempo de diseo y que valen para
colocar alineados los componentes dentro del formulario. Normalmente, un valor de 4x4 es mucho ms
adecuado que el de 8x8 que aparece por defecto.
Icon
Es el icono del formulario (dibujito superior izquierdo). En un proyecto solo ha de tener icono el
formulario principal, o bien los formularios MDIChild si es un proyecto MDI. En el resto de formularios
hay que quitar el icono, queda muy feo un formulario de interaccin con el usuario con un dibujo por
defecto que no vale para nada.
MaximizeBox
MinimizeBox
Sirven para hacer aparecer o desaparecer los botones de maximizado y minimizado en el borde
superior derecho de la pantalla. En un formulario fijo, estos botones se han de quitar, no pintan nada y
hace muy feo que queden alli.
Size
Define el tamao del formulario. Normalmente es mejor ajustar su tamao estirandolo directamente con
el raton, pero si queremos que mida algo exacto, se pueden fijar en esta propiedad los valores.
StartPosition
Dice la posicin del formulario con respecto a la pantalla y al formulario que lo activa. Por defecto, esta
propiedad vale WindowsDefaultLocation. No se debe dejar as. Los valores adecuados son:
- CenterScreen: El formulario aparece centrado en la pantalla
- CenterParent: El formulario aparece centrado en el que lo activ.
Text
Es el texto del titulo del formulario
WindowState
Para formularios sizeables, esta propiedad permite decidir si el formulario aparecer de alguna de las
siguientes maneras:
- Normal: En el tamao en que ha sido dibujado
- Maximized: Ocupando toda la pantalla del ordenata.
- Minimized: Iconizado en la barra de tareas.
Existen propiedades de aspecto del formulario, tales como:
-
BackColor
BackgroundImage
ForeColor
Font
Opacity
TransparencyKey
TopMost
Estas propiedades son muy majas de probar (fuentes, colores, etc). Sin embargo no deben ser
cambiadas a no se que se quiera indicar algo muy importante con ese cambio. Las pantallas de un
programa han de ser lo ms estndar posible, no deben ser de color rosa, con fuentes raras, ni nada
semejante. Este tipo de cambios exigen una gran coherencia de imagen en todo el proyecto, y
normalmente lo mejor es dejar la apariencia tal cual.
Load
Activated
Deactivate
Closed
Closing
Son eventos que se lanzan al cargar se formulario, al cargarse los controles y activarse, al perder el
foco de activacin, y al descargarse.
Veremos mas adelante un ejemplo de su uso, con un formulario hijo activado especficamente.
Click
DoubleClick
MouseMove
MouseUp
MouseDown
Son eventos que se lanzan al mover el ratn o pulsar los botones del mismo.
KeyUp
KeyDown
KeyPress
Son eventos que se lanzan al pulsar teclas en el teclado. (Atencin a la propiedad KeyPreview).
Paint
Evento lanzado cuando el formulario es repintado por el sistema operativo (estaba debajo de alguna
otra cosa, adquiere visibilidad y debe ser redibujado).
Rezise
Evento lanzado cuando el formulario cambia de tamao.
Primero hemos de atender el evento MouseMove, que es el que se produce cuando el ratn
cambia de sitio.
Hemos hecho doble click sobre el evento que queremos atender, y ha aparecido automticamente la
funcin que se ejecutar cuando se produzca ese evento.
Dentro de la funcin, hemos escrito this.Text = e.X + , + e.Y; que coloca en la propiedad
Text del formulario la coordenada X y la coordenada Y separado por una coma.
El argumento e (de tipo System.Windows.Forms.MouseEventArgs) contiene las propiedades
actuales del ratn, entre las que estn la X y la Y, que son las que hemos utilizado.
Aqu podemos ver que todas las propieadades que hemos establecido en tiempo de diseo, realmente
han sido codificadas dentro del programa por el diseador de formularios. En la ultima linea, podemos
ver como se aade el delegado Principal_MouseMove a la gestion de eventos de MouseMove del
formulario, que es la que realmente codifica la gestion del evento.
this.MouseMove es un array de punteros a funciones, que sern llamadas cuando se produzca el
evento. Tiene sobrecargado el operador +, que permite aadir funciones a este array.
Si queremos eliminar la atencin de este evento, deberemos eliminar esta linea del InitializeComponent,
y luego borrar la funcion Principal_MouseMove. Una alternativa es posicionarnos en el evento (en el
diseo del formulario), hacer botn derecho, y escoger Reset. Esto elimina la agregacin del delegado,
pero todava deberemos eliminar manualmente la funcin Principal_MouseMove.
En tiempo de ejecucin nuestro programa ahora sera el siguiente (vemos como en la barra de ttulo
aparecen las coordenadas del ratn en el momento actual):
Insercin de un men
Vemos que la opcin de men hacer algo nos da un mensaje (observar la llamada a
MessageBox.Show), y que el men Salir termina la ejecucin del formulario (invoca al mtodo Close ()).
Hay que tener cuidado y dar nombres razonables a todos los elementos de men que vayan a ser
utilizados como generadores de eventos. No se deben dejar elementos como MenuItem1, ni cosas por
el estilo, porque despus es muy complicado ver que hace un programa y entenderlo.
Insercin de un botn
Un programa muy sencillo, se puede construir bsicamente con etiquetas, botones y cajas de texto (el
men ya sera algo sofisticado).
El resto de controles no los vamos a comentar en este momento, muchos de ellos son muy intuitivos y
solo hay que probar su funcionamiento, otros, son mas complicados, y seguramente exigirn buscar
informacin sobre ellos. Generalmente, no hay ms que escribir en el Google lo que uno busca, y
aparecen cosas hasta de debajo de las piedras:
Sin embargo, muchas veces es necesario pintar dentro del formulario, visualizar grficas, datos en
forma de matriz, etc.
Vamos a ver ahora un par de tcnicas para conseguir esto:
-
Para dibujar una lnea es necesario definir un Lpiz (se puede reutilizar luego, por supuesto), y
utilizar el mtodo DrawLine del objeto Graphics.
Para dibujar texto hace falta definir una fuente, una brocha, y utilizar el mtodo DrawString.
La clase Graphics tiene muchsimas llamadas, es cuestin de consultarla para ver ms posibilidades.
El aspecto en ejecucin de este programa, una vez pulsado el botn, ser el siguiente:
Sin embargo, ocurre una desgracia irreparable Cuando ocultamos el formulario (poniendo otro
encima, cambiando de tarea), al volver a visualizarlo el dibujo ha desaparecido.
Esto ocurre porque Windows no guarda el contenido de cada ventana cuando deja de estar en el
topmost de pantalla. Si hiciera esto, debera guardar, por ejemplo, para esta ventana, unos 600 x 400
puntos, esto es 240.000, cada punto ocupara 4 bytes, o sea, casi una mega. Se ve que es inviable, si
cada pantalla ocupara una mega de memoria solo para guardar el dibujito, el sistema se colapsara
rpidamente, al activar varios programas.
Por tanto, Windows lanza un evento Paint cuando un control debe ser repintado, por pasar a estar
visible una parte que haba estado oculta anteriormente.
La tcnica de un programa es entonces un poco ms estructurada: No se puede pintar directamente en
pantalla (a menos que no nos importe que se pierda la informacin al ocultarse), sino que se ha de crear
una estructura de datos con la informacin a pintar, y dentro del evento Paint realizar el dibujo de la
misma.
Se puede provocar un repintado invocando al mtodo Invalidate.
El objeto Graphics, para pintar, ya est disponible en el argumento e que llega al evento paint.
El texto que se pinta es el contenido de la caja, para ver como realmente cambia.
Ahora, en el Paint se realiza el trabajo de dibujar, y en el botn simplemente se llama a Invalidate, para
provocar un evento de este tipo.
Cuando el programa se inicia, ya aparece pintada la informacin, porque se produce un evento Paint
justo al dibujarse el control.
Componente DataGrid
Para esta prueba se ha aadido al proyecto una clase Cliente:
using System;
namespace EjemploV
{
public class Cliente
{
private int m_Codigo;
private string m_Nombre;
public Cliente(int Codigo,string Nombre)
{
m_Codigo = Codigo;
m_Nombre = Nombre;
}
public int Codigo
{
get { return m_Codigo; }
set { m_Codigo = value; }
}
public string Nombre
{
get { return m_Nombre; }
set { m_Nombre = value; }
}
}
}
Se puede ver como asocia al datagrid (propiedad DataSource) un DataTable, que contiene la
informacin a mostrar.
Es decir, se trata de crear un DataTable, con sus DataColumn correspondientes, y luego asignarlo al
DataSource del DataGrid para que lo visualice.
Al crear un DataColumn se le ha de indicar el nombre de la columna y el tipo de dato (en este caso son
todas string).
Las propiedades adicionales (PreferredColumnWidth, etc) son para visualizar mejor la informacin.
En este caso, se le asigna al DataGrid un ArrayList, donde cada elemento es de tipo Cliente.
La grid muestra en cada fila un elemento del ArrayList, cada uno con sus datos asociados.
Este programa crea una conexin con una base de datos en SqlServer (Musika).
Crea una consulta sobre la tabla Grupos, buscando los que tengan el nombre empezando por K.
Crea un DataSet y lo llena con la consulta.
Enlaza este DataSet con la Grid, y como se puede ver, aparecen los resultados.
La propiedad Filter (optativa, por defecto muestra todos los archivos) llena el combo inferior (Tipo), y
sirve para filtrar determinadas extensiones y mostrar una leyenda adecuada.
La propiedad Title (optativa, por defecto muestra Abrir), sirve para cambiar el titulo del dilogo.
La propiedad InitialDirectory sirve para establecer el directorio en el que se abre el dialogo.
Devuelve DialogResult.OK si se puls Abrir, DialogResult.Cancel si se puls Cancelar.
La propiedad FileName contiene el nombre del archivo con la ruta completa.
La propiedad FileTitle contiene el nombre del archivo, sin el path.
Una vez aceptado el dilogo, se puede ver el nombre del archivo en la etiqueta inferior:
Control Timer
Le hemos llamado Temporizador, como nombre del objeto insertado.
Sus propiedades ms importantes son:
Enabled
Interval
En el formulario se ha puesto un botn Tiempo, que lo habilita y lo deshabilita, y una etiqueta para ver la
fecha/hora actuales, refrescada en cada evento del temporizador:
private void Tiempo_Click(object sender, System.EventArgs e)
{
Temporizador.Enabled = !Temporizador.Enabled;
Temporizador.Interval = 1000;
}
private void Temporizador_Tick(object sender, System.EventArgs e)
{
lbTiempo.Text = DateTime.Now.ToString();
}
El evento Tick del Timer es el que se enva cada vez que vence la cuenta.