viernes, 30 de mayo de 2014

Aplicaciones de Consola en C# .Net

En Visual Studio .Net siempre se han desarrollado aplicaciones de consola con la finalidad de poder iniciarnos y familiarizarnos con las sentencias y estructuras de la programación .Net

Me acuerdo que la primera vez que empece en la programación .Net (Visual Basic, C#, etc) empezábamos a programar aplicaciones sencillas en consola tipo ventanas de DOS. Era la manera de iniciar al principiante o alumno a poder desarrollar aplicaciones más robustas en .Net.

Siempre vi esta manera de aprender como la mejor forma de iniciarnos en este mundo de la programación, sin embargo nunca me puse a pensar detalladamente lo importante y conveniente que era desarrollar estas pequeñas aplicaciones de consola.

Luego me di cuenta que estas pequeñas aplicaciones (Proyectos) pueden ser utilizados de manera practica y sencilla para poder ser ejecutados como archivos batch (.bat), no deben de ser programados con el propósito de solicitar ingreso de datos, su verdadera finalidad es la de ejecutar secuencia de códigos que realicen por ejemplo un backup. Luego esto puede ser usado conjuntamente con el Programador de tareas para que sean ejecutados automáticamente.

En esta oportunidad les mostrare una aplicación de consola que realiza una copia de seguridad (Backup) de ciertos archivos ubicados en una determinada carpeta de windows. Luego utilizaremos esta misma aplicación conjuntamente con el Programador de Tareas para ejecutarlo a cierta hora y en forma automática.

1. Crear la aplicación de consola
- Abrir el Visual Studio
- Ir al menú Archivo, Nuevo, Proyecto…
Seleccionar la categoría Visua C#, Aplicación de consola
Colocar un nombre (Demo01)y seleccionamos la carpeta de destino para guardar el proyecto, Aceptar

2. Programamos

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO; //Directory, File, Path

namespace Demo01
{
    class Program
    {
        static void Main(string[] args)
        {
            string directorioOrigen = @"C:\ALASDATA\GRAFICOS";
            string[] archivos = Directory.GetFiles(directorioOrigen, "*.*");
            string directorioDestino = @"D:\BACKUPS\";
            if (!Directory.Exists(directorioDestino))
                Directory.CreateDirectory(directorioDestino);        
            string nombreArchivo;
            string archivoDestino;
            foreach (string archivo in archivos)
            {
                nombreArchivo = Path.GetFileName(archivo);
                //archivoDestino = directorioDestino + nombreArchivo;  //Mala practica
                archivoDestino = String.Format("{0}{1}", directorioDestino, nombreArchivo); //Es buena Practica
                if (File.Exists(archivoDestino))
                    File.Delete(archivoDestino);     
                File.Copy(archivo, archivoDestino);
                Console.WriteLine(archivoDestino);
            }
            System.Threading.Thread.Sleep(5000); // 5 segundos
            //Console.Read();
        }
    }
}

Ojo: Después de terminar nuestra aplicación, esta debe de ser compilada para poder crear el ejecutable.

3. Abrimos el Programador de tareas

- Pulsamos las teclas [WIN]+[R] para visualizar la ventana ejecutar
- Digitamos Taskschd.msc y pulsamos aceptar para abrir la ventana del programador de tareas.



- Clic en Crear tarea básica y realizar según las imágenes siguientes


Clic en siguiente, seleccionar en la pantalla siguiente la opción Diariamente, Siguiente
- Luego coloque la fecha y hora que desea que se ejecute el programa, siguiente
- En la siguiente ventana a la pregunta ¿Qué acción desea que realice la tarea? escoja Iniciar un programa, siguiente.
- La última ventana le pedirá que seleccione el programa, este se encuentra ubicado en la carpeta de su proyecto Demo01\Bin\Debug\Demo01.exe, siguiente y finalizar.

Debe tener en cuenta que una vez realizado la aplicación en consola este debe de ser compilada para que se cree el ejecutable dentro de la carpeta bin\debug del proyecto. Además las carpeta física de sus archivos (de Origen) debe de existir en su disco duro. La ruta de las carpetas pueden ser cambiadas a criterio de cada uno.

La aplicación en ejecución se vería algo así:

Aplicación de consola (Backups)
TIP:
@ Este carácter puede ser usado delante de una cadena que esté formado por algún carácter especial como el “\”, con la finalidad de que la aplicación no de error al reconocer al “\” como carácter especial, con eso evitamos adicionar una barra más por cada carácter "\" que tengamos en nuestro código.

miércoles, 28 de mayo de 2014

WinForms - Recursividad en Controles en C# .Net

Quiero compartir con ustedes un ejemplo sobre recursividad en Controles. Debo de ser sincero y decir que muchas veces para limpiar el contenido de diferentes controles (TextBox, CheckBox, etc.) he utilizado el típico borrado individual como:

TextBox1.text ="""
CheckBox.value=False
...etc.

Me preguntaba en algún momento, que pasaría si tuviese un centenar de controles textBox en una aplicación grande... Uhmm tendría que hacerlo uno a uno, podría ser buena idea pero sería algo que me haría perder el tiempo y no sería a la vez lo más optimo.

Es por ello que la codificación que presento es un ejemplo desarrollado por el docente Luis Dueñas Huaroto de quien tuve la oportunidad de aprender muchas cosas que actualmente no enseñan en institutos ni universidades del País.

Bueno el ejemplo es el siguiente y lo pueden ver desde la página del Autor en WinForms - Recursividad en Controles  espero lo prueben y comenten que tal les fue.

Ejemplo

Es común tener Pantallas de Ingreso de Datos con muchos controles, los cuales necesitamos limpiar para realizar un nuevo ingreso, la forma trabajosa de ejecutar este requerimiento seria borrar uno por uno, si son muchos nos demoraríamos demasiado.



Usando la colección controls podemos crear una función genérica que haga dicha labor, pero si el control fuese un contenedor como un GroupBox, Panel, TabControl, etc, necesitamos crear una función Recursiva para recorrer todos los controles incluyendo los contenedores.

Aquí les presento una función recursiva que limpia los controles TextBox, RadioButton y CheckBox de cualquier contenedor.


Por ejemplo sobre un formulario agregar:
- 2 Label
- 2 TextBox
- 2 RadioButton
- 2 CheckBox, luego copiarlos a memoria, agregar un GroupBox y un Panel y pegarlos en ambos.




Finalmente agregar un Botón y en el evento click llamar a la función controladora:

private void limpiarControles(object sender, EventArgs e)
{
     borrarContenidoControles(this);
}

private void borrarContenidoControles(Control contenedor)
{
     foreach (Control control in contenedor.Controls)
     {
         if (control.Controls.Count > 0) borrarContenidoControles(control);
         else
         {
              if (control is TextBox) ((TextBox)control).Clear();
              if (control is RadioButton) ((RadioButton)control).Checked = false;
              if (control is CheckBox) ((CheckBox)control).Checked=false;
         }
    }
}