Cursosindustriales.net Página 1 CURSO DE VB.NET. CLASES Y LIBRERIAS. Como ya te puedes dar cuenta, la gran mayoría de VB.NET está basado en clases. La gran mayoría de las clases proceden de .NET Framework. Para cualquier acción, usamos una clase. En este capítulo veremos el uso de las clases y, aprenderemos a crear nuestras propias clases. Cursosindustriales.net Página 2 ¿QUÉ ES UNA CLASE? Una clase es un objeto que deriva de una clase básica llamada Object. Esta clase básica tiene una serie de métodos y propiedades comunes a todas las clases creadas con cualquier lenguaje usado en .NET Framework. Y como Visual Basic.NET se basa en .NET Framework, este lenguaje de programación se basa en la clase Object. Para entender como de una clase se crean otras muchas, nos remontaremos a la programación orientada a objetos (POO). Programación orientada a objetos. VB.NET a diferencia de lo que ocurría en las versiones anteriores de Visual Basic, es un lenguaje orientado a objetos. Por ello se caracteriza por: Ser encapsulado. Tener la capacidad de heredar. Polimorfismo. La encapsulación significa que toda la información que una clase u objeto deba de tratar se mantenga oculta al programador y al resto de usuarios. El objeto en cuestión, solo facilitará las propiedades y métodos del mismo para que el programador o usuario puedan modificar las características del objeto. La herencia es la habilidad de crear nuevas clases basadas en otras clases. La nueva clase heredará todos los métodos, propiedades y eventos de la anterior clase de la que proviene. Además tiene la capacidad de añadir nuevos eventos de la que se ha heredado al provenir esta otra de la clase general Object. Polimorfismo significa que puedan existir métodos y propiedades con el mismo nombre en diferentes clases. Cursosindustriales.net Página 3 CREAR NUEVAS CLASES. Para crear una nueva clase necesitamos usar la sentencia New en nuestro código de VB.NET. Por ejemplo cuando creamos una nueva clase de formulario asignamos a una variable la nueva clase de tal forma que quedaría así. Dim formulario as New Form Esta sentencia crea una nueva clase de formulario, pero no la inicializa ni la usa, solo la crea. Ahora hay que definir las propiedades y métodos de esa clase, inicializarla y ajustarla. Eso es lo que hace el CLR cuando inicio un nuevo proyecto de VB.NET ya que crea las clases que necesitas en un nuevo archivo llamado NOMBREPROYECTO.Designer.vb del proyecto y las inicializa de acuerdo las vayas escribiendo dentro del proyecto. Así que cuando insertas, por ejemplo un botón en tu proyecto, en el archivo se crean las instrucciones para crearlo, llamando a la clase, y después configurándola mediante algunas propiedades y métodos. Cursosindustriales.net Página 4 Para que nos quede más grabado vamos a crear una nueva clase en este proyecto para no estar mareando la pedíz. La nueva clase la vamos a crear en el evento Load del formulario, por lo que cuando se ejecute el formulario, se creará la nueva clase y se ejecutará (al escribirla alguna acción). Aunque esta forma de trabajar no se realiza, observa como hemos creado en la carga del formulario una clase llamada mensaje y además hemos ligado una acción a dicha clase mediante un nuevo proceso. Esta es la forma en la que VB.NET carga las librerías y las utiliza en nuestros proyectos. Cursosindustriales.net Página 5 LIBRERÍAS. Las librerías (comúnmente llamadas así), son en realidad bibliotecas de clases de .NET Framework de Visual Studio. Estas bibliotecas de clases están formadas por Namespaces o espacios de nombres. Cada espacio de nombres contiene tipos que se pueden utilizar en el programa: clases, estructuras, enumeraciones, delegados e interfaces. Cuando se crea un proyecto de VB.NET, se sigue haciendo referencia a las DLL más comunes de la clase base (ensamblados). No obstante, si necesita usar un tipo incluido en una DLL a la que aún no se hace referencia, deberá agregar la referencia de esa DLL. Y eso es lo que vamos a hacer en la práctica propuesta para que sepas como agregar una librería al proyecto de manera manual. Cursosindustriales.net Página 6 ¿Cómo se crea una librería? Crear una librería es tan sencillo como crear un nuevo proyecto de Windows Form. Para ello, sobre el menú de Nuevo proyecto escoge sobre Biblioteca de clases. Para que nos sea sencillo después llamarla, la llamaré Foto. Tú puedes llamarla como quieras. Cuando pulsas sobre Aceptar, se te muestra directamente la ventana de código, ya que las bibliotecas de clases, no suelen tener un formulario sobre el que se asientan porque, en realidad no las hace falta. En la nueva clase, puedes incluir todas las instrucciones precisas para usarlas en otros proyectos, como por ejemplo nuevos formularios, acciones y eventos específicos, gráficos y efectos al proyecto, etc. Cursosindustriales.net Página 7 Para no enrollarnos demasiado, vamos a diseñar la estructura básica y simplemente crearemos una alerta con un MsgBox. Como puedes ver no podrás escribir nada dentro de la clase principal, sino que deberás de crear nuevos subprocesos para incluir las instrucciones específicas. De hecho, al incluir nuevos subprocesos y cargar la clase en otro proyecto, solamente debes hacer referencia al subproceso de la librería para que ejecute la acción contenida en ella. Por tanto de momento quedaría así. Pulsa sobre menú Archivo y Guardar o pulsa Control + S para que se guarde el archivo de librería. NOTA: Todos los subprocesos que utilices desde la librería en procesos externos deberán de tener la categoría de públicas, al igual que la clase general de Class1, que por defecto es pública. Si utilizaras un proceso privado, no podrías ejecutar la instrucción llamándola desde el proceso. ¿Dónde se guarda? Cuando abres la carpeta del proyecto para coger la librería creada en sí, puede que te lleves una sorpresa. Cursosindustriales.net Página 8 Esto es muy habitual en Visual Studio 2010. Para solucionarlo debes de abrir el proyecto de la clase, y en el menú de Generar, pulsar sobre Generar Foto (Foto es el nombre de la clase que yo le he dado). Ahora pulsa de nuevo sobre Guardar y cuando vuelvas a la carpeta, si sigue en blanco pulsa sobre F5 para refrescar y ahora si te aparecerán los nuevos archivos. Utilizar esta librería en un nuevo proyecto. Aunque el uso de librerías está ligado a acciones más complejas que las de un simple mensaje de alerta, voy a utilizar la librería creada anteriormente para que veas como importar librerías creadas con VB.NET, pero quiero que comprendas que no es rentable en cuanto al rendimiento de una aplicación usar librerías externas al proyecto si el propio proyecto puede hacer lo mismo que la librería externa. Abre un nuevo proyecto de Windows Form y llámalo, por ejemplo Cargar_Foto. Cursosindustriales.net Página 9 Te aparecerá el formulario y los demás elementos ya conocidos de sobra. En la ventana del Explorador de soluciones, pulsa sobre el archivo de My Project para que se te cargue la configuración de la aplicación. Selecciona la pestaña Referencias. Desde esta ventana puedes ver las librerías de .NET Framework que utiliza tu proyecto. Aunque en la imagen no se puede ver porque la he recortado debajo hay un botón que pone Agregar. Se te abre una ventana de Agregar referencia en la cual tienes 5 pestañas diferenciadas. Cursosindustriales.net Página 10 Pulsa sobre la pestaña de Examinar y se te cargará el directorio en el cual están guardados tus proyectos de VB.NET. Selecciona el proyecto de la librería creada en el anterior proyecto y pulsa sobre Aceptar. Ahora en la ventana de Agregar referencia, se te ha cargado la librería creada anteriormente. Y una vez cargada nuestra librería en el proyecto solo tenemos que importarla desde el formulario de inicio. Cursosindustriales.net Página 11 Para "cargar" la librería creada anteriormente, debemos de llamar al subproceso en cuestión para que realice la acción programada. Obviamente dependiendo en la parte del proyecto nuevo en que llamemos a la librería, evento y propiedad, ésta se ejecutará en un lugar u otro. Yo llamaré a la librería desde el evento Load del formulario, para que se ejecute la librería nada más cargue el proyecto, tal y como puedes ver. Como la librería es una clase, debes de hacer referencia a esa clase y crear en tu proyecto una nueva clase, que se llamará igual que la clase referenciada. Así en la sentencia: Dim mensaje As New Foto.Class1 Estás creando en el proyecto la clase que ya está creada en la librería, asignándola un nombre. En la siguiente línea, aplicas mediante el operador punto (.), el proceso en el cual has escrito de la librería. Así que cuando ejecutes, se te mostrará la siguiente ventana: Cursosindustriales.net Página 12 ACCESO A UNA CLASE DE UN NAMESPACE. Cuando accedemos a las propiedades o métodos de una clase, hay que especificar el nombre de la clase seguida de un punto y después el nombre del miembro que queremos acceder. Por ejemplo, para usar el método WriteLine en una consola de comandos, de la clase Console hay que indicarlo de la forma Console.WriteLine. Para acceder a un miembro de un Namespace hay que hacerlo de la misma forma; especificando el nombre del Namespace y a continuación la clase y el procedimiento al que queremos acceder. Pero si esa clase está dentro del mismo Namespace en el que nos encontramos, no es necesario indicarlo. Se pueden definir espacios de nombres dentro de un espacio de nombre de la misma forma que he definido anteriormente, es decir mediante un punto y a continuación el nombre de la clase o del otro espacio de nombre. Cursosindustriales.net Página 13 Que es lo mismo que hemos realizado al utilizar la clase creada. Al igual que podemos anidar espacios de nombres, también podemos hacer lo mismo con las clases, es decir, declarar una dentro de la otra. Para poder hacerlo hay que usar el nombre de la clase que la contiene seguida de un punto (.), delante de la clase contenida. Cursosindustriales.net Página 14 Controles VB.NET. TREEVIEW Y LISTVIEW. Estos controles son una mejora significativa del control Listbox, ya que podrán crear y presentar lista jerárquica y elementos estructurados que con el anterior control no era posible hacerse. Eso sí, requiere de mayor atención porque es más complejo. Los controles TreeView y ListView son controles que estudiaremos juntos ya que la función de uno la ligaremos a la otra. Estos controles se usan principalmente para el diseño de interfaces Windows. Es muy habitual utilizar otro objeto que no he mencionado: el control ImageList. Este control almacenará las imágenes que queremos usar junto a los otros dos elementos que vamos a estudiar. Estructura de árbol. El control TreeView (Vista de árbol) implementa una estructura conocida como árbol de datos. Esta estructura es conocida hoy en día en los sistemas Windows para mostrar carpetas y archivos en el Explorador de Windows. Una estructura en árbol se compone de subnodos, los cuales están ligados a otros nodos superiores, y que pertenecen a un nodo principal, como muestra la gráfica. Ten en cuenta que los elementos del TreeView son cadenas de caracteres. En la gráfica puedes ver que el nodo raíz se divide en tres nodos más, que son los elementos del Sistema Solar (en el ejemplo). Y después el Cursosindustriales.net Página 15 elemento Planetas, se subdivide en otros dos nodos formando el segundo nodo o subnodo. Y por último el elemento La Tierra, se divide en más subnodos. Cuando utilizamos el control TreeView en nuestra aplicación, se nos muestra de la siguiente manera: Observa como el control TreeView muestra los elementos del nodo y sus subnodos de manera que los elementos que tengan asignados subnodos, tendrán representados un símbolo + o - de acuerdo estén retraído o expandidos. Este control es un objeto heredado del explorador de Windows. Manejo del TreeView en modo diseño. Crear nodos y subnodos en VB.NET es una tarea muy sencilla hoy en día. En el cuadro de herramientas de VB.NET escoge la herramienta TreeView y colócala en el formulario. , El control es muy parecido al control Listbox cuando lo colocas en el formulario. Pero en la Ventana de propiedades, las propiedades han cambiado. Localiza la propiedad NODES y pulsa sobre los tres puntos (...) para abrir el editor de nodos. Se te abrirá una ventana similar a esta. Cursosindustriales.net Página 16 Simplemente tienes que colocarlo como te he dicho: El primer elemento es el elemento raíz. Después irán los subnodos y cada subnodo llevará su subnodo independiente. Pulsa sobre Agregar raíz para que aparezca un nodo raíz. Al agregar un nuevo nodo a subnodo, se te cargarán las propiedades de dicho nodo. También al seleccionarlo en el control en modo de diseño, se seleccionará las propiedades de dicho nodo / subnodo. Como puedes ver en sus propiedades, puedes cambiar el tipo de fuente, el color, el nombre al nodo, el nombre al control nodo raíz, puedes seleccionar una imagen para que aparezca junto al control, puedes hacer que por defecto esté cerrado o abierto, etc., etc. Pulsa sobre Agregar secundario y se te añadirá un subnodo dentro del nodo raíz. Cursosindustriales.net Página 17 Si pulsas sobre Agregar raíz, se creará otro nodo en la misma raíz que el actual nodo seleccionado. Al pulsar sobre Agregar secundario, crearíamos otro subnodo de éste anterior y así sucesivamente hasta dar con nuestra configuración deseada. Añadir nodos en tiempo de ejecución. Anteriormente hemos visto como crear nodos en diseño para tenerlos ya en la aplicación. Pero a menudo, queremos que se carguen carpetas o directorios específicos dentro del control, o crear desde la aplicación nodos y subnodos para usarlos más adelante. Crearlos desde el tiempo de ejecución implica programar las estructuras para que se pueda realizar dicha acción y podamos establecer los nodos principales y secundarios mediante instrucciones en el código fuente de la aplicación. Todos los nodos pertenecen a la colección Nodes. La sintaxis general es: TreeView1.Nodes La colección Nodes, devuelve una colección del objeto TreeNode llamada TreeNodeCollection, y que cuenta con los métodos Cursosindustriales.net Página 18 y propiedades para actuar con los nodos individuales. La propiedad Nodes del control TreeView1, es la colección de todos los nodos raíz. Así pues para acceder al primer nodo, hay que hacer referencia al índex de dicho elemento, de tal forma que para acceder al primer elemento raíz: TreeView1.nodes(0) Que sería el nodo Sistema Solar. Si ponemos un TextBox en nuestro formulario, podríamos hacer que se mostraran los nodos marcados en el control TreeView de la manera siguiente. En este ejemplo he utilizado la instrucción SelectedNode.Text para indicar que todos los nodos seleccionados se representarán también en el TextBox. AÑADIR NUEVOS NODOS. Para ello, el método Add añade un nuevo nodo a la colección Nodes. Toma como parámetro un objeto TreeNode. La sintaxis de este método es la siguiente: TreeView1.Nodes.Add(nombre) Este método permite escoger el lugar del control TreeView en donde se incrustará el nuevo nodo mediante un índex específico. Así por ejemplo para insertar un nodo llamado Atmósfera dentro del nodo La Tierra: Cursosindustriales.net Página 19 Eso sí, tienes que tener claro cuál es el índex de cada nodo. Para conocer el índex de cada nodo, sustituye la instrucción del código del TreeView_AfterSelect por ésta otra. TextBox1.Text = TreeView1.SelectedNode.Index Esto hará que se muestre el número de elemento que representa cada nodo pulsado. Volviendo al modo de creación de los nodos, puede ocurrir en una lista grande que las instrucciones a escribir sean considerables. VB.NET también ha pensado en eso y posibilita la forma de modo que puedas añadir elementos al nodo padre creando una variable TreeNode de la forma siguiente: Y dentro de los nodos puedes seguir creando más nodos de la misma forma asignándolos a una variable TreeNode. Como ejemplo vamos a crear el subnodo del nodo Aire. Cursosindustriales.net Página 20 Como puedes ver todo es jugar con los índex de los nodos para crear nuevos nodos o subnodos. También puedes también conocer el número de subnodos existentes mediante la propiedad Count usada de la forma siguiente: MsgBox(aire.Nodes.Count()) Y en este caso te muestra un cuadro de aviso con el número 3 (Oxígeno, Nitrógeno y Argón) Eliminar nodos. Para eliminar nodos, se utiliza el método Clear. Este método elimina todos los nodos hijos del nodo actual. Por lo que si estamos en el nodo de Aire, los eliminaremos todos los subnodos. aire.Nodes.Clear() Recuerda que la variable aire en el ejemplo sustituye a TreeView1.Node(0).Nodes(1).Nodes(0).Node(4). Eliminará pues los subnodos de Oxígeno, Nitrógeno y Argón. También se puede eliminar un nodo o subnodo llamándolo desde el valor de su índice. Así pues para eliminar el nodo La Tierra, debemos de llamar poner el índice pertinente de la misma: Cursosindustriales.net Página 21 O lo que es lo mismo: TreeView1.Nodes(0).Nodes(1).Nodes(0).Remove() Control ListView. El control ListView implementa una estructura más simple que la del TreeView. Los elementos de la lista no están organizados como una jerarquía, sino que se encuentran organizados en el mismo nivel uno tras otro. Inserta en tu formulario un control ListView . Como puedes ver el control ListView es muy similar al control Listbox, pero lo que lo hace diferente de éste es que puede mostrar sus elementos de manera diferente. Algunas propiedades de estos elementos son las siguientes: VIEW Y ARRANGE. Existen dos formas de mostrar los datos en el ListView. Por defecto la propiedad View, establece la apariencia general de los elementos, y la propiedad Arrange, fija como se alinean los elementos en la superficie de control. La propiedad View puede tomar los valores siguientes: 1. LargeIcon. Cada elemento se representa por un icono y un título debajo. 2. SmallIcon. Se representa por un pequeño icono y un título a la derecha. 3. List. Se representa únicamente por un título. 4. Details. Se representa por una columna con sus subelementos. 5. Tile. Parecido al SmallIcon, pero para XP y Server 20003. Por defecto la propiedad View toma el valor de LargeIcon. En cuanto a la propiedad Arrange, puede tomar los valores: 1. Default. Cuando se mueve un elemento en el control permanece donde se suelte. 2. Left. Los elementos se alinean al margen izquierdo del control. 3. SnapToGrid. Se alinean según una cuadricula invisible. 4. Top. Se alinean en la parte superior del control. Cursosindustriales.net Página 22 HEADERSTYLE. Esta propiedad determina el estilo de las cabeceras en la vista de detalle. Si la propiedad anterior View está en Details, no tiene sentido usar esta propiedad HeaderStyle. Puede tomar varias configuraciones: Clickable. Cabecera de columna que responde a los clics. NonClickable. No responde a los clics. Este valor es por defecto. None. Sin cabecera de columna visible. ALLOWCOLUMNREORDER. Esta propiedad devuelve un bolean TRUE / FALSE que determina si el usuario puede reordenar las columnas en modo de ejecución. Esta propiedad solo tiene sentido en la vista de detalle. ACTIVATION. Determina como se activan los elementos con el ratón. Puede coger varios valores por defecto. OneClick. Los elementos se activan con un solo clic. Standard. Los elementos se activan con doble clic. TwoClick. Los elementos se activan con doble clic y se cambia el texto. FULLROWSELECT. Esta propiedad también es TRUE / FALSE e indica si el usuario puede o no seleccionar una fila completa. Solo tiene sentido en la vista de detalle. GRIDLINES. Indica también si dibuja líneas entre las celdas de las columnas. También es bolean. Cursosindustriales.net Página 23 GROUP. Los elementos ListView pueden agruparse en distintas categorías. Para utilizar esta característica, primero debes de definir los grupos mediante la propiedad Group del mismo. LABELEDIT. Permite o no al usuario editar el título o texto de los elementos. MULTISELECT. Es un valor bolean. Indica si el usuario podrá seleccionar múltiples elementos o no. SCROLLABLE. Determina si existirán barras de desplazamiento o no. Cursosindustriales.net Página 24 SORTING. Esta propiedad determina como se ordenarán los elementos. Puede adquirir los valores de None, Ascending, para sentido ascendente y Descending, para sentido descendente. También puedes utilizar el método Sort para ordenar los elementos de acuerdo a su título. La colección Columns. Para mostrar los elementos en la vista de detalle en un control ListView, primero deberás de configurar las columnas. La primera columna pertenece al propio elemento y las siguientes a sus subelementos. Se debe de elegir al menos una columna para muestren elementos enla vista de detalle. Los elementos de la colección Columns son del tipo ColumnHeader. La forma más sencilla para configurar una columna es mientras se trabaja en diseño, mediante la herramienta del Editor de la colección ColumnHeader que puedes encontrar en las propiedades del control ListView en la propiedad Columns. En esta ventana puedes agregar o modificar las columnas que necesites. También puedes manipular las columnas desde el código, manipulando la colección Columns. Para ello debes de crear un objeto ColumnHeader para cada columna desde el código. Cursosindustriales.net Página 25 Añadir o eliminar columnas en tiempo de ejecución. Para añadir una nueva columna al control, deberás de usar el método Add de la colección Columns, tal como se indica a continuación: ListView1.Columns.Add(Header, Width, TextAlign) Como parámetros, Header es la cabecera de la columna, Width es el ancho de la misma, y TextAlign es el alineado del texto. El objeto ColumnHeader cuenta con una propiedad Name que cambiará el nombre a la columna, por defecto deColumnHeader1 al que tú quieras. Para eliminar columnas, utiliza el método Remove de la forma: ListView1.Columns(0).Remove Y elimina la columna actual. Recuerda que las columnas y los Items, se organizan mediante números desde el cero y que cuando haces referencia en el index a uno de ello, se elimina dicho elemento. Con el método Clear, eliminas todas las columnas. El método Count, devuelve el número de columnas en dicho control. Elementos y subelementos del ListView. Has visto que un control ListView también puede coger elementos tanto en la fase de diseño como la de ejecución. En la fase de diseño, clic sobre la propiedad de Items en la ventana de propiedades y aparecerá una nueva ventana del Editor de colección. Desde la ventana podrás introducir elementos y subelementos como aparece en la imagen. Cursosindustriales.net Página 26 Al pulsar el botón de Agregar, añades un nuevo elemento. Al seleccionar ese nuevo elemento, las propiedades del mismo cambian a otras propiedades en las cuales, la propiedad SubItem, te abre una nueva ventana del Editor de la colección ListViewSubItem para que añadas nuevos SubItems. Puedes ajustar el color de los SubItems, la fuente y el fondo del control en las propiedades del objeto ListViewItem. Cursosindustriales.net Página 27