imageBrowser


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. 😀

Anuncios

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

En esta sesion, continuamos con la elaboracion de nuestros propios controles (UserControls).  La sesion pasada fue crear un control para validar correos electronicos (EmailInput).

Esta vez empezamos por definir algunos requerimientos para una nueva aplicacion.  Esta aplicacion nos permitira visualizar imagenes que podamos accesar desde nuestro sistema de archivos (lease unidades de disco tales como: discos duros, lectores cd o dvd, floppies, unidades de red mapeadas), basicamente como las que encontramos en windows explorer.  Hasta cierto punto vamos a “copiar” la funcionalidad del windows explorer en cuanto a que podremos seleccionar una unidad de disco, navegar por las carpetas/folders disponibles, y ver los archivos que estan dentro de las carpetas.  Finalmente, para seleccionar un archivo con extension de imagen y desplegarlo en nuestra forma…

Para esto vamos a empezar por desarrollar varios UserControls, especificamente:
DriveList, – FolderList, – FileList.

La funcionalidad principal para DriveList seria poder seleccionar una unidad de disco de la computadora; la funcionalidad principal para FolderList seria desplegar y navegar por los folders presentes; y la funcionalidad de FileList seria desplegar una lista de archivos para determinada carpeta.

DriveList UserControl

Este control sera un ComboBox para poder seleccionar alguna de las unidades de disco existentes en la computadora. En su evento Load, vamos a utilizar el metodo estatico GetDrives() de la clase DriveInfo del namespace System.IO; este metodo nos regresa un arreglo DriveInfo[] con cada uno de sus elementos representando una unidad de disco existente.

//(agregar la namespace System.IO al principio de nuestro codigo)

DriveInfo[] unidades = System.IO.DriveInfo.GetDrives();

..ya con esto, vamos a iterar el arreglo con un for, y agregar el nombre (letra asignada) de la unidad a nuestra lista ComboBox.  Aparte vamos a exponer la unidad seleccionada a manera de propiedad, esta propiedad la estoy llamando SelectedDrive:

drivelist01

por lo pronto, ya tenemos un UserControl para desplegar las unidades de disco existentes en la computadora !!

DriveList in action

FolderList UserControl

Ahora empecemos con nuestro segundo UserControl para navegar carpetas.  Para este, vamos a implementar un metodo que nos pida como parametro una ruta, entonces el metodo enlistara las subcarpetas de esta ruta en un ListBox.  Aparte vamos a exponer la ruta actual de nuestro control (como propiedad).

Vamos a ayudarnos del metodo estatico GetDirectories() de la clase Directory, iteramos el resultado y vamos agregando a nuestro ListBox.  En este punto, vamos a agregar una carpeta especial, para facilidad la vamos a nombrar “..” para simular un cambio de directorio hacia “afuera/arriba” en nuestro arbol de directorios/carpetas.

FolderList01

Ya tenemos nuestro metodo para captar una ruta, y desplegar las sub-carpetas de esa ruta, ahora vamos a extender un poco mas la funcionalidad de nuestro UserControl poniendo logica en el DobleClick / DoubleClick del listado de carpetas.  Esto para que podamos “entrar” a la carpeta que se da doble click, y ver las carpetas que estan dentro…

FolderList02

..con esto ya tenemos un “explorador” de carpetas; con la ayuda de un Label, y asignandole nuestra propiedad Path
label1.Text = folderList1.Path;
podemos desplegar la ruta actual de las carpetas que estan desplegadas…

FolderList in action
[tuve que recurrir a un Timer para sincronizar el label con el folderList, despues vamos a implementar eventos para que otros controles/objetos puedan ser notificados de acciones en nuestros controles…]

Hasta aqui llegamos durante la sesion… el martes despues del pequenho y facil examen le seguimos…

Descarga del proyecto fase uno (incompleto): Proyecto fase uno
nota obligatoria, renombrar el archivo a .zip