Colaboraciones en el Guille

Creando un Explorador de Windows

Uso de Clases para crear Componentes

Fecha: 20/Oct/2005 (19 de Octubre de 2005)
Autor: Ing. Fernando Luque Sánchez  
DCE 2003 - 4 Estrellas
DCE 2005 - 2 Estrellas

fls2307@hotmail.com


Sres. Desarrolladores, este aporte pretende ayudar a ustedes a crear una pequeña aplicación simulando el Explorador de Windows, en este primer envío, solamente está implementada la funcionalidad para ver los archivos y carpetas.

Este ejemplo incluye el uso de Clases para su ejecución, si bien es cierto muchos opinan que resulta mas fácil directamente, envío primero este, donde desde código se implementa hasta la interface.

Un poco de teoría

El NameSpace System.IO
Este NameSpace contiene todos los tipos que permiten leer y escribir en los archivos y secuencia de datos, así como tipos que proporcionan compatibilidad básica con los archivos y directorios.

Algunas Clases de System.IO

Clase Descripción
Directory Expone métodos estáticos para crear, mover y enumerar archivos en directorios y subdirectorios
DirectoryInfo Expone métodos de instancia para crear, mover y enumerar archivos en directorios y subdirectorios.
File

Proporciona métodos estáticos para crear, copiar, eliminar, mover y abrir archivos y contribuye a la creación de objetos FileStream.
Utilice la clase FileStream para leer, escribir, abrir y cerrar archivos en un sistema de archivos, así como para manipular otros identificadores del sistema operativo relacionados con archivos, como canalizaciones, entrada estándar y salida estándar amd. Puede especificar que las operaciones de lectura y escritura sean sincrónicas o asincrónicas. FileStream almacena en el búfer la entrada y la salida para obtener un mejor rendimiento.

FileInfo Proporciona métodos de instancia para crear, copiar, eliminar, mover y abrir archivos y contribuye a la creación de objetos FileStream.
FileStream

Expone un objeto Stream alrededor de un archivo; se admiten operaciones de lectura y escritura sincrónica y asincrónica. Un objeto Stream proporciona una vista genérica de una secuencia de bytes.

Path

Ejecuta operaciones en instancias de String que contienen información de rutas de archivos o directorios. Estas operaciones se ejecutan de forma adecuada para múltiples plataformas.

Las Clases de Componentes

Una clase es una unidad de código reutilizable. También lo es un componente. Para crear un componente, se empieza con una clase. Una clase se convierte en un componente cuando se ajusta a un estándar para la interacción con componentes. Este estándar se proporciona a través de la interfaz IComponent. Cualquier clase que implemente la interfaz IComponent es un componente. Tales estándares permiten que los programadores conecten rápidamente componentes entre sí para crear programas mayores. Common Language Specification (CLS) describe el modo en que pueden interactuar los componentes creados para Common Language Runtime.

.NET Framework proporciona la interfaz IComponent y la clase base Component para facilitar la creación de componentes que funcionen bien en el entorno de diseño y las clases UserControl y Control, que facilitan la creación de componentes visuales.

Inicializar y finalizar un componente

Un componente se inicializa por medio de su constructor (Sub New en Visual Basic) y se destruye por medio de su destructor (Sub Finalize en Visual Basic). Se llama al constructor del componente cuando se crea una instancia de éste; después, no es posible llamar al constructor. La llamada al destructor se realiza inmediatamente antes de destruirlo mediante la recolección de elementos no utilizados y la reclamación de la memoria que ocupa.

Para nuestro ejemplo hemos creado las clases de componentes cpDirectorio, cpArchivos y cpMenu, el constructor de la clase de componente para cpDirectorios es:

Public Sub New()
        'Cargar las imagenes en la Propiedad ImageList del TreeView

        Me.ImageList = New ImageList
        With Me.ImageList.Images
            .Add(New Bitmap("..\Imagenes\35FLOPPY.BMP"))  'Disco 3½
            .Add(New Bitmap("..\Imagenes\CLSDFOLD.BMP"))  'Folder
            .Add(New Bitmap("..\Imagenes\OPENFOLD.BMP"))  'Folder seleccionado
        End With

        ' Construir el arbol
        ConstruirArbol()
End Sub

En esta clase especificamos una lista de imágenes y agregamos 03 imágenes para mostrar en el TreeView. (Ver mas adelante el ejemplo).  Se ejecuta el procedimiento ConstruirArbol()

'Crea el árbol
    Public Sub ConstruirArbol()
        BeginUpdate()
        Nodes.Clear()

        ' Drives como principales
        Dim astrDrives As String() = Directory.GetLogicalDrives()
        Dim strDrive As String
        For Each strDrive In astrDrives
            Dim tnDrive As New TreeNode(strDrive, 0, 0)
            Nodes.Add(tnDrive)
            AgregarDir(tnDrive)
            ' Drive C por defecto
            If strDrive = "C:\" Then
                Me.SelectedNode = tnDrive
            End If
        Next
        EndUpdate()
    End Sub

La finalización de un componente

Si el componente hereda de System.ComponentModel.Component, se proporciona una implementación predeterminada de Dispose. Esta implementación puede reemplazarse para proporcionar código de limpieza personalizado. Si genera un componente mediante la creación de una implementación personalizada de IComponent, es recomendable que implemente IDisposable para proporcionar al componente un método Dispose.

El componente necesitará un método Dispose si asigna objetos del sistema, conexiones de base de datos u otros recursos escasos que deban liberarse tan pronto como el usuario termine con el componente.

También debe implementarse un método Dispose si el componente contiene referencias a otros objetos que tengan métodos Dispose .

El Ejemplo

El formulario en tiempo de ejecución tiene el siguiente aspecto

Explorador de Windows

 

A continuación sigue código en Visual Basic:

Para poder utilizar el componente debemos usar la instrucción Imports:

'Importar el componente creado
Imports VBExplorador.cpDirectorios

Constructor del Formulario:

Public Sub New()
        MyBase.New()  

        'El Diseñador de Windows Forms requiere esta llamada.
        InitializeComponent()  
        'Agregar cualquier inicialización después de la llamada a InitializeComponent()
        ' Instancia del ListView para archivos
        lvArchivos = New cpArchivos
        lvArchivos.Parent = Me
        lvArchivos.Dock = DockStyle.Fill

        ' El Splitter 
        Dim split As New Splitter
        split.Parent = Me
        split.Dock = DockStyle.Left
        split.BackColor = SystemColors.Control

        ' El TreeView y su Evento
        tvCarpetas = New cpDirectorios
        tvCarpetas.Parent = Me
        tvCarpetas.Dock = DockStyle.Left
        'Evento
        AddHandler tvCarpetas.AfterSelect, AddressOf SeleccionDirectorio

        ' Menu Ver
        Dim mnuView As New MenuItem("& Vista")
        mnuView.Index = 1
        Me.mnPrincipal.MenuItems.Add(mnuView)

          'Array con las opciones del menú vista
        Dim astrView As String() = {"Iconos Grandes", "Iconos Pequeños", "Lista", "Detalles"}
        Dim aview As View() = {View.LargeIcon, View.SmallIcon, View.List, View.Details}
        ' Manejadores
        Dim manejador As New EventHandler(AddressOf VistaMenu)  

        Dim i As Integer
        For i = 0 To 3
            'Clase cpMenu
            Dim miv As New cpMenu
            miv.Text = astrView(i)
            miv.View = aview(i)
            miv.RadioCheck = True
            'el manejador
            AddHandler miv.Click, manejador

           'Por defecto Detalle
            If i = 3 Then
                mivChecked = miv
                mivChecked.Checked = True
                lvArchivos.View = mivChecked.View
            End If
            ' Agregar
            mnuView.MenuItems.Add(miv)
        Next i
End Sub

Noten que en el constructor se han definido los objetos a utilizar, un TreeView, un control Splitter y un ListView.

Acerca de estos controles pueden ver los artículos:

ListView
http://www.elguille.info/colabora/NET2005/FernandoLuque_Control_ListView.htm
http://www.elguille.info/colabora/NET2005/FernandoLuque_Control_ListViewII.htm
http://www.elguille.info/colabora/NET2005/FernandoLuque_ListViewAvanzado.htm
http://www.elguille.info/colabora/NET2005/FernandoLuque_ListViewBD.htm
TreeView
http://www.elguille.info/colabora/NET2005/FernandoLuque_TreViewBDatos.htm

En una segunda publicación enviaré como crear esta pequeña aplicación sin Clases de componentes, estén atentos

El código completo se encuentra en el archivo adjunto al final del artículo, antes de bajarlo espero que votes por este aporte para alentarme a seguir publicando.

Suerte a todos y A SEGUIR DESARROLLANDO

Ing. Fernando Luque Sánchez
De Trujillo - Perú para el mundo entero


Espacios de nombres usados en el código de este artículo:

System.IO
System.Diagnostics.


Fichero con el código de ejemplo: FernandoLuque_Explorador01.zip - (11) KB


ir al índice principal del Guille