UrlImage Control 

Como proposito, se intenta tener un control que pueda cargar una imagen en un PictureBox pasandole una direccion de internet (url) de donde tomarla.

Elementos en disenho del control de usuario

 urlImage en disenho

El control consta de 3 PictureBoxes. Dos de ellos se van a usar como ayudas para que guarden una imagen cada uno, en pbxLoading vamos a poner una imagen que represente que el control esta trabajando y en pbxNotFound vamos a poner una imagen para representar un error en el cargado de la imagen solicitada.  Estos controles siempre permaneceran ocultos (Visible = false) y tomaremos de ellos las imagenes para ponerlas en el pictureBox1 cuando las requiramos.

Codigo detras del control

urlImage codigo

Aqui en codigo podemos ver que estamos utilizando el evento Resize del UserControl para hacer que pictureBox1 cubra toda la superficie de nuestro control.  Y ademas agregando un metodo publico llamado GetImage(string url) con el cual podremos pedirle al control que intente cargar la imagen de internet que le proporcionemos con el parametro url

En GetImage(), primero pasamos la imagen que esta en pbxLoading al PictureBox principal, y despues intentamos (por medio de un try) cargar la imagen desde internet a nuestro PictureBox.  Esto lo logramos con la ayuda de la clase HttpWebRequest, donde especificamos la direccion de internet, y obtenemos su ResponseStream para pasarselo al PictureBox e intente mostrarlo a pantalla; en caso de algun error | excepcion, lo indicaremos cargando la imagen que se encuentra en pbxNotFound.

Anuncios

contactAdmin

 codigo del proyecto para administracion de contactos desarrollado en clase hasta el jueves 26 de abril…

 la base de datos esta dentro de la carpeta [/clases]

hay que darle click-derecho a la liga y seleccionar la opcion de guardar…
despues renombrar a .zip

Espero que se la pasen bien en las dos semanas de vacaciones que tendremos…. por lo pronto, si le dedican algo de tiempo a la universidad, y quieren aparte dedicarle a esta materia (seria fenomenal), pueden ir bosquejando el primer draft para su proyecto final.

El proyecto final constara en desarrollar una aplicacion (en c# por supuesto) que contenga las siguientes caracteristicas:

  • Disenho orientado a objetos (clases con propiedades, metodos [, eventos (opcional)]
  • Programacion en Windows Forms (Ventanas de Windows)
  • Acceso a bases de datos con ADO.NET
  • Uno o mas User controls

En la sesion antes de salir de vacaciones, se vieron algunas alternativas para desarrollarlas como proyecto final, siguen:

Aplicaciones para registrar, y mantener lo siguiente:

  • Calificaciones de alumnos por materia (Popularidad: minima)
  • Catalogo de Peliculas (Popularidad: Maxima)
  • Catalogo de Libros (Popularidad: Minima)
  • Casas/Depas/Oficinas en Venta/Renta (Popularidad: Algo)
  • Venta de Automoviles (Popularidad: Algo)

Las explicare por orden de popularidad… cabe mencionar que pueden proponer su aplicacion para asi trabajar sobre algo que les pueda ayudar en su trabajo o alguna otra materia.

Catalogo de Peliculas – proyecto tentativo

Manejar los siguientes datos:

  • Nombre
  • Anho
  • Director
  • Sinopsis/Resumen
  • Idioma (permitir solo idiomas del catalogo de idiomas)
  • Duracion (minutos)
  • Productora
  • Clasificacion (permitir solo las del catalogo clasificaciones)
  • Pais
  • Generos[] (arreglo/coleccion de generos existentes en el catalogo de generos)
  • Actores[] (arreglo/coleccion de actores existentes en el catalogo de actores)
    • Los actores deben de registrar por lo menos
      • nombre
      • nacionalidad

Venta de Automoviles – proyecto tentativo

Manejar los siguientes datos:

  • Marca (permitir solo marcas existentes en catalogo de marcas)
  • Modelo (permitir solo modelos existentes en catalogo de modelos, y relacionados a la marca)
  • Anho
  • Color
  • Numero de puertas
  • Numero de pasajeros
  • Numero de serie
  • Cilindros
  • Numero de duenhos
  • Precio
  • Contactos[] (arreglo/colec. de contactos existentes en catalogo de contactos)
    • nombre
    • telefono
    • email
  • Fotos[] (arreglo/coleccion de fotos)

Venta/Renta de Inmuebles (Casas/Depas/Oficinas…)

Manejar los sig> datos:

  • Direccion
    • Estado
    • Ciudad
    • Sector
  • Precio | Mensualidad
  • Numero de Recamaras
  • Numero de Banhos
  • Numero de Estacionamientos
  • Cuenta con …
    • cocina integral
    • muebles
    • boiler
    • telefono
    • luz
    • agua
    • gas
  • Numero de plantas/pisos
  • Contactos[] (arreglo/colec. de contactos existentes en catalogo de contactos)
    • nombre
    • telefono
    • email
  • Fotos[] (arreglo/coleccion de fotos)

– – – – – – – – – – –

Importante!! cabe mencionar que estas son opciones para elaborar, pero puedes proponer tu aplicacion para trabajar sobre algo que mas te interese, o te sirva para tu trabajo u otra materia… Importante!!!

../../../

En esta sesion, vimos un poco de lo que contienen los namespaces | nombres de espacio
System.Collections
System.Collections.Specialized
System.Collections.Generic

Especificamente, tocamos las clases:
ArrayList  ,  Hashtable  ,  Queue  ,  Stack  ,  NameValueCollection  ,  StringDictionary

ArrayList – ArrayList  –  ArrayList

Esta es una coleccion donde podemos guardar cualquier tipo de objeto.  Su metodo ArrayList.Add() acepta el tipo object, por lo cual podemos coleccionar enteros, cadenas, listboxes, botones, y casi cualquier cosa que se nos ocurra…  El acceso a sus elementos se logra por medio de la posicion o indice.  Podemos utilizar su propiedad ArrayList.Count para preguntarle a la coleccion cuantos elementos tiene, y de esta forma iterarla por ejemplo de esta manera:

for(int i = 0; i < myArrayList.Count; i++) { //acceso: MyArrayList[i] }

..el aceptar cualquier objeto, nos da la posibilidad de mezclar tipos en la misma coleccion, que en algunas ocasiones puede ser util, pero la mayoria de las veces esconde errores que no pueden detectarse sino hasta en tiempo de ejecucion (run-time); y hasta cierto punto se opone a las “mejores practicas” (best practices) de la programacion orientada a objetos.

Hashtable  –  Hashtable  – Hashtable

Con Hashtable, podemos coleccionar objetos (al igual que con ArrayList), pero estos no podemos accesarlos por indice | posicion.  Al igual que ArrayList, Hashtable cuenta con el metodo Hashtable.Add() y la propiedad Hashtable.Count.  El metodo Hashtable.Add() nos requiere dos parametros de tipo object.  El primero es una llave unica que Hashtable utiliza para nombrar al elemento que se le pasa en el segundo objeto.

Hashtable.Add(object key, object value)

Como no podemos accesar los elementos por indice como con el ArrayList, debemos proporcionar al Hashtable un objeto, con el cual buscara si hay un elemento asociado a ese objeto (llave unica) para proporcionarnoslo;  en caso de que el objeto (llave unica) que proporcionemos no exista en el Hashtable, nos regresara un objeto null | nulo.  Con llave unica se entiende que solo puede haber un elemento asociado a esta llave, de tal manera que si se agrega al Hashtable un elemento nuevo, pero se asocia a una llave ya existente, el nuevo elemento reemplazara al que ya teniamos coleccionado.

En caso de querer iterar los elementos de un Hashtable, podemos recurrir a la siguiente tecnica:

enumerator technique

Hashtable nos proporciona un enumerador (IEnumerator) por medio de su metodo HashTable.GetEnumerator().  Este enumerador podemos iterarlo ayudandonos de su metodo IEnumerator.MoveNext() y convirtiendo su propiedad IEnumerator.Current a un objeto tipo DictionaryEntry, el cual contiene la llave y el objeto original que pusimos en el Hashtable.

durante esta clase se trabajo con la aplicacion de “imageBrowser” (la acabo de bautizar). Y basicamente lo que hicimos fue pasarla de su fase uno a la fase dos

El principal concepto desarrollado durante esta sesion es:

Eventos,    Eventos,         Eventos

  – delegate
Explicacion ejemplo: [situacion] llamas a un amigo por telefono a su casa pero no esta, dejas tu telefono para que cuando llegue te marque… mientras tu puedes seguir con tus actividades y no quedarte en la linea esperando (tal vez horas) hasta que llegue.  [analogia .net] le haces saber a un metodo (telefono de tu amigo) que vas a requerir que se te notifique (dejas tu telefono) cuando ocurra este cierto metodo (evento), mientras tu aplicacion puede seguir con sus operaciones…  

La situacion explicada puede concretarse debido a los delegates | delegados que podemos crear en punto NET.   Un delegado | delegate tiene las siguientes caracteristicas:   

  • verifican los tipos de parametros que se les pasan; o bien, verifican que el numero de telefono que dejas para que tu amigo llame este en el formato correcto.
  • se aseguran que siempre se apunte a un metodo existente; o bien, se asegura que el numero de telefono exista.
  • soportan “multicasting”; o bien, puedes dejar un listado de telefonos para que tu amigo haga notificaciones de que ya llego a todos ellos.

 Ahora bien, pasando esto a nuestra aplicacion, enfocandonos a nuestros usercontrols DriveList y FolderList, queremos que cuando el usuario seleccione una nueva unidad de disco, el listado de FolderList se actualice para mostrar las carpetas correctas.

Para esto necesitamos poner en nuestro DriveList, un evento para que otros objetos puedan “suscribirse” y ser notificados cuando el evento ocurra.

create event/deleg

en este codigo, podemos ver que se declara un delegado para validar metodos que no regresan resultado (void), y aceptan un parametro tipo string, este delegado se llamara SelectionChangedHandler.  En la siguiente linea se declara un evento llamado SelectionChanged y acepta subscripciones de metodos validados por el delegado SelectionChangedHandler.  Aparte se esta agregando la linea de codigo que “dispara” el evento desde nuestro control hacia los objetos interesados en reaccionar a dicho evento.  Esta linea esta dentro del metodo comboBox1_SelectedIndexChanged, el cual a su vez se corre cada vez que se selecciona un elemento diferente de nuestro ComboBox.

Cuando se corre SelectionChanged(comboBox1.Text), nuestro evento se esta disparando y se lleva con el el texto desplegado en el ComboBox para proporcionarselo a quien se haya suscrito al evento, y le interese ser notificado cada vez que se cambia de unidad de disco. 

 Vamos haciendo unas observaciones de lo que esta ocurriendo… busquemos en el codigo del control la llamada al metodo ComponentInitialize(), seleccionalo y dale click-derecho y “Goto Definition”; ahora busca por alli y veras la linea

this.comboBox1.SelectedIndexChanged +=
   
new System.EventHandler(this.comboBox1_SelectedIndexChanged);

esto suscribe el metodo comboBox1_SelectedIndexChanged al evento SelectedIndexChanged del objeto comboBox1, y aparte se esta validando que el metodo cumpla con las especificaciones del delegado EventHandler.  Ahora selecciona EventHandler y dale click-derecho y “Goto Definition”, veras la declaracion:

public delegate void EventHandler(object sender, EventArgs e);

Esto nos muestra que las especificaciones del delegado validan metodos que no regresan resultado (void) y requieren dos parametros, uno object, y otro EventArgs.  …volviendo a nuestra declaracion de delegado, nosotros validaremos que el metodo que se suscribe no regrese valor y acepte una cadena.

Nuestro control ya cuenta con el evento SelectionChanged.

Suscribiendome al evento del DriveList ;            Subscripcion

El siguiente paso sera suscribir un metodo al evento de tal manera que nuestro FolderList se actualice con la ruta correspondiente cada vez que se cambie de unidad de disco en DriveList

Necesitamos un metodo que cumpla con los requisitos de nuestro delegado SelectionChangedHandler: no regresa resultado, y acepte una cadena… Lo llamare CambioDrive. [, se validan estos requisitos ya que este tipo de delegado fue el que escogi para declarar el evento SelectionChanged]  En este metodo esta la logica para desplegar en FolderList la ruta que se selecciono en DriveList; recordemos que el evento trae consigo lo que obtuvo de comboBox1.Text al momento de ser disparado, y nos lo va a proporcionar con la variable string newDrive que tiene el metodo CambioDrive.

implement event

…ya que tenemos nuestro metodo que se apega a los requisitos de nuestro delegado, vamos suscribiendonos al evento.  Esto lo estoy poniendo en el Form1_Load:

link method to event

..de esta manera cada vez que el usuario cambia de unidad de disco, se dispara el evento SelectionChanged de driveList1, con esto, se notifica a los suscritos (CambioDrive) y por lo tanto, folderList1.DisplayFolders() con la ruta de driveList1. 😀

Por si les interesa el desarrollo en ambiente web, pueden aventarse algunas de las lecciones del sitio http://www.w3schools.com , especificamente las siguientes:

1. learn HTML : ayuda en la elaboracion del contenido de la pagina

en lo personal me apoyo mucho de

2. learn CSS : para “formato” (lease font, paragraph, colors, backgrounds…)
Importante tener dominado el Learn HTML !!

y no les caeria mal tambien pasar por el de

x. learn SQL

les comparto la fase dos del proyecto que estamos desarrollando en clase, por si alguien quiere irse adelantando a lo que veremos el martes…

descarga: proyecto fase dos