miércoles, 19 de enero de 2011

Eventos y Delegados en C# y controles en tiempo de ejecusion

Un delegado es un tipo especial de clase cuyos objetos pueden almacenar referencias a uno o más métodos de tal manera que a través del objeto sea posible solicitar la ejecución en cadena de todos ellos.

Los eventos proporcionan un medio de que una clase u objeto informe a otras clases u objetos cuando sucede algo relevante. La clase que envía (o produce) el evento recibe el nombre de editor y las clases que reciben (o controlan) el evento se denominan suscriptores.

En una aplicación de formularios Windows Forms o Web en C# típica, se suscribe a eventos generados por controles como botones y cuadros de lista. Puede utilizar el entorno de desarrollo integrado (IDE) Visual C# para examinar los eventos que publica un control y seleccionar los que desea controlar. El IDE agrega automáticamente un método de controlador de eventos vacío y el código para suscribirse al evento.

Como seguro ya saben un botón o cualquier otra herramienta agregada a un Form e incluso el propio Form contienen varios eventos posibles 

y también sus eventos predeterminados que son los que se toman cuando se le da doble click al diseño como por ejemplo el uso predeterminado del boton (button) es que alguien le de click por lo tanto el evento predeterminado es  Click, el del form es load, que se se activa al cargarse la ventana, el del texbox es TextChanged y asi sucesivamente.

Sólo damos doble click a la herramienta en modo diseño y ya podremos programar lo que ara si la accion prodeterminada es ejecutada o seleccionamos otro evento de la lista, pero lo que realmente pasa es una cuestion de delegados y eventos

Si le doy doble click a mi boton en modo diseño; el resultado seria que me me crearia un delgado que recibe una funcion para saber que hacer cuando se dispare el evento en en archivo Form.Designer.cs llamando al evento button1_Click y seria algo asi:


this.button1.Click+=new System.EventHandler(this.button1_Click)


La palabra this se refiere al form en donde esta.

Se pone += para que los delegados acepten más de una ocurrencia de uno o más eventos.


y en el archivo Form1.cs nos crearia el evento button1_Click con sus argumentos por default:


        private void button1_Click(object sender, EventArgs e)
        {
                // aquí ira el código correspondiente que queremos que se ejecute
        }

y estos 2 códigos están asociados por eso es que si se borra el segundo  programa mandara error puesto que se debe borrar el otro código también y si se borra el primero el programa no ejecutara el código especificado para la acción de ese botón.



Creación de controles en tiempo de ejecución


hay veces que no todas las herramientas las debemos de poner en tiempo de diseño puesto que talves no sean requeridas y talves si, entonses el usuario diria si son requeridas o no.


Agamos un ejemplo super sencillo:
Colocaremos un boton que al apretarlo nos saldra un saludo de hola  programado en tiempo diseño.


En el form del modo diseño damos doble clik derecho en el evento Form1_Load ponemos lo siguiente:


private void Form1_Load( object sender, EventArgs e ) 
{
     // Declaramos el objeto Button
     Button MiBoton = new Button(); 
     // Declaramos un nombre al control (si queremos)
     MiBoton.Name = "btn1"
     // Cambiamos algunas de sus propiedades 
     MiBoton.Text = "Ejemplo de Botón"
     MiBoton.Top = 50; 
     MiBoton.Left = 50; 
     MiBoton.Width = 200; 
     MiBoton.Height = 50; 
     // Añadimos el control al Formulario 
     this.Controls.Add(MiBoton); 
}

ahora veremos que si nos vamos al modo diseño no nos aparece ningun boton nuevo pero si ejecutamos el programa ahi estara nuestro boton.


Ahora para que el mensaje salga al dar click al botón dentro del evento donde declaramos el botón escribimos:
el_nombre_del_boton_o_herramienta + . + Evento + +=  + new + delegado_Correspondiente + (nombre_del_evento_a_accionar);

Ay muchos delegados según el evento pero no hay que sabérselos de memoria ya que el intelligence de Microsoft visual studio te dirá cual es el apropiado.


Quedando así el código completo:

private void Form1_Load(object sender, EventArgs e)
{
    // Declaramos el objeto Button
    Button MiBoton = new Button();
    // Declaramos un nombre al control (si queremos)
    MiBoton.Name = "btn1";
    // Cambiamos algunas de sus propiedades
    MiBoton.Text = "Ejemplo de Botón";
    MiBoton.Top = 50;
    MiBoton.Left = 50;
    MiBoton.Width = 200;
    MiBoton.Height = 50;
    // Añadimos el control al Formulario
    this.Controls.Add(MiBoton);
    // Hacemos el delegado que llamara al evento en caso de que se haga clik al botón
    MiBoton.Click += new EventHandler(clik_en_mi_boton);
}

// Ahora escribimos el codigo del evento clik_en_mi_boton
private void clik_en_mi_boton (object sender, EventArgs e)
{
    MessageBox.Show("hola programadores del C#");
}

Y listo ahora si corremos con F5 y ya esta nuestro boton con su evento programado.

Un ultimo ejemplo sencillo antes de ver otra cosa será una aplicasion para el manejo de eventos de varios elementos.

Agamos una lista de botones en tiempo de ejecusion y cada boton con su respectivo mensaje en su evento clik.

private void Form1_Load(object sender, EventArgs e)
{
    // hacemos un recorrido porque vamos a hacer 5 botones
    for (int i = 0; i < 5;i++ )
    {
        // creamos un nuevo boton
        Button MiBoton = new Button();
        // le asignamos algunas propiedades a los botones
        MiBoton.Text = string.Format("Botón {0}",i.ToString());
        MiBoton.Name = string.Format("Mi botón {0}",i.ToString());                
        MiBoton.Location = new Point(50 , 22 + (i * 25));
        // asignamos un delegado y un evento
        MiBoton.Click += new EventHandler(MiBoton_Click);
        //
        this.Controls.Add(MiBoton);
    }
}
private void MiBoton_Click(object sender, EventArgs e)
{
    //Mandamos el mensaje segun el nombre del botón que se presiona
    MessageBox.Show( ((Button)sender).Name.ToString() );
}

Este código creara 5 botones en tiempo de ejecusion y cada uno con su respectiva funcion.

Ahora para ver la verdadera utilidad de este tema les compartire el navegador antes hecho pero ahora con pestañas y una que otra utilidad que no hubiera sido posible sin estos conocimientos








Link de descarga: https://www.mediafire.com/?1xbgzd2f076592t
viene una carpeta con el codigo completo, y si nadamas quieren ver como funciona diríjanse a "Navegador\Navegador\bin\Debug" ahi hay un ejecutable con icono de un mundo


todavia le faltan algunas cosas para ser un buen navegador pero ya es un avance.


Tambien les dejo unos iconos para sus aplicasiones:
 http://www.megaupload.com/?d=8F3T4WPZ




y unos PNGs que igual les pueden ser utiles en caso de que les interese:
http://www.megaupload.com/?d=DXYB8TTA

miércoles, 5 de enero de 2011

Execpciones en C#

Hay veces en que el usuario no ingresa el dato adecuado a nuestra aplicación lo cual provocara un error en el código, Para evitar eso o manejarlo tenemos las Excepciones.


Las Excepciones son los posibles errores que tenemos o tiene los usuarios.
como ejemplo podemos veamos el siguiente codigo:


int x = int.Parse("r");


Sabemos que eso es imposible y va a interrumpir nuestro programa advirtiendo que hay un error y nos aventara el nombre del error o la Excepcion: FormatException.




Entonces la forma de actuar contra esos posibles errores son dos comandos: 


try {codigo}-> prueba si puede ejecutar la operación y si es así: la ejecuta.


catch (Exception ex) {codigo alternativo} -> captura la Excepcion en caso de que el try aya fallado y la asigna a una variable y luego ejecuta el codigo alternativo.


Ejemplo de  código para tratar un codigo con error:

       int x;
            try
            {
                x = int.Parse("r");
            }
            catch (FormatException ex)
            {
                MessageBox.Show(ex.Message);
            }

Este código nos imprimirá el mensaje del error pero igual podemos mandar a imprimir nuestros propios mensajes:

            int x;

            try
            {
                x = int.Parse("r");
            }
            catch (FormatException ex)
            {
                MessageBox.Show(“El formato introducido es incorrecto”);
            }


Lo mismo si se quiere hacer una división entre 0, nos dará una Excepcion: DivideByZeroException; así que el código seria algo así:

            int a = 10;

            int b = 0;
            int r;
            try
            {
                r = a / b;
            }
            catch (DivideByZeroException ex)
            {
                MessageBox.Show("No es posible dividir entre cero");
            }

y hay una gran multitud de excepciones posibles y si se desea cubrir todas de una sola vez se utiliza le excepcion Exception.


Vídeo explicativo: