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