viernes, 13 de noviembre de 2009

VISUAL STUDIO .NET

por david flores zafra



INTRODUCCIÓN A VISUAL STUDIO .NET

Visual Studio .NET es la Herramienta Rápida de Desarrollo (RAD) de Microsoft para la siguiente generación de Internet que son los Servicios Web XML. Esta herramienta permite la creación de aplicaciones usando el Marco .NET, es decir usando el CLR, la Librería de Clases, ADO .NET, ASP .NET, etc.
Es un software que brinda las herramientas necesarias para crear, distribuir, administrar y dar mantenimiento a aplicaciones Web distribuidas que usan Servicios Web XML, todo esto con una gran facilidad, rapidez y bajo costo.
Se puede crear aplicaciones Web directamente usando el Framework .NET y algún programa editor, por ejemplo el Bloc de Notas, pero el tiempo que llevaría el desarrollo no justificaría el ahorro de costos, en cambio, si se utiliza una herramienta como Visual Studio .NET el tiempo de desarrollo se reduciría enormemente.
Visual Studio .NET permite también la integración y el uso cruzado de lenguajes de programación: Visual Basic .NET, Visual C# .NET, Visual C++ .NET y JScript .NET
A diferencia de la versión anterior no existe Visual Interdev, ni Visual J++, además Visual Foxpro 7 no comparte las características unificadas del Marco .NET, esto sería implementado posteriormente.

HERRAMIENTA RÁPIDA DE DESARROLLO (RAD)

La principal ventaja de Visual Studio .NET es realizar la creación de aplicaciones de forma fácil y rápida, tan solo con arrastrar y soltar objetos se pueden crear desde aplicaciones Windows hasta Servicios Web XML.
Entre algunas de las ventajas del soporte RAD de Visual Studio tenemos:
  • CREACIÓN DE PÁGINAS WEB MEDIANTE FORMULARIOS WEB
Visual Studio .NET incluye un diseñador de páginas Web HTML y ASP .NET basado en formularios Web, el diseñador permite arrastrar controles, clases de datos, y otros objetos y configurar sus propiedades como si fuese un formulario de una aplicación para Windows.
  • CREACIÓN DE SERVICIOS WEB XML
Para crear Servicios Web XML, Visual Studio .NET incluye una plantilla con Servicios Web de ejemplo, los cuales puedes modificar y personalizar a tu medida, eligiendo el lenguaje que deseas, que puede ser Visual Basic .NET, Visual C# .NET o Visual C++ .NET
  • ACCESO A SERVICIOS WEB XML
Una vez creado los Servicios Web XML deben usarse en otras aplicaciones del negocio, para ello Visual Studio .NET cuenta con el Explorador de Servidores (Server Explorer) que permite ver los Servicios Web publicados y usarlos con solo un arrastre. También podemos usar un Servicio Web haciendo referencia desde un proyecto mediante la opción “Add Web Referente” del menú “Project”.
  • CREACIÓN DE COMPONENTES .NET
Crear componentes o controles de usuario es tan simple como crear un formulario, ya que usando la herencia se puede pasar todas las características de un objeto a otro, esto esta presente en todos los objetos creados en Visual Studio .NET, sean visuales o no.
  • CREACIÓN DE ARCHIVOS XML
Con el diseñador de XML, crear un archivo XML es mas fácil que nunca, ya que se muestra de colores el código y se auto completan los Tags que uno va escribiendo. Este maneja 3 vistas: XML, esquemas y datos. Existen mas características RAD en Visual Studio .NET, las cuales trataremos mas adelante.


El Marco .NET es neutral con respecto al lenguaje y admite prácticamente cualquiera de ellos. Esto trae consigo los siguientes beneficios para el desarrollador:
  • CÓDIGO REUSABLE Y COMPARTIDO
Antes no existía una integración total del equipo de desarrollo cuando cada grupo usaba herramientas diferentes como Visual Basic 6, Visual C++ 6 o Visual J++ 6, en cambio ahora, el código escrito en cualquier lenguaje puede ser usado desde otro, ya que todas son clases .NET.
  • ACCESO A APIS IGUAL PARA TODOS LOS LENGUAJES
Actualmente, todos los lenguajes del Marco .NET comparten las mismas clases o APIS del sistema, antes cada lenguaje accedía a las APIs de su manera, de ellos C++ era el mas fuerte, hoy en día con .NET no existen diferencias entre potencia del lenguaje.
  • HERENCIA CRUZADA ENTRE LENGUAJES
Se puede crear una clase en un lenguaje y heredarse desde otra clase escrita en diferente lenguaje .NET, lo que permite la reutilización total del código por parte de diferentes desarrolladores.
  • MANEJO DE ERRORES CRUZADO ENTRE LENGUAJES
Se puede controlar errores desde una clase por mas que el error ocurra en un objeto creado en otro lenguaje distinto al de la clase que controla el error, también se puede realizar el seguimiento de una aplicación aunque incluya llamadas a otros lenguajes, etc.
FIGURA 1.2: RELACIÓN CRUZADA ENTRE LENGUAJES .NET


En Visual Studio .NET vienen los siguientes Lenguajes de Programación:
  • Visual Basic .NET
  • Visual C# .NET
  • Visual C++ .NET
  • Visual Foxpro .NET (No administrado por el Marco .NET)
  • Visual JScript .NET

Además de estos lenguajes, el Marco .NET soporta otros lenguajes, entre los cuales destacan:
Se ha dado el nombre de algunos lenguajes junto con sus respectivas páginas Web donde se puede encontrar información sobre estos e inclusive bajarse el compilador del lenguaje compatible con .NET.



Visual Studio .NET tiene un Entorno Integrado de Desarrollo único o compartido para crear aplicaciones usando cualquiera de los Lenguajes de Programación, que pueden ser Visual Basic, Visual C++ o C#.

En esta nueva versión de Visual Studio, Visual Foxpro mantiene su propio IDE (similar al de la Versión 6), además Visual Interdev ya no es parte de Visual Studio, ya que las herramientas de desarrollo para Web están disponibles a través de los Web Forms disponibles desde el IDE común.
Al iniciar Visual Studio .NET aparece (por defecto) la Página de Inicio, tal como se muestra en la Figura 1.4

Desde esta página de inicio podemos elegir la opción “Get Started” para crear un nuevo proyecto o abrir uno existente o reportar un error del IDE de Visual Studio, si elegimos “New Project” se presentará la Ventana que se muestra en la

Esta ventana está dividida 2 secciones: en el lado izquierdo se encuentran los tipos de proyectos que se pueden realizar (Visual Basic, Visual C#, Visual C++, etc) y en el lado derecho se encuentran las plantillas o tipos de aplicaciones, que varían de acuerdo al tipo de proyecto.
Si se elige Visual Basic o Visual C#, las plantillas se pueden dividir en tres: para Windows, para Web (Aplicaciones, Servicios, Librería de Clases, Librería de Controles, Proyecto Vacío) y de Consola.
En el caso de elegir como tipo de proyecto “Visual Basic” y como plantilla “Windows Application” hay que seleccionar la ubicación del nuevo proyecto y escribir el nombre de este, el cual creará una carpeta con el mismo nombre en el lugar seleccionado. A continuación la figura 1.6 muestra el IDE compartido de Visual Studio .NET en el caso de elegir una Aplicación para Windows.

Entre las partes del nuevo IDE de Visual Studio .NET tenemos:

1.    Menu Bar
2.    ToolBars
3.    Server Explorer Window (Ctrl + Alt + S)
4.    ToolBox (Ctrl + Alt + X)
5.    Output Window (Ctrl + Alt + O)
6.    Status Bar
7.    Windows Form Designer
8.    Solution Explorer Window (Ctrl + R)
9.    Properties Window (F4)
10.  Search Window (Ctrl + Alt + F3)
11.  Dynamic Help Window (Ctrl + F1)

Existen nuevas ventanas en Visual Studio .NET entre las cuales tenemos:
·         Class View (Ctrl + Shift + C)
·         Resource View (Ctrl + Shift + E)
·         Macro Explorer (Alt + F8)
·         Document Outline (Ctrl Alt + T)
·         Task List (Ctrl + Alt + K)
·         Command Window (Ctrl + Alt + A)
·         Find Symbol Results (Ctrl +Alt + Y)

Nota: Para mostrar u ocultar cualquier ventana del IDE elegir el menú “View”


El manejo de ventanas en Visual Studio .NET es más simple y rápido pudiendo acceder a cualquier elemento de manera fácil, debido a las nuevas características de Administración de ventanas, tales como:

  • AUTO OCULTAR: Esta característica es nueva en Visual Studio .NET y permite ocultar una ventana permitiendo liberar espacio en el IDE, para mostrar nuevamente la ventana solo hay que ubicar el mouse cerca del nombre de la ventana que aparece en una ficha.
  • VENTANAS ACOPLABLES: Al igual que Visual Basic 6, esta nueva versión permite acoplar ventanas las cuales estarán fijas en el IDE. Podemos elegir si una ventana se va a “Auto Ocultar” o si se va a “Acoplar”. Al acoplar la ventana tendremos la posibilidad de ver siempre su contenido.
  • FICHAS DE DOCUMENTOS: En la versión anterior de Visual Studio el trabajo con varios documentos era tedioso por que para acceder a un documento abierto (por ejemplo un módulo de formulario) había que hacerlo mediante el menú “Window” o dando clic en el botón “View Code” o doble clic sobre el nombre del objeto. Ahora el acceso es muy rápido a través de las fichas que hay en la parte superior del Editor.
  • NAVEGACIÓN A TRAVÉS DEL IDE: Podemos navegar a través de los documentos visitados usando la barra Web, pudiendo ir hacia “Atrás”, “Adelante”, “Detener”, “Actualizar”, “Ir al inicio” como si se tratase de un Browser y si navegáramos a través de  páginas Web, lo que facilita la búsqueda de una pagina ya abierta.
  • VENTANA DE AYUDA RÁPIDA: Una de las características mas importantes de Visual Studio .NET es la “ayuda inteligente” o “ayuda rápida” que permite mostrar en una ventana todos los tópicos relacionados a donde se encuentre el cursor (si esta en el editor) o al objeto seleccionado (si estamos en el diseñador de formulario), por ejemplo, si estamos en el editor escribiendo una función aparecerán los tópicos relacionados a ésta, si nos encontramos seleccionando un control, aparecerán los temas referentes a éste.
Todas estas nuevas características hacen que el trabajo del desarrollador sea más productivo, centrándose en la lógica de la aplicación y no en el mantenimiento de ésta ya que es más fácil al utilizar las nuevas características de Administración de Ventanas, anteriormente comentadas.


Para realizar la construcción de aplicaciones o creación de componentes o servicios disponemos de Diseñadores que facilitan la labor de construcción de interfaces, creación de sentencias, etc.
La mayoría de diseñadores se habilitan al elegir una plantilla de Visual Studio .NET y casi todos generan código al diseñar controles sobre el contenedor respectivo; característica totalmente distinta a la forma de trabajo en Visual Basic 6, que ocultaba el código generado por el diseñador.
Entre los diseñadores que trae Visual Studio .NET tenemos:
·         WINDOWS FORM DESIGNER: Se muestra al elegir cualquiera de dos plantillas: “Windows Application” o “Windows Control Library”, habilitando en el Toolbox los controles para Windows que serán usados para construir la interfase de la aplicación arrastrando dichos controles hacia el formulario o control de usuario.
·         WEB FORM DESIGNER: Se muestra al elegir la plantilla “Web Application” habilitando en el Toolbox los controles para Web y los controles HTML que serán usados para construir la página Web que correrá en el servidor IIS (archivo aspx) arrastrando dichos controles hacia el formulario Web.
·         COMPONENT DESIGNER: Este diseñador se muestra al elegir una de dos plantillas: “Class Library” o “Windows Service” y también trabaja con los controles para windows, creando una interfase reusable desde otra aplicación.
·         WEB SERVICE DESIGNER: Sirve para diseñar servicios Web y es mostrado al elegir una plantilla “Web Service”, también trabaja con los controles para Windows, componentes, etc.

Existen más diseñadores, pero que lo trataremos en la categoría de herramientas de datos, debido al tipo de trabajo que realizan con datos, el cual se trata como tema siguiente.


Si se quiere realizar un trabajo rápido con datos, tal como modificar la estructura de la Base de Datos, crear tablas, consultas, procedimientos almacenados, etc., existen herramientas que permiten realizar esta labor reduciendo enormemente el proceso de desarrollo en el caso de hacerse por otros medios.

Entre las principales herramientas que trabajan con datos tenemos:
  • SERVER EXPLORERSin duda es una de las principales herramientas de Visual Studio .NET y no solo para acceder a datos sino para mostrar y administrar los diferentes servidores o recursos del sistema, tales como Base de Datos, Servicios Web, Aplicaciones COM+, etc. Con solo arrastrar el objeto éste puede ser usado en una aplicación. También se tratará con mayor detalle en el módulo de acceso a datos.
  • DATAADAPTER WIZARD: Es un Asistente que permite crear un DataAdapter que es un Comando (Select, Insert, Update, Delete) con el cual se podrá generar un conjunto de registros o Dataset. La misma función puede ser cubierta por el Server Explorer con solo arrastrar los campos hacia el formulario.
  • QUERY DESIGNER: Es un Diseñador que permite crear Consultas SQL de manera sencilla arrastrando tablas o consultas sobre éste y eligiendo los campos que se verán en la consulta de datos, también se puede realizar filtros o especificar criterios de selección. Además no solo se pueden construir consultas Select sino también se pueden crear consultas Insert, Update o Delete, etc.
  • DATABASE PROJECT: Es un tipo de plantilla que sirve para trabajar con una Base de Datos, para lo cual debe existir una conexión a un origen de datos, este tipo de proyecto da la posibilidad de crear y modificar scripts de creación de tablas, consultas, vistas, desencadenantes, procedimientos almacenados, etc.
  • EDITOR DE SCRIPT: Uno de las principales herramientas para trabajar con base de datos remotas como SQL Server, Oracle, etc, es utilizar el editor de Scripts que permite crear tablas, consultas, vistas, etc. Mostrando con colores las sentencias o palabras reservadas del lenguaje Transact-SQL.
  • DEPURADOR DE PROCEDIMIENTOS ALMACENADOS: Visual Studio .NET incorpora un Depurador de Store Procedure que puede realizar seguimientos paso a paso por línea de código, por sentencia o por instrucción, además crea puntos de interrupción, permitiendo un mayor control y seguimiento del código en caso de errores.
Todas estas herramientas mencionadas, son nuevas en Visual Studio .NET, ha excepción del Query Builder que es el mismo de la versión anterior de Visual Studio. 
Como se habrá dado cuenta muchas herramientas de acceso a datos de Visual Basic 6 han sido eliminadas, tales como: Data Environment, Data View, Data Report, y otras más, pero en su reemplazo existen las que ya hemos mencionado.

VISUAL BASIC .NET


En los módulos anteriores hemos tratado el Marco .NET y Visual Studio .NET, ahora trataremos Visual Basic .NET, pero hay que remarcar que las características del lenguaje dependen del Marco .NET y las herramientas son compartidas por el IDE de Visual Studio .NET
Visual Basic .NET es la versión 7 de ésta popular herramienta, ésta última versión tiene cambios radicales, tanto en su concepción (.NET), en el lenguaje, las herramientas usadas, etc. Entre las nuevas características de Visual Basic .NET tenemos:
·         Dos tipos de desarrollos bien diferenciados:
·         Aplicaciones para Windows
·         Aplicaciones para Internet

·         Acceso a Datos usando ADO .NET, el cual permite trabajar con DataSets desconectados.
·         Nuevo Depurador que permite realizar seguimiento de código escrito en diferentes lenguajes .NET.
·         Creación y uso de XML para intercambio de datos entre aplicaciones.
·         Lenguaje Orientado a Objetos, con soporte de Herencia múltiple, y Polimorfismo a través de la sobrecarga de propiedades, métodos y funciones con el mismo nombre
·         Control de errores o excepciones en forma estructurada (Try..Catch..Finally).
·         Soporte de multithread para que la aplicación pueda ejecutar múltiples tareas en forma independiente.
·         Uso de NameSpaces para referirse a una clase que se va a usar en la aplicación. Los Assemblies reemplazan a la Librería de Tipos, en un Assemblie pueden existir uno o más NameSpaces.
·         Reestructuración en los Tipos de Datos; existen nuevos tipos de datos y se han modificado y eliminado ciertos tipos de datos.
·         Cambio en el Lenguaje: nuevas forma de declarar variables, conversión explícita de tipos de datos (no existe conversión forzosa), no existen procedimientos sino funciones, etc.



Tipo
V. Basic
Estructura Tipo
.NET Runtime
Tamaño
Almac. 
Rango de Valores 
Boolean 
System.Boolean 
4 bytes 
True o False 
Byte 
System.Byte 
1 byte 
0 to 255 (sin signo) 
Char 
System.Char 
2 bytes 
0 to 65535 (sin signo) 
Date 
System.DateTime 
8 bytes 
Enero 1, 1 CE hasta Diciembre 31, 9999 
Decimal 
System.Decimal 
12 bytes 
+/-79,228,162,514,264,337,593,543,950,335 sin punto decimal;
+/-7.9228162514264337593543950335 con 28 posiciones a la derecha del decimal; número mas corto (no 0) es
+/-0.0000000000000000000000000001 
Double
(doble-precisión punto-flotante) 
System.Double 
8 bytes 
-1.79769313486231E308 hasta
-4.94065645841247E-324 para valores negativos; 4.94065645841247E-324 hasta 1.79769313486232E308 para valores positivos
Integer 
System.Int32 
4 bytes 
-2,147,483,648 to 2,147,483,647 
Long
(Entero largo) 
System.Int64 
8 bytes 
-9,223,372,036,854,775,808 hasta 9,223,372,036,854,775,807 
Object 
System.Object (class) 
4 bytes 
Cualquier tipo de dato
Short 
System.Int16 
2 bytes 
-32,768 to 32,767 
Single
(simple precisión punto-flotante) 
System.Single 
4 bytes 
-3.402823E38 hasta -1.401298E-45 para valores negativos; 1.401298E-45 hasta 3.402823E38 para valores positivos
String
(tamaño-variable) 
System.String (class) 
10 bytes + (2 * tamaño cadena) 
0 hasta aproximadamente 2 billones de caracteres Unicode
User-Defined Type
(estructura) 
(heredado desde System.ValueType) 
Suma de tamaños de sus miembros 
Cada miembro de la estructura tiene un rango determinado, es decir pueden tener sus propios tipos de datos distintos unos de otros

NOTAS: Se ha eliminado el tipo de dato Variant y es reemplazado por Object, también el dato Currency ahora es Decimal y el Type ahora es Structure. Además no existen String de tamaño fijo, sino que todos son dinámicos.


Una variable es un dato temporal en memoria que tiene un nombre, un tipo de dato, un tiempo de vida y un alcance, los cuales lo dan la forma como se declare ésta.
Una variable debe cumplir con las siguientes reglas:
·         Debe iniciar con un carácter alfabético.
·         Debería contener solo caracteres alfabéticos, dígitos y carácter de subrayado.
·         El nombre no debe exceder a 255 caracteres, etc.

DECLARACIÓN DE VARIABLES

A diferencia de Visual Basic 6, en VB .NET se pueden declarar varias variables en una sola instrucción y además se puede asignar directamente sus valores. Otra observación es que es necesario definir el tipo de declaración y el tipo de dato (antes si no se hacia se asumía un tipo de declaración y un tipo de dato variant, que ahora no existe).

SINTAXIS: As [=]
Existen varios tipos de declaración que detallamos a continuación en la siguiente tabla:

Declaración
Lugar de Declaración
Alcance o Ámbito
Public
Módulo o Clase
Global, en todo el proyecto.
Protected
Clase
En la clase declarada o en una derivada.
Friend
Clase
En el Assemblie.
Private
Módulo
Solo en el módulo.
Dim
Procedimiento
Solo en el Procedimiento.
Static
Procedimiento
Solo en el Procedimiento.

ALCANCE DE VARIABLES

Para las variables declaradas a nivel de procedimiento (Dim y Static) existe un nuevo alcance que es a nivel de estructura o bloque, que puede ser For – Next, If – End If, Do – Loop, etc. Las variables definidas dentro de un bloque solo valdrán en este bloque.

OPCIONES DE TRABAJO CON VARIABLES

Por defecto en VB NET es necesario declarar las variables usadas (Option Explicit) y también es necesario que se asigne el mismo tipo de dato a la variable (Option Strict), si deseamos Declaración implícita (por defecto Object) y Conversión Forzosa de tipos (ForeCast), aunque no es lo recomendable por performance, podemos conseguirlo de dos formas: mediante “Propiedades” del proyecto, opción “Build” y elegir “Off” en las listas de “Option Explicit” y Option Strict” o mediante declaración al inicio de todo el código:
Option Explicit Off
Option Strict Off


Un array o arreglo es un conjunto de variables que tienen el mismo nombre pero diferente índice que permite simplificar el uso de éstas y aumentar la velocidad de acceso a los datos que almacena el array. El array puede tener uno o más dimensiones (hasta 60) y cada dimensión tiene un límite inferior que siempre es 0 y un límite superior que es equivalente al tamaño de la dimensión del array menos 1. Esta característica es distinta que en la versión anterior, en donde el límite inferior del array podía empezar en cualquier número. La clase base .NET de donde se heredan los array es “Array” y pertenece al siguiente NameSpace: System.Array.

DECLARACIÓN DE ARRAYS

A diferencia de Visual Basic 6, en VB .NET se pueden declarar arrays definiendo el número de dimensiones pero sin indicar el tamaño. Cabe resaltar  que solo se puede declarar e inicializar un array que no tiene tamaño definido.
Otra diferencia es que no existe la sentencia Option Base que haga que el límite inferior del array empiece en 0 o en 1, éste siempre empezará en 0 e irá hasta n-1.
SINTAXIS:
([Tamaño]) As [=]
EJEMPLOS:
Dim Alumnos(30),Cursos(10) As String
Dim Edades() As Byte={18,20,25,27}
Dim Sueldos( , ) As Decimal

REDIMENSIONANDO ARRAYS

Una vez definido la dimensión de un array, éste puede modificarse usando la sentencia ReDim, siempre y cuando el array haya sido declarado como dinámico (con Dim).
SINTAXIS:
ReDim [Preserve] ([Tamaño]) As [=]
EJEMPLO:
Dim I, Arreglo() As Integer
Redim Arreglo(5)
For I = 0 To Ubound(Arreglo)
   Arreglo(I) = I
Next I


Un Procedimiento es un bloque de código o conjunto de instrucciones que es definido en la aplicación y que puede ser usado varias veces mediante una llamada.
Dos características nuevas de los procedimientos, incorporadas en esta versión son:
·         Recursividad: Es la capacidad del procedimiento para llamarse así mismo.
·         Sobrecarga: Consiste en que varios procedimientos pueden tener el mismo nombre.
En Visual Basic tenemos varios Tipos de Procedimientos:

·         Subrutinas: Ejecutan una acción sin retornar un valor.
·         Funciones: Ejecutan una acción retornando un valor.
·         De Eventos: Se desencadenan con la interacción del usuario o ante algún evento.
·         De Propiedades: Devuelven y asignan valores a propiedades de un objeto.

DECLARACIÓN DE UN PROCEDIMIENTO

SUBRUTINA:
[Public ¦ Private ¦ Friend] Sub ([Optional] [ByVal ¦ ByRef]  As )
         
         [Exit Sub]
End Sub
FUNCIÓN:
[Public ¦ Private ¦ Friend] Function () As 
         
         [Exit Function]
         [= ¦ Return(Valor)]
End Function

NOTAS:
  • El tipo de argumento por defecto es ByVal (en la versión anterior era ByRef)
  • Si se usa Optional debe inicializarse con un valor (antes no era obligatorio)
  • Se puede usar Return para regresar a la llamada del procedimiento.

LLAMADA A UN PROCEDIMIENTO

Antes existía una forma de llamar a una subrutina y dos formas de llamar funciones (o como subrutina o como función, ésta última mediante paréntesis). En cambio ahora, existe una sola forma de llamar procedimientos, sea subrutinas o funciones, que es escribiendo el nombre seguido de paréntesis y entre éstos los parámetros (si los hay).
SINTAXIS:
[Variable=]([Parámetro(s)])


THREADS

Un thread es la unidad básica para que el Sistema Operativo pueda ejecutar un proceso. Una aplicación (AppDomain) siempre inicia un solo thread, pero este a su vez puede iniciar otros thread. Al proceso de ejecutar varios Thread le llamaremos Threading.
La ventaja principal de los Threads es tener varias actividades ocurriendo en forma simultánea, lo cual es una gran posibilidad para que los desarrolladores puedan trabajar con varios procesos sin perjudicar otras tareas. Por ejemplo, el usuario puede interactuar con la aplicación mientras se va ejecutando una consulta de miles de registros.
Se recomienda el uso de Threads en las siguientes situaciones:

·         Para comunicaciones sobre una red, servidor Web o Servidor de Base de Datos.
·         Al ejecutar operaciones que demoren bastante tiempo.
·         Para mantener siempre disponible la comunicación entre el usuario y la interface, mientras se van ejecutando tareas en segundo plano, etc.

El uso de Threads intensivamente disminuye los recursos del sistema operativo, por tanto solo se recomienda usar en los casos ya descritos, sino la performance de la aplicación disminuirá.


Para implementar Threads se usa el NameSpace: “System.Threading.Thread” y luego se hace uso de los métodos que se definen a continuación:
·         Start: Inicia un thread, el cual es un proceso de llamada asíncrona. Para saber el estado del Thread hay que usar las propiedades ThreadState y IsAlive.
·         Abort: Cancela un thread iniciado, si deseamos saber el estado nuevamente podemos usar las propiedades ThreadState y IsAlive.
·         Sleep: Ocasiona una pausa en milisegundos del bloque de instrucciones.
·         Suspend: También ocasiona una pausa en el bloque de instrucciones.
·         Resume: Reinicia una pausa originada con el método Suspend.
·         Interrupt: Interrumpe una pausa originando una exepción.
·         Join: Espera por un thread.


Un thread puede tener diferentes estados en un mismo tiempo, para saber su estado se encuentra la propiedad ThreadState que devuelve un valor que indica el estado actual del thread.
Acción
Estado de Transición
Otro thread llama a Thread.Start
Unchanged
El thread inicia su ejecución
Running
El thread llama a Thread.Sleep
WaitSleepJoin
El thread llama a Monitor. Espera en otro objeto
WaitSleepJoin
El thread llama a Thread.Join en otro thread
WaitSleepJoin
Otro thread lalma a Thread.Suspend
SuspendRequested
El thread responde a un requerimiento de Thread.Suspend
Suspended
Otro thread llama a Thread.Resume
Running
Otro thread llama a Thread.Interrupt
Running
Otro thread llama a Thread.Abort
AbortRequested
El thread responde a Thread.Abort
Aborted

DEPURACIÓN
La Depuración es el proceso de realizar un seguimiento a una aplicación para analizar variables, expresiones, objetos, etc. y probar sus valores en diferentes escenarios, así como probar el desempeño de la aplicación.
En Visual Studio .NET, existe un mismo depurador para Visual Basic .NET y C# (código administrado), el cual tiene las siguientes mejoras:

  • DEPURAR A TRAVÉS DE DIFERENTES LENGUAJES: Se puede depurar aplicaciones escritas en diferentes lenguajes que son parte de una misma solución, por ejemplo una aplicación cliente para la interface de usuario escrita en Visual Basic o C# y una aplicación servidor escrita en Visual C++.
  • ADJUNTAR PROGRAMAS EN EJECUCIÓN: Es posible adjuntar un programa que se está ejecutando al depurador, y depurar el programa como si estuviera en el IDE de Visual Studio. Esto se realiza a través de la Ventana de Procesos, que muestra todos los procesos que están ejecutándose mientras se corre una aplicación.
  • DEPURACIÓN REMOTA: Se puede añadir y depurar un proceso que está ejecutándose en una computadora remota, por ejemplo podemos depurar una aplicación cliente Windows que llama a un Web Service que está corriendo en otra máquina, pudiendo depurar a este Web Service como si estuviera en la máquina donde está corriendo la aplicación cliente.
  • DEPURACIÓN DE APLICACIONES MULTI THREAD: Una nueva característica de Visual Basic es el soporte de aplicaciones multi thread, para lo cual se dispone de la Ventana de Threads en donde se muestra los threads que se encuentran en ejecución.
  • DEPURACIÓN DE APLICACIONES WEB: Esta característica ha sido mejorada, permitiendo adjuntar una página ASP .NET al proceso que se encuentra en ejecución, que puede ser una aplicación Web y realizar el proceso de depuración de la página como si estuviera en la computadora local, etc.
Para realizar la Depuración se dispone de dos tipos de herramientas, que son:
  • BARRAS DE DEPURACIÓN: Contienen los comandos para realizar la depuración, como el seguimiento paso a paso, fijar puntos de interrupción, mostrar las ventanas de depuración, etc.
  • VENTANAS DE DEPURACIÓN: Son ventanas donde se muestra el estado en que se encuentran las variables, expresiones, procedimientos, objetos, etc. Algunas permiten el análisis o inspección y otras la visualización o modificación del estado de objetos.
Existen dos barras de depuración que a continuación se describen:
  • Barra de Depuración: Es la principal barra que contiene todos los comandos de depuración (34 en total), desde ejecutar una aplicación hasta fijar desensamblar.

*  Inicia la ejecución de la aplicación.
*  Ejecuta la aplicación sin entrar en depuración. 
*  Interrumpe la ejecución e ingresa al modo pausa.
*  Finaliza la ejecución de la aplicación.
* Quita todas las aplicaciones anexadas.
* Reinicia nuevamente la ejecución de           la aplicación.
* Aplica los cambios realizados al código si es que estamos en modo pausa.
  Muestra la siguiente sentencia a depurarse.
 Ejecuta paso a paso incluyendo procedimientos.
 Ejecuta paso a paso sin incluir procedimientos.
 Retrocede al paso anterior en un seguimiento paso a paso.
 Indica el tipo de depuración paso a paso; puede ser por línea (por defecto), por sentencia o por instrucción.

  Pasa a la siguiente sentencia a depurarse.
  Ejecuta la sentencia o línea especificada por el Cursor del mouse en una ventana.
  Inserta un punto de interrupción donde se detendrá la ejecución.
 Habilita o deshabilita un punto de interrupción previamente insertado.
  Borra o elimina todos los puntos de interrupción fijados.
 Visualiza la ventana de Breakpoints.
 Presenta la ventana de Excepciones para controlar errores.
 Muestra la ventana de documentos ejecutándose.
 Visualiza la ventana Autos.
  Presenta la ventana Local.
  Muestra la Ventana This que contiene la clase actual.
 Activa la ventana Watch conteniendo las expresiones de análisis.
  Visualiza la ventana Immediate.
 Presenta la ventana Call Stack o de llamada a la pila.
  Muestra la ventana de Threads.
  Activa la ventana de Módulos.
 Visualiza la ventana de Procesos en ejecución.
 Presenta la ventana QuickWatch o de Análisis Rápido.
 Muestra la ventana de contenido de Memoria.
 Muestra la ventana del Desensamblador de código.
  Visualiza la ventana de Registros del procesador.
 Presenta la ventana del desensamblador para fijar cursor.

  • BARRA DE UBICACIÓN DE DEPURACIÓN: Es una nueva barra que muestra información de la aplicación que se está depurando, tal como el nombre del programa, el thread y el procedimiento que se encuentra en ejecución (en la pila) 


  Muestra el Programa que se está depurando.

   Visualiza el Thread que se está depurando.

 Muestra el Procedimiento que se encuentra en ejecución.

En esta nueva versión de Visual Basic existen alrededor de 17 ventanas de depuración, entre las cuales veremos algunas:
  • VENTANA BREAKPOINTS: Presenta información de los puntos de interrupción insertados tal como la ubicación, condición, numero de veces que ingresa, datos y nombre del programa que está en ejecución.

  • VENTANA AUTOSMuestra información de las variables usadas en la sentencia actual y en las sentencias anteriores; la sentencia actual es aquélla en donde se encuentra la depuración. Esta ventana no puede reconocer arrays ni estructuras.

  • VENTANA LOCALSInspecciona variables, parámetros y objetos relacionados con el procedimiento actual o que se encuentra en depuración. También permite la modificación de valores dando un doble clic sobre estos.
  
  • VENTANA THIS: Inspecciona el objeto (módulo) que se encuentra en depuración, mostrando su contenido. También permite la modificación de valores dando un doble clic sobre estos.
  
  • VENTANA WATCH: Inspecciona una variable o expresión previamente definida. También permite añadir una expresión de análisis, modificar sus valores y eliminarla.
  • VENTANA IMMEDIATE: Se usa para preguntar y/o modificar valores de variables que se encuentran en ejecución o públicas, también ejecuta instrucciones o comandos.

  • VENTANA CALL STACK: Visualiza los procedimientos que se encuentran en ejecución en la memoria dinámica o pila, si es una aplicación .NET también señala el lenguaje.
  •  
  • VENTANA THREADS: Muestra todos los threads que se encuentran actualmente en ejecución mientras se está depurando la aplicación, presentando información de su código, nombre, ubicación, prioridad y si se encuentra suspendido o no.

  • VENTANA MODULES: Presenta información sobre los módulos cargados en memoria (la Aplicación y sus DLLs) mostrando su nombre, dirección, ruta, versión, programa, etc.

  • VENTANA PROCESSES: Visualiza los procesos que se encuentran en ejecución en el sistema, también permite anexar y desanexar procesos externos para depurarlos, etc.


Durante el desarrollo y ejecución de toda aplicación pueden presentarse diferentes tipos de errores, los cuales impiden el normal funcionamiento de la aplicación. A estos errores se les llama Excepciones.


Los errores o excepciones se pueden clasificar en 3 tipos:
  • ERRORES DE SINTAXIS: Suceden al escribir código en la aplicación; como por ejemplo una instrucción mal escrita, omisión de un parámetro obligatorio en una función, etc.
Visual Basic notifica de cualquier error de sintaxis mostrando una marca de subrayado azul (por defecto) con un comentario indicando la causa del error.
Una ayuda para corregir errores de sintaxis, es usar la sentencia Option Explicit que fuerce a declarar variables y evitar expresiones inválidas.
  • ERRORES LÓGICOSOcurren una vez usada la aplicación y consiste en resultados inesperados o no deseados; por ejemplo una función que debe devolver el sueldo neto está devolviendo un valor de cero o negativo, o una subrutina que debe eliminar un archivo temporal no lo está borrando.
Para corregir este tipo de errores se hace uso de las herramientas de depuración, como por ejemplo un seguimiento paso a paso, o inspeccionar el valor de una variable o expresión.
También podemos disminuir errores o excepciones de tipos de datos no deseados usando la sentencia Option Strict que evita la conversión forzosa y verifica que el tipo de dato asignado sea del mismo tipo que la variable o función, o que un parámetro pasado sea del mismo tipo, etc.
  • ERRORES EN TIEMPO DE EJECUCIÓN: Este tipo de errores suceden en plena ejecución de la aplicación, después de haber sido compilado el código. No son errores de mala escritura ni de lógica, sino mas bien de alguna excepción del sistema, como por ejemplo tratar de leer un archivo que no existe o que está abierto, realizar una división entre cero, etc.
Para controlar los errores en tiempo de ejecución disponemos de los Manipuladores o Controladores de Error, que evitan la caída del programa y permiten que siga funcionando. A continuación veremos las formas de implementar el control de este tipo de errores.


Existen dos formas de controlar errores o excepciones en Visual Basic .NET:
  • CONTROL NO ESTRUCTURADO: Se implementa usando la sentencia On Error GoTo.Es la forma como se controla errores en las versiones anteriores a Visual Basic .NET y consiste en el uso de etiquetas, es decir recurrir a la programación etiquetada, cuando ocurre algún error toma el control el código que se encuentra a continuación de la etiqueta.
Existen varias sintaxis o formas de usar la sentencia On Error, tal como se define:
  1. ON ERROR RESUME NEXT: Indica que si ocurre un error en tiempo de ejecución el flujo continúe en la siguiente línea después de la que originó el error.
  2. ON ERROR GOTO 0: Deshabilita cualquier Controlador de error, previamente declarado en el procedimiento actual, configurando este a Nothing.
  3. ON ERROR GOTO –1: Deshabilita cualquier error o excepción que ocurra en cualquier línea del procedimiento actual, configurando este a Nothing.
  4. ON ERROR GOTO ETIQUETA: Si un error en tiempo de ejecución ocurre envía el control a la instrucción que está debajo de la etiqueta definida. Es la mejor forma no estructurada de controlar errores, ya que se puede personalizar mensajes.
La forma de implementar esta sentencia en un procedimiento es:
Inicio Procedimiento()
On Error GoTo 

Exit Sub
:
                  
                        [Resume ¦ Resume Next ¦ Resume Etiqueta]
            Fin Procedimiento

Para salir de la etiqueta, generalmente se usa la instrucción Resume, de 3 formas:
  • RESUME: Vuelve a la instrucción que produjo el error.
  • RESUME NEXT: Regresa el flujo a la siguiente instrucción después de la que produjo el error.
  • RESUME ETIQUETA: Bifurca el control a una etiqueta definida por el usuario.
Al usar la sentencia On Error GoTo si un error en tiempo de ejecución ocurre el control es tomado por el código de la Etiqueta y la información del error ocurrido es almacenada en el Objeto Err, tal como el número del error, su descripción y el origen.
  • CONTROL ESTRUCTURADO: Es la forma mas recomendable de controlar errores y es una nueva característica de Visual Basic .NET; se implementa usando la estructura Try..Catch..Finally.
La forma de implementar esta sentencia en un procedimiento es:
Inicio Procedimiento()
Try

[Exit Try]
[Catch 1  [ [As ]]  [When ]]

[Exit Try]
[Catch 2  [ [As ]]  [When ]]

[Exit Try]
:
:
[Catch n  [ [As ]]  [When ]]

[Exit Try]
Finally

End Try
Fin Procedimiento

Cuando usamos la sentencia Catch se hace referencia a una variable que es del Tipo de Dato Exception (nombre de la clase) o una clase derivada de ésta, la cual contiene información sobre el error ocurrido, tales como su número, descripción, origen, etc. En la sentencia Catch también podemos analizar el error usando la palabra When seguida de una expresión, lo que permite filtrar el error de acuerdo a un criterio, que generalmente es el número del error.

Para salir de la estructura Try..Catch..Finally se hace uso de la sentencia Exit Try que ejecuta la siguiente línea a la sentencia End Try.
En la estructura Try..Catch..Finally se ejecuta las instrucciones que hubieran debajo del Try, si un error en tiempo de ejecución ocurre, el flujo es pasado a la sentencia Catch que contenga el control de dicho error, si dicho error no es especificado por el Catch se mostrará un mensaje de error normal. Finalmente se ejecuta las instrucciones del Finally.


Para controlar excepciones no solo basta usar una forma de control, sea no estructurada o estructurada, sino también es necesario configurar las opciones de control de excepciones para lo cual del menú “Debug” se elige “Windows” y luego “Exceptions” ó también se puede elegir directamente el botón “Exceptions” de la Barra de Depuración.
Aparecerá la ventana de control de excepciones que se muestra a continuación:
  
Existen 2 momentos en que se pueden controlar las excepciones que son:
  • When the exception is thrown: Es cuando la excepción ocurre y se aconseja configurarlo en “Continue”.
  • If the exception is not handled: Ocurre cuando la excepción no es controlada, es decir cuando no existe controlador de error, es aconsejable que esté en “Break into the debugger”.
  • Ambos momentos tienen 3 opciones o formas de control, que son:
  • Break into the debugger: Para y muestra el depurador con la línea donde ocurrió el error en tiempo de ejecución.
  • Continue: Continua la ejecución del programa. Si no existe controlador Finaliza la ejecución del programa.
  • Use parent setting: Indica que se va a usar la configuración de la opción de nivel superior o padre.

El presente laboratorio tiene como objetivo conocer el Entorno de Visual Studio .NET y usar algunas características nuevas del Lenguaje Visual Basic .NET, así como implementar Multi Threads y Controlar Excepciones.

  • Cargue Visual Studio .NET, aparecerá la pagina de inicio, en ella elegir la opción “Get Started” y luego elegir “Create New Project”, observe los diferentes tipos de proyectos y sus respectivas plantillas.
  • Elegir un tipo de proyecto “Visual Basic” y una plantilla de “Aplicación Windows”, seleccionar como ubicación la carpeta “C:\VBNET\Labs” y como nombre ingrese “Lab03_1”.
  • Observe el IDE de Visual Studio .NET cuando se trata de una aplicación para Windows. ¿Qué ventanas son nuevas en esta versión?. Luego, pruebe la característica de “Auto Ocultar” de las ventanas y la ayuda dinámica.
  • Vamos a empezar a crear una aplicación en la que en un formulario se ingresen los datos de unos alumnos, tal como su nombre, notas de sus exámenes parcial y final y se calculará el promedio y condición. Además, en otro formulario se mostrará un informe del total de alumnos ingresados, aprobados, desaprobados y el promedio total.
  • Primero en la ventana del “Solution Explorer” seleccionar el nombre del formulario y en la ventana de propiedades escribir en la propiedad “FileName” el nombre “frmDatos.vb”.
  • Realizar el diseño del formulario similar al de la figura 1.18, ingresando como prefijo de la propiedad “Name” de las etiquetas las iniciales “lbl”, para los textos “txt” y para los botones “btn”, seguido del nombre que generalmente es similar al contenido de la propiedad “Text”.
  • Después de realizar el diseño y configurar las respectivas propiedades de los objetos, visualice el código del formulario. Observe las nuevas características del Lenguaje y notes la diferencias entre esta versión y la anterior.
ara realizar los cálculos de la aplicación vamos a crear variables y funciones públicas en un módulo estándar, para lo cual del menú “Project” elegimos la opción “Add Module” y luego escribimos en el nombre “Modulo.vb”
  • Escribir el siguiente código en el módulo:
Module Modulo
    Public NTotal, NAprobados, NDesaprobados As Byte
    Public Suma, PromTot As Single
    
    Public Function Calcular_Promedio(ByVal Par As Byte, _
ByVal Fin As ByteAs Single
        Return ((Convert.ToSingle(Par + 2 * Fin)) / 3)
    End Function
    
    Public Function Calcular_Condicion(ByVal Pro As Single) _
As String
        NTotal = +1
        Suma = +Pro
        If Pro > 10.5 Then
            NAprobados = +1
            Return ("Aprobado")
        Else
            NDesaprobados = +1
            Return ("Desaprobado")
        End If
    End Function
End Module

  • Regresar al formulario y proceder a escribir código en los eventos de los botones, tal como se muestra a continuación:
    Protected Sub btnCalcular_Click(ByVal sender As Object, …)
        Dim Par, Fin As Byte
        Dim Pro As Single
        Par = Convert.ToByte(txtParcial.Text)
        Fin = Convert.ToByte(txtFinal.Text)
        Pro = Calcular_Promedio(Par, Fin)
        txtPromedio.Text = Format(Pro, "#.00")
        txtCondicion.Text = Calcular_Condicion(Pro)
    End Sub
    
    Protected Sub btnNuevo_Click(ByVal sender As Object, …)
        Dim X As Control
        For Each X In Me.Controls
            If TypeOf X Is TextBox Then X.Text = ""
        Next
        txtNombre.Focus()
    End Sub
    
    Protected Sub btnInforme_Click(ByVal sender As Object, …)
        Dim X As New frmInforme()
        X.ShowDialog()
    End Sub
    
    Protected Sub btnSalir_Click(ByVal sender As Object, …)
        Me.Close
    End Sub

  • Para mostrar el informe de situación de alumnos ir al menú “Project” y elegir la opción “Add Windows Form” y en el nombre escribir “frmInforme.vb”. Luego realizar el diseño del formulario, tal como se muestra en la figura de abajo.

  • Ingresar al código del formulario “frmInforme” y proceder a escribir código en el evento “Load” para que se muestre las estadísticas de los alumnos:
    Public Sub frmInforme_Load(ByVal sender As Object, …)
        txtTotal.Text = NTotal.ToString
        txtAprobados.Text = NAprobados.ToString
        txtDesaprobados.Text = NDesaprobados.ToString
        txtPromedioTotal.Text = Format((Suma / NTotal), "#.00")
    End Sub
    
  • Luego programar en los botones de “Aceptar” y “Cancelar” el regreso y la finalización de la aplicación respectivamente, similar al código mostrado abajo:

    Protected Sub btnAceptar_Click(ByVal sender As Object, …)
        Me.Close()
    End Sub
    
    Protected Sub btnCancelar_Click(ByVal sender As Object, …)
        End
    End Sub

  • Grabar y ejecutar la aplicación; para probar ingresar como mínimo los datos de dos alumnos, mostrar el informe y finalizar.
  • Diríjase al “Explorador de Windows” y analice el contenido de la carpeta “Lab01_1”, observe que existen varios tipos de extensiones, sln para la solución, vbproj para la aplicación y vb para los formularios y el módulo.
  • Finalmente, ingrese a la carpeta “bin” de “Lab01_1” y observe dos archivos: uno ejecutable (extensión exe) y otro archivo intermedio (extensión pdb), ¿Cuál de estos es conocido como Assemblie?.

EJERCICIO 2: IMPLEMENTANDO MULTI THREAD Y CONTROL DE EXCEPCIONES

·         Ingrese a Visual Studio .NET y del menú “File” elegir “New” y luego “Project” o simplemente pulsar [Ctrl] + [N], luego elegir un tipo de proyecto “Visual Basic” y una plantilla de “Aplicación Windows”, seleccionar como ubicación la carpeta “C:\VBNET\Labs” y como nombre ingresar “Lab03_2”.
·         Se va a crear una aplicación en la que se implemente múltiples threads para iniciar la lectura de un archivo de texto extenso y poder cancelar este proceso si es necesario, además para evitar los errores en tiempo de ejecución haremos uso del control estructurado de excepciones visto en este módulo.
·         Primero en la ventana del “Solution Explorer” seleccionar el nombre del formulario y en la ventana de propiedades escribir en la propiedad “FileName” el nombre “frmArchivo.vb”.
·         Realizar el diseño del formulario similar al presentado aquí abajo:


·         Declarar una variable llamada Hilo de tipo thread y definir una subrutina que lea el archivo de texto cuya ruta y nombre está especificado en el cuadro de texto, esta rutina usa Try..Catch..Finally para controlar errores en tiempo de ejecución.
    Dim Hilo As System.Threading.Thread
   
    Sub LeerArchivo()
        Dim Flujo As System.IO.StreamReader
        Dim Linea As String = " "
        Try
            Flujo = System.IO.File.OpenText(txtNombre.Text)
            Do Until IsNothing(Linea)
                Linea = Flujo.ReadLine
                txtArchivo.Text = txtArchivo.Text + Linea + Chr(13)
+ Chr(10)
            Loop
        Catch X As IO.IOException
            MsgBox(X.Message, MsgBoxStyle.Information, "No se pudo")
            txtNombre.Clear()
            Exit Sub
        End Try
        Flujo.Close()
        btnSuspender.Enabled = False
        btnContinuar.Enabled = False
        btnCancelar.Enabled = False
    End Sub
    Escribir código en el evento “TextChanged” de “txtNombre” y en los eventos “Click” de los “Botones”.
    Private Sub txtNombre_TextChanged(ByVal sender As …) Handles …
        btnLeer.Enabled = txtNombre.Text <> ""
    End Sub

    Private Sub btnLeer_Click(ByVal sender As …) Handles …
        Hilo = New System.Threading.Thread(AddressOf LeerArchivo)
        Hilo.Start()
        btnSuspender.Enabled = True
        btnCancelar.Enabled = True
    End Sub
    Private Sub btnCancelar_Click(ByVal sender As …) Handles …
        Hilo.Abort()
        btnLeer.Enabled = False
        btnSuspender.Enabled = False
        btnCancelar.Enabled = False
    End Sub
    Private Sub btnNuevo_Click(ByVal sender As …) Handles …
        txtNombre.Clear()
        txtArchivo.Clear()
        txtNombre.Focus()
    End Sub
    Private Sub btnSuspender_Click(ByVal sender As …) Handles …
        Hilo.Suspend()
        btnLeer.Enabled = False
        btnContinuar.Enabled = True
        btnCancelar.Enabled = False
    End Sub
    Private Sub btnContinuar_Click(ByVal sender As …) Handles …
        Hilo.Resume()
    End Sub
    Private Sub btnSalir_Click(ByVal sender As …) Handles ...
        Me.Close()
    End Sub
Finalmente, grabar y ejecutar la aplicación




david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra  david flores zafra, david flores, David Flores Zafra, Flores Zafra David, david flores, flores zafra