Integrando elementos. Un visualizador de gráficos

Integrando elementos. Un visualizador de gráficos

Para finalizar con el presente tema, vamos a realizar, a modo de práctica, una aplicación que contendrá un formulario para visualizar archivos de imagen. De esta forma practicaremos con algunos de los puntos ya tratados, y nos servirá para presentar dos nuevos controles: TreeView y ListView.

© Grupo EIDOS 35. GDI+. Acceso al subsistema gráfico de Windows

El ejemplo comentado en este apartado se encuentra en el proyecto VisualizadorGraf (hacer clic aquí para acceder a este ejemplo), y consiste en crear un formulario con un ComboBox que permita, en primer lugar, seleccionar una unidad lógica del equipo. Una vez hecho esto, se llenará el TreeView con la lista de directorios de la unidad elegida. Al seleccionar un directorio del TreeView, se rellenará el ListView con una lista de ficheros de tipo gráfico, de los que al seleccionar uno, se cargará su contenido en un PictureBox; al realizar dicha carga, podremos optar por ajustar la imagen a las dimensiones del PictureBox o bien mantener el tamaño original de la imagen. Debido a que algunos de estos controles necesitan de imágenes asociadas como iconos, utilizaremos también un control ImageList para almacenar estos iconos.

El control TreeView muestra una lista de elementos dispuestos en forma de árbol o nodos expandibles. La propiedad Nodes es una colección que contiene los nodos del control, que en este caso rellenaremos desde el código del programa. Las propiedades ImageIndex y SelectedImageIndex muestran respectivamente una de las imágenes del control ImageList asociado, con el icono indicativo

de si un nodo se encuentra o no seleccionado. Por otro lado, el control ListView consiste en un ListBox al que podemos asociar una imagen para

cada elemento o item que muestra en la lista. Para poder mostrar los elementos de un ListView de esta forma estableceremos la propiedad View al

valor Details; crearemos una columna en su propiedad Columns, y asociaremos el control ImageList a las propiedades Large/Small/StateImageList. También es conveniente que la propiedad MultiSelect esté a False para poder seleccionar sólo un elemento en cada ocasión. El llenado de este control también lo haremos desde el código de la aplicación. La Figura 337 muestra el formulario de este proyecto una vez completada su fase de diseño.

Figura 337. Formulario del visualizador de gráficos.

Pasando al código de la clase del formulario, debido a que vamos a trabajar con objetos que manipulan directorio y ficheros, importaremos en la cabecera del fichero de código el espacio de nombres System.IO. En el evento Load del formulario, cargaremos el ComboBox con las unidades lógicas

Programación con Visual Basic .NET © Grupo EIDOS

detectadas por el sistema, empleando el objeto Environment del sistema, y su método GetLogicalDrives( ). Ver Código fuente 552.

Imports System.IO

Public Class Form1 Inherits System.Windows.Forms.Form

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load ' al cargar el formulario llenar ' el combo con las letras de unidad Dim sUnidades() As String sUnidades = System.Environment.GetLogicalDrives() Me.cboUnidades.Items.AddRange(sUnidades)

End Sub '....

Código fuente 552

Al seleccionar un elemento en el ComboBox, se produce su evento SelectedIndexChanged, en el que nos ocupamos de obtener los directorios raíz de la unidad lógica seleccionada, y con dicha información, rellenar el TreeView. Ver Código fuente 553.

Private Sub cboUnidades_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles cboUnidades.SelectedIndexChanged

' este evento se dispara cuando se cambia ' el elemento seleccionado del combo

' obtener los directorios raíz de la unidad seleccionada Dim oDirUnidadSelec As New DirectoryInfo(Me.cboUnidades.Text) Dim sDirectorios() As DirectoryInfo sDirectorios = oDirUnidadSelec.GetDirectories()

' vaciar el treeview Me.tvDirectorios.Nodes.Clear()

' dibujar cada nombre de directorio raíz en el treeview Dim oDirInfo As DirectoryInfo Dim oNodo As TreeNode For Each oDirInfo In sDirectorios

oNodo = New TreeNode(oDirInfo.FullName, 0, 1) Me.tvDirectorios.Nodes.Add(oNodo)

Next

End Sub

Código fuente 553

El siguiente paso lógico es la selección de un directorio en el TreeView. Cuando esto suceda, se provocará el evento AfterSelect de dicho control; en él comprobaremos si existen directorios anidados al seleccionado, y al mismo tiempo, llenaremos el ListView con los nombres de ficheros del directorio seleccionado, asociando a cada elemento de la lista, una imagen del control ImageList por el número

de orden que ocupa la imagen en la lista. Ver Código fuente 554.

© Grupo EIDOS 35. GDI+. Acceso al subsistema gráfico de Windows

Private Sub tvDirectorios_AfterSelect(ByVal sender As Object, ByVal e As System.Windows.Forms.TreeViewEventArgs) Handles tvDirectorios.AfterSelect

' si el nodo pulsado no está expandido... If Not e.Node.IsExpanded Then

' comprobar si tiene subdirectorios Dim oSubDirInfo As DirectoryInfo oSubDirInfo = New DirectoryInfo(e.Node.FullPath)

' obtener subdirectorios del directorio seleccionado Dim oSubDirectorios() As DirectoryInfo oSubDirectorios = oSubDirInfo.GetDirectories()

' crear nodos para cada subdirectorio en el treeview Dim oSubDirI As DirectoryInfo Dim oNodo As TreeNode For Each oSubDirI In oSubDirectorios

oNodo = New TreeNode(oSubDirI.Name, 0, 1) e.Node.Nodes.Add(oNodo.Text)

Next

' obtener los archivos del subdirectorio Dim oArchivos() As FileInfo oArchivos = oSubDirInfo.GetFiles()

' limpiar el listview Me.lstFicheros.Items.Clear()

' rellenar el listview con los nombres de archivo ' que tengan tipo gráfico Dim oArchInfo As FileInfo For Each oArchInfo In oArchivos

Select Case oArchInfo.Extension.ToUpper() Case ".BMP", ".PNG", ".WMF" Me.lstFicheros.Items.Add(oArchInfo.Name, 3)

Case ".JPG", ".JPEG" Me.lstFicheros.Items.Add(oArchInfo.Name, 4)

Case ".GIF" Me.lstFicheros.Items.Add(oArchInfo.Name, 5) End Select Next End If End Sub

Código fuente 554

Finalmente, ya sólo queda comprobar cuándo se pulsa en uno de los ficheros de imagen del ListView, cosa que haremos con su evento SelectedIndexChanged. Al producirse esta situación, lo que haremos será invalidar el área de dibujo del PictureBox, forzando a que se desencadene su evento Paint, en donde realmente realizaremos la carga de la imagen. A pesar de todo, en el Código fuente 555 también se acompaña el código para hacer una carga directa de la imagen en el evento sobre el que nos encontramos.

Private Sub lstFicheros_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles lstFicheros.SelectedIndexChanged

If Me.lstFicheros.SelectedItems.Count > 0 Then ' CARGA MANUAL EN PICTUREBOX: ' si invalidamos la región gráfica del picturebox ' obligamos a que se produzca su evento Paint,

Programación con Visual Basic .NET © Grupo EIDOS

' y en ese evento escribimos el código que carga ' la imagen en el control Me.picImagen.Invalidate()

' CARGA AUTOMÁTICA DE IMAGEN: ' escribimos en este evento el código para ' asignar una imagen al picturebox 'Me.picImagen.Image = New Bitmap( _ ' Me.tvDirectorios.SelectedNode.FullPath & "\" & _ ' Me.lstFicheros.SelectedItems(0).Text)

End If

End Sub

Código fuente 555

En el evento Paint del PictureBox, mostramos la imagen seleccionada, ajustada al tamaño del control o con su propio tamaño, según el RadioButton seleccionado del formulario. Adicionalmente, para el caso en el que se redimensione el formulario, también invalidamos el PictureBox, de manera que la imagen que actualmente se esté mostrando será recargada. Veámoslo en el Código fuente 556.

Private Sub picImagen_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles picImagen.Paint

' si el nodo seleccionado tiene contenido If Not (IsNothing(Me.tvDirectorios.SelectedNode)) Then

' crear imagen a partir del fichero seleccionado Dim oBitmap As New Bitmap( _

Me.tvDirectorios.SelectedNode.FullPath & _ "\" & Me.lstFicheros.SelectedItems(0).Text)

' obtener dispositivo gráfico del picturebox Dim oGraf As Graphics = e.Graphics

If Me.rbtAjustar.Checked Then ' dibujar imagen ajustada al picturebox oGraf.DrawImage(oBitmap, 0, 0, _

Me.picImagen.Size.Width, Me.picImagen.Size.Height) Else ' dibujar imagen con su tamaño original oGraf.DrawImage(oBitmap, 0, 0, _

oBitmap.Size.Width, oBitmap.Size.Height) End If End If

End Sub

Private Sub picImagen_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles picImagen.Resize

' al redimensionar, invalidar área gráfica del picturebox Me.picImagen.Invalidate()

End Sub

Código fuente 556

Terminada la escritura de código del programa, sólo queda ejecutarlo para comprobar su resultado, como muestra la Figura 338.

© Grupo EIDOS 35. GDI+. Acceso al subsistema gráfico de Windows

Figura 338. Visualizador de gráficos en ejecución.

Acceso a datos con ADO .NET

En los siguientes temas vamos a tratar el acceso a datos desde VB.NET, haciendo uso del nuevo modelo de acceso a datos incluido en la plataforma .NET Framework: ADO .NET.

Mostraremos las tareas básicas para el acceso a datos desde aplicaciones basadas en formularios Windows, empleando la tecnología proporcionada por ADO .NET.

ADO .NET es la nueva versión del modelo de objetos ADO (ActiveX Data Objects), es decir, la estrategia que ofrece Microsoft para el acceso a datos. ADO .NET ha sido ampliado para cubrir todas las necesidades que ADO no ofrecía, y está diseñado para trabajar con conjuntos de datos desconectados, lo que permite reducir el tráfico de red. ADO .NET utiliza XML como formato universal de transmisión de los datos.

ADO .NET posee una serie de objetos que son los mismos que aparecen en la versión anterior de ADO, como pueden ser el objeto Connection o Command, e introduce nuevos objetos tales como el objeto DataReader, DataSet o DataView.

ADO .NET se puede definir como: • Un conjunto de interfaces, clases, estructuras y enumeraciones que permiten el acceso a datos

desde la plataforma .NET de Microsoft • La evolución lógica del API ADO tradicional de Microsoft • Permite un modo de acceso desconectado a los datos, los cuales pueden provenir de múltiples

fuentes de datos, de diferente arquitectura de almacenamiento

Programación con Visual Basic .NET © Grupo EIDOS

• Soporta un completo modelo de programación y adaptación, basado en el estándar XML Seguidamente vamos a realizar una descripción genérica de la arquitectura de ADO .NET, y más tarde

veremos como utilizarlo desde aplicaciones VB.NET