martes, 17 de junio de 2014

El Demo del Día: Animación usando Sprites en Windows Forms

Animación usando Sprites en Windows Forms

El Demo de hoy es una animación en Windows Forms usando un sprite o archivo con una secuencia de imagenes. Los sprites permiten reducir el numero de accesos a archivos para una aplicación que trabaja con imagenes, sobre todo es muy usado en los juegos.

Paso 1: Archivo con el Sprite a Animar

En este ejemplo tenemos un archivo llamado "Caminante.jpg" que tiene 3 filas x 6 columnas, es decir 18 cuadros, pero en este caso solo hay 14 imágenes diferentes. La primera fila tiene 6 imágenes con posiciones hacia la derecha y la segunda fila tiene 6 imágenes con posiciones hacia la izquierda.
El archivo tiene una dimensión de 624 x 450 pixeles por lo que cada imagen seria de 104 de ancho por 150 de alto.



Paso 2: Diseño del Formulario Windows Forms en .NET

Debemos crear una Aplicación en C# para Windows Forms llamada: "Animacion_Sprite" y renombrar el formulario a "frmCaminante".
Primero agregar un control PictureBox llamado "picCaminante" de tamaño "50x50", luego 2 controles RadioButton: "rbDerecha" y "rbIzquierda".
Finalmente, agregar un Timer llamado: "tmrAnima" con la propiedad Enable en "true" y el Interval en "100" milisegundos, tal como se muestra en la figura:



Paso 3: Código del Formulario en C# .NET

Escribir el siguiente código en el formulario, la función cargarImagen esta asociada al evento "load" del formulario y la función "animarCaminante" esta asociado al evento "Tick" del Timer. Además la función "caminarDerecha" esta asociada al radio button "rbDerecha" y la función: "caminarIzquierda" esta asociada al radio button "rbIzquierda".

    public partial class frmCaminante : Form
    {
        Bitmap bmp;
        Rectangle rect;
        int posX,posY,x,c;

        public frmCaminante()
        {
            InitializeComponent();
        }

        private void cargarImagen(object sender, EventArgs e)
        {
            bmp = new Bitmap("Caminante.png");          
        }

        private void animarCaminante(object sender, EventArgs e)
        {
            rect = new Rectangle(posX, posY, 104, 150);
            picCaminante.Image = bmp.Clone(rect, bmp.PixelFormat);
            if (rbDerecha.Checked) animarDerecha();
            if (rbIzquierda.Checked) animarIzquierda();
        }

        private void animarDerecha()
        {
            posX += 104;
            c++;
            picCaminante.Left = x;
            if (x <= this.Width) { x += 10; }
            else { x = -picCaminante.Width; }
            if (c == 5)
            {
                c = 0;
                posX = 104;
            }
        }

        private void animarIzquierda()
        {
            posX += 104;
            c++;
            picCaminante.Left = x;
            if (x>-picCaminante.Width) { x -= 10; }
            else { x = this.Width; }
            if (c == 5)
            {
                c = 0;
                posX = 104;
            }
        }

        private void caminarDerecha(object sender, EventArgs e)
        {
            if (rbDerecha.Checked)
            {
                c = 0;
                posX = 104;
                posY = 0;
            }
        }

        private void caminarIzquierda(object sender, EventArgs e)
        {
            if (rbIzquierda.Checked)
            {
                c = 0;
                posX = 104;
                posY = 150;
            }
        }
    }

Paso 4: Ejecución del Formulario Windows Forms

Después de escribir el código de arriba, crear el archivo: "Caminante.jpg" en la carpeta bin/Debug de la aplicación y ejecutar pulsando F5. Por defecto la animación se inicia a la derecha, para cambiar seleccionar el radio button.


Descarga:
Demo04_Animacion_Sprite

Libro La Biblia de Visual Basic .NET - Preguntas de Repaso - Capítulo 4

Preguntas de Repaso: Desarrollando Aplicaciones Windows Forms

1.    Cual es la ventaja de crear aplicaciones Windows con Windows Forms?

2.    Qué propiedades del formulario deben configurarse para que no pueda modificarse de tamaño?

3.    Qué propiedad del formulario debe configurase para mostrar en el formulario un gráfico en forma de elipse o cualquier forma deseada?

4.    En qué evento del formulario debe programarse la creación de un gráfico?

5.    Menciona 3 controles básicos de Windows Forms.

6.    Qué propiedad del control TextBox permite limitar la cantidad de caracteres ingresados?

7.    De qué formas puede crearse un TextBox que permita ingresar una contraseña o password?

8.    Qué debe hacerse para que al dar Enter sobre cualquier control de entrada se dispare el procedimiento asociado al clic de un botón?

9.    De forma similar, qué debe hacerse para que al pulsar la tecla Escape se dispare el procedimiento asociado al clic de un botón de salida?

10. Qué se debe configurar en un control Label para que muestre el símbolo & como un carácter mas o literal.

11. Menciona 3 controles de listas de Windows Forms.

12. Cuál es la propiedad más importante de los controles de listas?

13. Menciona 3 métodos de la propiedad Items para manejar listas.

14. Menciona el evento más importante en el cual generalmente se programa cuando se selecciona un elemento de una lista.

15. Cuál es la forma mas recomendada de llenar los elementos de una lista.

16. Si la lista se va a llenar elemento por elemento qué métodos debe usarse antes y después de llenar la lista para evitar escribir cada elemento en pantalla?

17. Menciona los 2 controles de vistas en Windows Forms.

18. Cuál es la propiedad más importante del control TreeView?

19. Cuál es la propiedad más importante del control ListView?

20. Cuáles son las vistas que puede presentar el control ListView?

21. Cuáles son las propiedades donde se configuran las imágenes a mostrar en un ListView?

22. Cómo se llama el control Windows Forms que permite dividir el formulario en 2 partes, por ejemplo para separar a un TreewView de un ListView?

23. Qué control permite guardar una colección de imágenes?

24. Qué es un formulario MDI y cómo se crea en Windows Forms?

25. Cómo se puede cambiar el fondo de un formulario MDI?.

26. Qué propiedad del formulario MDI padre indica la cantidad de formularios hijos activos?

27. Qué bede configurarse en Visual Studio para trabajar con un formulario Login que al auntenticarse se cierre y abra un formulario MDI que cuando se cierre finalize toda la aplicación?.

28. Cúantos tipos de menús hay y cómo se crean en Windows Forms?

29. Qué propiedad es necesario configurar de un control para que se muestre un menú contextual?

30. Cómo se puede cargar dinámicamente un formulario teniendo como dato su nombre?

31. Qué tipo de control permite agregar cualquier control como opción o elemento de un menú?

32. Cómo se llama el control de Windows Forms que muestra un calendario con los días de un mes?

33. Menciona los 5 diálogos comunes de Windows que son componentes de Windows Forms.

34. Cómo se llama el método común que tienen todos los diálogos de Windows que permiten mostrar el diálogo en pantalla?

35. Qué propiedades comunes tienen los diálogos de archivos OpenFile Dialog y SaveFileDialog en Windows Forms?

36. Cuál es la propiedad más importante del diálogo de color?

37. Cuál es la propiedad más importante del diálogo de fuente?

38. Cómo se llama el diálogo que permite mostrar directorios?

39. Menciona las barras que se pueden crear en Windows Forms.

40. Cómo se llama la colección de elementos que tienen ambas barras en Windows Forms?

41. Qué tipo de ToolStripItem tiene la Barra de Herramientas que no tiene la Barra de Estado?

42. Cuál es el control mas usado para presentar una lista de datos en Windows Forms?

43. Menciona 3 propiedades Allow del control DataGridView de Windows.

44. Qué pasos debe realizar para crear un DataGridView con columnas personalizadas?

45. Menciona los 5 tipos de columnas personalizadas que puede tener el DataGridView.

46. Cómo se llama la propiedad de la columna personalizada que especifica que dato (campo o propiedad) vamos a presentar?

47. Qué pasos debe realizar para crear un DataGridView con una columna que muestre una imagen?

48. En qué evento del DataGridView hay que programar para formatear las columnas del control?

49. Cómo se configura el tamaño de la imagen mostrada en la columna del DataGridView?

50. En qué evento del DataGridView hay que programar para personalizar las cabeceras del control?

51. Cómo se crea un gráfico personalizado dentro de una columna del control GridView?

52. Para qué se usa el modo Virtual del DataGridView?

53. Qué propiedades del DataGridView hay que configurar para crear una paginación de datos?

54. En qué evento del DataGridView hay que programar para mostrar los valores de las celdas en una paginación?

55. Qué método del DataGridView hay que invocar para actualizar los valores de las celdas mostradas en la paginación?

56. Cómo se clasifican los controles que se pueden crear en Windows?

57. Qué tipo de control crearía si desea aumentar las características de un control existente en Windows Forms?

58. Qué tipo de control crearía si desea usar varios controles de Windows?

59. De qué clase hereda el control personalizado o dibujado?

60. Mencione 3 formas de crear un reporte en Windows Forms.

61. Para qué se usa la clase PrintDocument y en qué espacio de nombres se encuentra?

62. En qué evento de la clase PrintDocument se tiene que escribir código para crear la pagina a imprimir?

63.  Menciona el control y los 3 diálogos que se pueden asociar a la clase PrintDocument para crear reportes.

64. Cuál es la diferencia entre el control PrintPreviewControl y el diálogo PrintPreview al crear la vista preliminar del reporte?

65. En qué consiste los Informes de Microsoft y cuáles son sus dos componentes principales?

66. Para qué sirve el control ReportViewer?

67. Cuáles son las barras de herramientas que se usan en el diseñador de informes de Microsoft.

68. Qué propiedades del control ReportViewer deben configurarse para mostrar un reporte de datos?

69. A qué formatos puede exportar el ReportViewer?

70. Cuál es la diferencia entre crear un gráfico en Excel o usar el control Chart?

71. Qué propiedades son las más importantes de la clase Chart?

72. En qué espacio de nombres se ubica la clase Chart?

El Libro del Día: Pro HTML5 with Visual Studio 2012

El Libro del Día: 2014-06-17

Titulo: Pro HTML5 with Visual Studio 2012
Autor: Mark J Collins
Editorial: Apress
Nro Paginas: 409

Capítulos:
Part 1: What is HTML5?
Chapter 1: Before You Begin
Part 2: Using the New HTML5 Features
Chapter 2: ASP.NET Web Forms
Chapter 3: MVC Web Applications
Chapter 4: Cascading Style Sheets
Chapter 5: Scripting Enhancements
Chapter 6: Mobile Web Applications
Part 3: Developing with HTML5
Chapter 7: Supporting Older Browsers
Chapter 8: Audio and Video
Chapter 9: Scalable Vector Graphics
Chapter 10: Canvas
Part 4: Digging Deeper
Chapter 11: Indexed DB
Chapter 12: Geolocation and Mapping
Chapter 13: WebSockets
Chapter 14: Drag and Drop
Appendix A: Chapter 4 - Sample Content
Appendix B: Chapter 4 – Completed Style
Appendix C: Chapter 14 – Final Code

Descarga:
ProHTML5_VisualStudio2012

lunes, 16 de junio de 2014

El Demo del Día: Convertir DataTable en Lista de Objetos y Viceversa

Convertir DataTable en Lista de Objetos y Viceversa

Cuando trabajamos en forma distribuida, usamos Librerías, Clases y Métodos, algunos trabajamos con Listas de Objetos y otros con DataTables y DataSets. En ambos casos, muchas veces necesitamos la funcionalidad de la otra estructura de datos, por ejemplo si usamos Listas de Objetos y queremos migrar o insertar gran cantidad de datos hacia SQL Server mejor sería usar SqlBulkCopy, pero el metodo WriteToServer necesita como parámetro un DataTable, es por eso que presento un par de métodos que permiten realizar el cambio de uno a otro para cuando se necesite.

Paso 1: Crear una Clase Genérica para crear los Métodos que usen la Lista de Objetos
using System.Reflection;
using System.Data;

namespace Conversion_DataTable_Lista
{
    public class ucTablaLista<T>
    {
    }
}

Paso 2: Función Genérica para Convertir un DataTable en Lista de Objetos
        public static List<T> TablaALista(DataTable tabla)
        {
            List<T> lista = new List<T>();
            Type tipo = typeof(T);
            object obe = null;
            string tipoDato;
            string campo;
            for (int i = 0; i < tabla.Rows.Count; i++)
            {
                obe = Activator.CreateInstance(tipo);
                for(int j=0;j<tabla.Columns.Count;j++)
                {
                    campo = tabla.Columns[j].ColumnName;
                    tipoDato = tabla.Columns[j].DataType.ToString().ToLower();
                    if (tipoDato.Contains("int16")) obe.GetType().GetProperty(campo).
                      SetValue(obe, (short)tabla.Rows[i][j]);
                    else
                    {
                        if (tipoDato.Contains("int32")) obe.GetType().GetProperty(campo).
                          SetValue(obe, (int)tabla.Rows[i][j]);
                        else
                        {
                            if (tipoDato.Contains("decimal")) obe.GetType().GetProperty(campo).
                              SetValue(obe, (decimal)tabla.Rows[i][j]);
                            else obe.GetType().GetProperty(campo).SetValue(obe,
                              tabla.Rows[i][j].ToString());
                        }
                    }                  
                }
                lista.Add((T)obe);
            }
            return (lista);
        }

Paso 3: Función Genérica para Convertir una Lista de Objetos en DataTable
        public static DataTable ListaATabla(List<T> lista)
        {
            DataTable tabla = new DataTable();
            //Crear la Estructura de la Tabla a partir de la Lista de Objetos
            PropertyInfo[] propiedades =  lista[0].GetType().GetProperties();
            for (int i = 0; i < propiedades.Length; i++)
            {
                tabla.Columns.Add(propiedades[i].Name, propiedades[i].PropertyType);
            }
            //Llenar la Tabla desde la Lista de Objetos
            DataRow fila = null;
            for (int i = 0; i < lista.Count; i++)
            {
                propiedades = lista[i].GetType().GetProperties();
                fila = tabla.NewRow();
                for (int j = 0; j < propiedades.Length; j++)
                {
                    fila[j] = propiedades[j].GetValue(lista[i], null);
                }
                tabla.Rows.Add(fila);
            }
            return (tabla);
        }

Paso 4: Crear una Clase Entidad para Almacenar los Productos
    public class beProducto
    {
        public int ProductID { get; set; }
        public string ProductName { get; set; }
        public int SupplierID { get; set; }
        public int CategoryID { get; set; }
        public decimal UnitPrice { get; set; }
        public short UnitsInStock { get; set; }
    }

Paso 5: Crear un  Formulario con una Grilla que pueda usar las 2 Funciones
Asumiendo que las 2 funciones estáticas fueron creadas en una clase llamada "ucTablaLista" y hemos creado un formulario llamado: "frmProducto" conteniendo un control DataGridView llamado: "dgvProducto" y 2 botones llamados: "btnDataTableALista" y "btnListaADataTable", tal como se muestra en la siguiente imagen:


Escribir el siguiente código en el formulario:

public partial class frmProducto : Form
    {
        private DataTable tabla;
        private List<beProducto> lista;

        public frmProducto()
        {
            InitializeComponent();
        }

        private void listarProductos(object sender, EventArgs e)
        {
            using (SqlConnection con = new SqlConnection("uid=UsuarioNW;pwd=123456;
            data source=NombreServidor;initial catalog=Northwind"))
            {
                try
                {
                    tabla = new DataTable();
                    lista = new List<beProducto>();
                    con.Open();
                    SqlDataAdapter dap = new SqlDataAdapter("Select ProductID,ProductName,
                      SupplierID,CategoryID,UnitPrice,UnitsInStock From Products", con);
                    dap.Fill(tabla);
                    dgvProducto.DataSource = tabla;
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
        }

        private void btnDataTableALista_Click(object sender, EventArgs e)
        {
            lista = ucTablaLista<beProducto>.TablaALista(tabla);
            dgvProducto.DataSource = lista;
            this.Text = String.Format("Objetos en la Lista: {0}", lista.Count);
        }

        private void btnListaADataTable_Click(object sender, EventArgs e)
        {
            tabla = ucTablaLista<beProducto>.ListaATabla(lista);
            dgvProducto.DataSource = tabla;
            this.Text = String.Format("Filas en la Tabla: {0}", tabla.Rows.Count);
        }
    }

Paso 6: Ejecutar la aplicación y Probar
Para ejecutar la aplicación se tiene que cambiar la cadena de conexión: usuario, password y nombre del servidor, la base de datos usada es Northwind.


Descarga:
Demo03_Conversion_DataTable_Lista

Libro La Biblia de Visual Basic .NET - Preguntas de Repaso - Capítulo 3

Preguntas de Repaso: Accediendo a Datos con ADO .NET

1.    Qué es ADO .NET?

2.    Cuáles son los 2 componentes principales de ADO .NET?

3.    Menciona los 2 proveedores nativos de datos de ADO .NET.

4.    Menciona los 2 proveedores generales de datos de ADO .NET.

5.    Menciona las clases que debe implementar todo proveedor de datos?

6.    Porqué es importante  la cadena de conexión y con qué propiedad de la clase Connection se define?

7.    Cómo sería la cadena de conexión a una base de datos de SQL Server que tiene seguridad de Windows y hay una sola instancia instalada.

8.    Qué proveedor de datos se usa para conectarse a una base de datos de MS Access, un archivo de MS Excel o un archivo DBF?

9.    En qué se diferencia la cadena de conexión a una base de datos de MS Access de la de un archivo Excel?

10. Cómo se puede obtener las tablas de una base de datos de MS Access o las hojas de un archivo de MS Excel?

11. Cuál es la forma más eficiente de copiar gran cantidad de datos hacia SQL Server?

12. Con qué clase de .NET se implementa la copia masiva hacia una base de datos de MS SQL Server?

13. Con qué método de la clase Command se ejecutan comandos de selección de un valor?

14. Con qué método de la clase Command se ejecutan comandos de selección de una fila?

15. Con qué método de la clase Command se ejecutan comandos de selección de varias filas?

16. Con qué método de la clase Command se ejecutan comandos de selección de varias conjuntos de filas?

17. Cómo se llama la clase que permite almacenar una sola fila a la vez?

18. Cuál es la diferencia entre un DataReader y un DataSet?

19. Cómo se controlan los nulos mediante el DataReader?

20. Con qué método de la clase DataReader se puede leer el siguiente conjunto de registros en caso de ser varios Select?

21. Con qué método de la clase Command se ejecuta un comando que inserta, actualiza o elimina registros?

22. Qué es un DataSet y para que sirve?

23. Cuáles son los elementos de un DataSet?

24. Para que sirve el DataAdapter?

25. Con qué método del DataAdapter se crea un tabla en el DataSet desde un origen de datos?

26. Cómo se crea una vista o DataView?

27. Con qué propiedad del DataView se filtran registros?

28. Con qué propiedad del DataView se ordenan registros?

29. Con qué método del DataView se busca un registro por una clave?

30. Qué debe hacerse al DataView antes de realizar una búsqueda, sino se genera una excepción?

31. De qué formas se puede eliminar registros de un DataTable?

32. Cómo se pueden obtener los cambios realizados en un DataTable o DataSet antes de enviarlos hacia la base de datos?

33. Con qué método del DataAdapter se envían los cambios de regreso a la base de datos?

34. Cuál es la ventaja de trabajar desconectado usando Listas de Objetos en vez del DataSet?

35. Cómo se filtran objetos de una lista de objetos?

36. Cómo se ordenan objetos de una lista de objetos?

37. Cómo se buscan datos en una lista de objetos?

38. Menciona 3 métodos extendidos que permitan realizar cálculos en listas de objetos.

39. Para qué sirve LINQ y Cuántos tipos de LINQ existen?

40. De qué formas podemos acceder a bases de datos con LINQ?

41. Qué clases implementan LINQ a DataSets?

42. De qué formas se puede escribir la sintáxis de LINQ a DataSets?

43. Qué herramienta del Visual Studio se usa para implementar muchas características de LINQ a SQL?

44. Qué tipo de operaciones se pueden realizar con LINQ a SQL?

45. Qué es ADO .NET Entity Framework?

46. A qué convierte LINQ a Entidades las consultas de LINQ.

47. Cuáles son los pasos para crear y ejecutar una consulta de LINQ a Entidades?.