De XLS a MDB

Desde la aparición de VB.NET y a pesar de las grandes prestaciones SQL Express frente al extinto MSDE, una de las inquietudes que en más ocasiones he visto solicitadas por los desarrolladores, ha sido la portabilidad y la manejabilidad de formatos MDB, XLS, TXT, como moneda de cambio entre aplicaciones, a pesar de todo, supongo que continuamos dependiendo de los antiguos compañeros de viaje.

Son muchas las ocasiones en que se pregunta cómo convertir el contenido de un ‘DataGridBView’ a una Base de datos Access o transportar el contenido de una tabla a un Excel. Creo que este ejercicio puede ser útil como punto de entradilla a ese tipo de aplicaciones “Atípicas” J.  Así que finalmente me he decidido por investigar un poquito para poder llegar a ciertas conclusiones y limitaciones del trabajo con MDB’s usando VB 9. Aquí os dejo una muestra de los resultados, ya sabéis que no es habitual en mí, pero no he tenido tiempo de comentar el código y ponerlo bonito, a pesar de ello a todos los que tengáis un especial interés, os animo a contactar, para poder enviaros el proyecto de pruebas.

Veamos entonces como procesar una hoja de cálculo de Excel para crear un nuevo catalogo en una BD, diseñando la tabla a partir de las columnas del ‘DGV’ y rellenándola con el contenido de celdas.

Evidentemente el punto de partida será esta bonita hoja:

Un Simple XLS

 el segundo paso … Nuestro POgrama pa leer lescel!

    Private Sub LeerXls()
        ‘Abrir y llenar el DGV con la hoja de excel
        MiXlsConexion = New OleDbConnection _
        (“Provider=Microsoft.Jet.OLEDB.4.0;” + _
         “Extended Properties = ‘Excel 8.0’;” + _
         “Data Source=|DataDirectory|\libro1.xls;”)
        MiXlsAdaptador = New OleDbDataAdapter(“SELECT * FROM [Hoja1$]”, MiXlsConexion)
        MiXlsConexion.Open()
        MiXlsAdaptador.Fill(MiXlsDataSet)
        MiXlsDGV.DataSource = MiXlsDataSet.Tables(0)
    End Sub

Nuestra Aplicacion

Al pulsar sobre “Generar Archivo” obtendremos …



‘ crear estructura de la tabla en funcion a columnas de la hoja
Dim Campos As String = “Create Table [“ + NombreDe_MiTabla + “] (“
For Each col As DataGridViewTextBoxColumn In MiXlsDGV.Columns
     If Campos.EndsWith(“)”) Then Campos += “, “
     Campos += “[“ + Regex.Replace(col.DataPropertyName, ” “, “_”) + “] Text(50)”
Next
Campos += “)”
Dim MiMandato As New OleDbCommand(Campos, MiMDBConexion)
MiMandato.ExecuteNonQuery()




Dim Registro As DataRow
‘Añadir las filas del DGV a la tabla del DataSet
For Each row As DataGridViewRow In MiXlsDGV.Rows
    If row.Index < MiXlsDGV.RowCount – 1 Then
        Registro = MiMdbDataSet.Tables(0).NewRow
        For Each col As DataGridViewColumn In MiXlsDGV.Columns
            ‘Añadir una entrada por celda
             Registro(col.Index) = row.Cells(col.Index).Value
        Next
        ‘Añadir una linea por fila
        MiMdbDataSet.Tables(0).Rows.Add(Registro)
    End If
Next
MiMdbAdaptador.Update(MiMdbDataSet)

 

Hecho!

Sin trampa ni carton, en la carpeta de la aplicacion veremos aparecer un misterisoso Bd1.Mdb

La Prueba

Los Mas desconfiados podeis hacer clic … e volila!

El Resultado

Saludos,
Pep Lluis,

 

De Excel a Texto pasando por un DataGridView


” Crear un archivo de texto con el contenido
” de las celdas de un DataGridView de los
” datos cargados de una hoja de excel.


Hoja



Imports System.Data.OleDb

Public Class Form1
    ‘Definir conexion,adaptador y Dataset
    Private MiConexion As New OleDbConnection _
    (“Provider=Microsoft.Jet.OLEDB.4.0;” + _
     “Extended Properties = ‘Excel 8.0’;” + _
     “Data Source=|DataDirectory|\libro1.xls;”)
    Private MiAdaptador As New OleDbDataAdapter(“SELECT * FROM [Hoja1$]”, MiConexion)
    Private MiDataSet As New DataSet()

    Private Sub Form1_Load() Handles MyBase.Load
        ‘Abrir y llenar el DGV con la hoja de excel
        MiConexion.Open()
        MiAdaptador.Fill(MiDataSet)
        Me.DataGridView1.DataSource = MiDataSet.Tables(0)
        ‘Crear un documento de texto
        Dim ATexto = IO.File.CreateText(“MiExport.txt”)
        For Each row As DataGridViewRow In Me.DataGridView1.Rows
            For Each col As DataGridViewColumn In Me.DataGridView1.Columns
                ‘Añadir una entrada por celda
                ATexto.Write(row.Cells(col.Index).Value)
                ‘separar con un tabulador
                ATexto.Write(Chr(Keys.Tab))
            Next
            ‘Añadir una linea por fila
            ATexto.WriteLine()
        Next
        ATexto.Close()
    End Sub

End Class

Bloc
🙂
 

Como saber las unidades logicas que corresponden a una conexion de Red

Atendiendo a la consulta de Cesar, os dejo un fragmento de código, explicando cómo enumerar las unidades que corresponden a conexiones de Red. De hecho es una variacion del anterior post ‘Enumerar las unidades logicas de nuestros discos’.

Sub
Main() Handles MyBase.Load
    ‘ Obtener todas las unidades logicas de mi equipo
    Dim MisUnidades = From Unidad In My.Computer.FileSystem.Drives _
      Select Unidad.Name
    ‘ Componer la informacion que visualizare de mis unidades
    ‘ que correspondan a conexiones de red.

    Dim InfoUnidad = From info In MisUnidades _
       Where My.Computer.FileSystem.GetDriveInfo(info).DriveType = IO.DriveType.Network _
       Select Unidad = My.Computer.FileSystem.GetDriveInfo(info).Name, _
       Tipo = My.Computer.FileSystem.GetDriveInfo(info).DriveType

    Dim miVista As New DataGridView
    miVista.Dock = DockStyle.Fill
    Me.Controls.Add(miVista)
    miVista.DataSource = InfoUnidad.ToList
End Sub

Este es el resultado
UnidadesDeRed

Saludos,
Pep Lluis,

Totalizar una Columna en un DataGridView

Siguiendo la consulta de Jesús Pérez, preguntando como totalizar la suma de una columna de un DataGridView, poniendo como ejemplo recorrer las filas de una columna y efectuar las operaciones que consideremos oportunas.

Aquí tenéis el enlace para resolverlo según MSDN:
http://msdn.microsoft.com/es-es/library/system.data.datatable.compute.aspx

' Computar la suma de la columna 'Capital'
Dim total As Object = dt.Compute("SUM(Capital)", Nothing)
' visualizar el resultado en la barra
Me.Text = total.ToString

Si por el contrario optamos por hacerlo recorriendo las filas de la Columna… (tal i como me habéis solicitado) el código seria algo similar al siguiente :

... Load()
'Disparar el calculo cada vez que editamos 
AddHandler Me.dataGridView1.CellEndEdit, AddressOf Sumar
'Calcular totalizando la columna 3 "Salario"
Me.dataGridView1.Columns(3).HeaderText = "Sueldo"
Me.dataGridView1.AllowUserToAddRows = False
Me.dataGridView1.CurrentCell = dataGridView1.Rows(0).Cells(3)
Sumar()
... End Sub
'
' Sumar las cantidades de una columna
'
Private Columna As Integer = 3
Sub Sumar()
    Dim Total As Integer = 0      
    'Acumular el total
    Dim UltimaFila As Integer = Me.dataGridView1.Rows.Count
    'Solo calculamos si modificamos la columna
    If Me.dataGridView1.CurrentCell.ColumnIndex = Columna Then
        For Each row As DataGridViewRow In Me.dataGridView1.Rows
            If row.Index < UltimaFila - 1 Then Total += row.Cells(Columna).Value
        Next
        Me.dataGridView1.Rows(UltimaFila - 1).Cells(3).Value = Total.ToString
    End If
End Sub

Pd. No dudeis en pedirme el proyecto completo si estais interesados, o si quereis comentar alguna parte del codigo.

 

Dos Tablas y sus relaciones en un DataGridView a traves de un ‘ComboBoxColumn’

Ejemplo de cómo añadir una columna de selección unida a una tabla de ‘maestros’ y relacionada con su identificador en la tabla ‘detalles’, en casos reales solo teneis que substituir las tablas por los ‘sources’ de las tablas en vuestra BD.
Me gustara recibir vuestros comentarios… 😉


Combo3
 


Imports System
Imports System.Data

Public Class Form1
    Private dataGridView1 As New DataGridView()


    Private Sub Form1_Load() Handles Me.Load
       
        ‘ Simular tabla con los Detalles
       
        Dim Detalles As New DataTable(“Detalle”)
        Detalles.Columns.Add(“Actividad”)
        Detalles.Columns.Add(“Nombre”)
        Detalles.Columns.Add(“Telefono”)
        Detalles.Rows.Add(“001”, “Pep Lluis”, “231.321.321”)
        Detalles.Rows.Add(“002”, “Luis Franco”, “Internacional”)
        Detalles.Rows.Add(“003”, “Marc Rubiño”, “111.222.333”)
        Detalles.Rows.Add(“004”, “Javier Conesa”, “91.244.32.32”)
       
        ‘ Simular tabla con los Id’s Maestros
       
        Dim Maestros As New DataTable(“Maestro”)
        Maestros.Columns.Add(“Actividad”)
        Maestros.Columns.Add(“Descripcion”)
        Maestros.Rows.Add(“001”, “POgramaor”)
        Maestros.Rows.Add(“002”, “Torero”)
        Maestros.Rows.Add(“003”, “Banderillero”)
        Maestros.Rows.Add(“004”, “ANALista”)

       
        ‘ Construir el DS y establecer relaciones
       
        Dim MiDataSet As New DataSet
        MiDataSet.Tables.Add(Detalles)
        MiDataSet.Tables.Add(Maestros)
        MiDataSet.Relations.Add(“Actividad”, _
              MiDataSet.Tables(“Maestro”).Columns(“Actividad”),_
              MiDataSet.Tables(“Detalle”).Columns(“Actividad”))
        
        ‘ Añadir una columna ‘ComboBox’
        ‘ Conteniendo la tabla ‘Maestro’
       
        Dim MiBoxColumn As New DataGridViewComboBoxColumn
        MiBoxColumn.DisplayMember = “Descripcion”
        MiBoxColumn.ValueMember = “Actividad”
        MiBoxColumn.DataPropertyName = “Actividad”
        MiBoxColumn.DataSource = MiDataSet.Tables(“Maestro”)
        Me.dataGridView1.Columns.Add(MiBoxColumn)
       
        ‘ Visualizar el DGV con la columna combo ‘Maestro’
        ‘ y las columnas y tablas de ‘Detalle’
       
        Me.dataGridView1.Dock = DockStyle.Fill
        Me.Controls.Add(dataGridView1)
        Me.dataGridView1.DataSource = MiDataSet.Tables(“Detalle”)

   End Sub
End Class


Si os interesa en determinadas situaciones podeis “camuflar” el combo para que tenga un aspecto como este :



Combo4


De esta forma no podran modificar ni desplegar las opciones y su aspecto sera como el de cualquier otra columna.
Ajustando las propiedades :


        MiBoxColumn.DisplayStyle = DataGridViewComboBoxDisplayStyle.Nothing
        MiBoxColumn.ReadOnly = True


Saludos,
Pep Lluis,


PD. Agradecemos la participacion de los actores secundarios (Javier, Luis i Marc), aunque tengo mis dudas sobre si son personajes reales o ficticios 😉

Enumerar las unidades logicas de nuestros discos


‘ En respuesta a la pregunta de como enumerar las unidades
‘ Logicas de nuestros discos desde el prompt de DOS, os
‘ dejo este ejemplo utilizando el espacio de nombres
‘ My.Computer.Filesystem, en Vb9 y Linq


‘ Una vez compilado el proyecto, puede incluirse
‘ en el archivo de proceso o ‘Batch’ segun necesidad. 



‘ Listar las unidades logicas del Equipo

Module Module1  
  Sub Main()
      ‘ Obtener todas las unidades logicas de mi equipo
      Dim MisUnidades = From Unidad In My.Computer.FileSystem.Drives _
         Select Unidad.Name
      ‘ Componer la informacion que visualizare de mis unidades
      Dim InfoUnidad = From info In MisUnidades _
         Select Unidad = My.Computer.FileSystem.GetDriveInfo(info).Name,
          Volumen = My.Computer.FileSystem.GetDriveInfo(info).VolumeLabel(), _
          Tipo = My.Computer.FileSystem.GetDriveInfo(info).DriveType, _
          Espacio = My.Computer.FileSystem.GetDriveInfo(info).AvailableFreeSpace
      Try
          For Each Info In InfoUnidad
              ‘listar la informacion obtenida
              Console.WriteLine(Info)
          Next
      Catch ex As Exception
         ‘despreciar la informacion de las unidades que no estan a punto
      End Try
      ‘ esperar a que se pulse return
      Console.ReadLine()

  End Sub
End Module

Agregar una conexion de red


” Ejemplo de utilizacion de WNetConnection
” Correspondiente al ejemplo de : http://support.microsoft.com/kb/173011/es
” Adaptado a VB9/Vista  y complementando la respuesta del post
” http://forums.microsoft.com/MSDN-ES/ShowPost.aspx?PostID=3423382&SiteID=11

” En este ejemplo las variables lpLocalName lpRemoteName se asignan desde
” el codigo, para asignarlos dinamicamente podeis usar un listbox & textbox.

” Si os conectais a un recurso de servidor con un Usuario / Clave distinto
” distinto del utilizado para iniciar la session, debereis reasignar
” las variables ‘Usuario’ y ‘Clave’.


Public Class Form1
    Private MiRdR As New RecursoDeRed
   
    ‘ Conectar un recurso de RED
       
    Private Sub Conectar()
        ‘Definir el tipo de conexión
        ‘Segun documentacion del API
        MiRdR.dwScope = Recurso.CONNECTED
        MiRdR.dwType = Recurso_Tipo.DISK
        MiRdR.dwDisplayType = Recurso_TipoVista.SHARE
        MiRdR.dwUsage = Recurso_TipoUso.CONNECTABLE

        ‘Definir letra de unidad y nombre del recurso
        MiRdR.lpLocalName = “Z:”
        MiRdR.lpRemoteName = “\\servidor\recurso
        MiRdR.lpComment = “** Mi Nueva Conexion**”
        MiRdR.lpProvider = “”

        ‘Si las credenciales son diferentes a las actuales
        ‘Sustituir por las adecuadas
        Dim Usuario = vbNullString  ‘Nombre de usuario
        Dim Clave = vbNullString    ‘Clave de acceso

        ‘Llamar a la funcion AñadirUnidad para WNetAddConnection2A
        ‘CONNECT_UPDATE_PROFILE = &H1
        MessageBox.Show( _
             CodigoError( _
              AñadirUnidad(MiRdR, Clave, Usuario, &H1)), _
              “Conectando…” + MiRdR.lpLocalName + ” a “ + MiRdR.lpRemoteName)
    End Sub
   
    ‘ Desconectar un recurso de red
   
    Private Sub Desconectar()
        MiRdR.lpLocalName = “Z:”
        ‘CONNECT_UPDATE_PROFILE = &H1
        If QuitarUnidad(MiRdR.lpLocalName, &H1, False) = 0 Then
            MessageBox.Show(“La unidad ha sido desconectada.”, _
             “Desconectando…” + MiRdR.lpLocalName)
        Else
            MessageBox.Show(“Fallo en la desconexion del dispositivo”, _ 
             “ERROR! Desconectando…”)
        End If
    End Sub
   
    ‘ Añadir los botones de Conectar/Desconectar
   
    Private Sub Form1_Load() Handles Me.Load
        Me.Text = “Conectar unidades de Red”
        Dim BotonDeConectar As New Button
        BotonDeConectar.Text = “Conectar”
        BotonDeConectar.Dock = DockStyle.Bottom
        AddHandler BotonDeConectar.Click, AddressOf Conectar
        Dim BotonDeCancelar As New Button
        BotonDeCancelar.Text = “Desconectar”
        BotonDeCancelar.Dock = DockStyle.Bottom
        AddHandler BotonDeCancelar.Click, AddressOf Desconectar

        Me.Controls.AddRange(New Control() {BotonDeConectar, BotonDeCancelar})
    End Sub
End Class


‘ Definicion y Referencias a la libreria mrp.dll
‘ para llamar a las funciones de WNetConnection, Add y Cancel


Module WNet
    Declare Function AñadirUnidad Lib “mpr.dll” Alias “WNetAddConnection2A” (ByRef lpRecursoDeRed As RecursoDeRed, ByVal lpPassword As String, ByVal lpUserName As String, ByVal dwFlags As Long) As Integer
    Declare Function QuitarUnidad Lib “mpr.dll” Alias “WNetCancelConnection2A” (ByVal lpName As String, ByVal dwFlags As Long, ByVal fForce As Long) As Integer
   
    ‘ Estructura para llamar a la funcion de añadir
   
    Structure RecursoDeRed
        Public dwScope As Integer
        Public dwType As Integer
        Public dwDisplayType As Integer
        Public dwUsage As Integer
        Public lpLocalName As String
        Public lpRemoteName As String
        Public lpComment As String
        Public lpProvider As String
    End Structure
   
    ‘ Definir el recurso
   
    Enum Recurso
        CONNECTED = &H1
        REMEMBERED = &H3
        GLOBALNET = &H2
    End Enum
   
    ‘ Definir el tipo
   
    Enum Recurso_Tipo
        DISK = &H1
        PRINT = &H2
        ANY = &H0
    End Enum
   
    ‘ Definir la vista
   
    Enum Recurso_TipoVista
        DOMAIN = &H1
        GENERIC = &H0
        SERVER = &H2
        SHARE = &H3
    End Enum
   
    ‘ Definir el uso
   
    Enum Recurso_TipoUso
        CONNECTABLE = &H1
        CONTAINER = &H2
    End Enum
   
    ‘ Asignar codigos de retorno errores
   
    Function CodigoError(ByVal Codigo As Integer) As String
        Select Case Codigo
            Case 0 : Return “La unidad se agrego correctamente.”
           
Case 5 : Return “Acceso denegado!”
            Case 66 : Return “El tipo de dispositivo, no es correcto.”
            Case 67 : Return “El nombre de red, no es correcto.”
            Case 85 : Return “La unidad ya esta asignada!”
            Case 86 : Return “La clave de acceso no es valida!”
            Case 170 : Return “Ocupado!”
            Case 1200 : Return “Dispositivo Incorrecto.”
            Case 1202 : Return “El dispositivo se encuentra registrado”
            Case 1203 : Return “Sin red o ruta incorrecta!”
            Case 1204 : Return “El suministrador es Incorrecto.”
            Case 1205 : Return “No se puede abrir el perfil”
            Case 1206 : Return “El perfil es Incorrecto.”
           
Case 1208 : Return “Error extendido”
            Case 1223 : Return “Cancelado!”
            Case Else
                Return “ERROR, Codigo desconocido:” + Codigo.ToString
        End Select
    End Function

End Module

Un clasico caso de herencias entre padres e hijos

Aunque como siempre empezaremos diciendo que este ejemplo responde a las inquietudes de algunas consultas recibidas sobre MDI y de nuevo intentando darle un aire desenfadado, os dejo esta idea para clarificar… o liaros mas en el concepto de heredar.


Espero vuestros comentarios… eso si, que sean amables y con cariño.
Pep Lluis,


‘ Un clasico caso de Herencias…

Public Class ElPadre   
” 
   
” Construir el entorno en tiempo de carga
       
Private Sub ElPadre_Load() Handles MyBase.Load
       
‘ Me declaro contenedor de toda mi descendencia
        Me.IsMdiContainer = True
        Me.Text = “Soy el Progenitor, Padre de algunos y Abuelo de otros”
        ‘ Mi primer Hijo tendra un boton para crear mas hijos
        Dim CrearFormHijo As New Button
        CrearFormHijo.Text = “Tener un hijo”
        CrearFormHijo.Dock = DockStyle.Top
        Me.Controls.Add(CrearFormHijo)
        ‘ Invocar la funcion de Crear, al hacer click
        AddHandler CrearFormHijo.Click, AddressOf Crear   
End Sub
   
    ” Crear y Definir el Aspecto de los Hijos del Padre y sus Nietos
   
    Private Sub Crear()
       
        ‘Definir la primera linea de descendencia
        Dim FormHijo As New MiForm(Me)
        FormHijo.Text = “Yo Soy el Hijo – Descendencia directa”
        ‘Presentar al nieto en sociedad
        FormHijo.Show()
       
        ‘Definir la segunda linea tomando la primera
        ‘como referencia y añadiendo nuevas particularidades
        Dim FormNieto As New MiForm(Me)
        FormNieto.Text = “Yo Soy el Nieto”
       
        ‘Los nietos tienen dos botones… peazo xoyo!
        Dim BotonDelNieto As New Button
        BotonDelNieto.Name = “BotonDelNieto”
        BotonDelNieto.Text = “Abuelo! Que hora es?”
        BotonDelNieto.Dock = DockStyle.Bottom
        FormNieto.Controls.Add(BotonDelNieto)
       
        ‘Llamar al Abuelo al pulsar el boton de todos los descendientes
        AddHandler BotonDelNieto.Click, AddressOf FormHijo.llamarAPapa
       
        ‘Llamar al verdadero padre, sobre el boton particular de los nietos
        AddHandler FormNieto.Controls.Item(0).Click, AddressOf FormNieto.YoSoyElVerdaderoPadre
        ‘Presentar al nieto en sociedad
        FormNieto.Show()
    End Sub
   
    ‘ solo mis hijos y nietos saben la hora
   
    Public Function MensajeDePapa() As String
        Return “Son las “ + System.DateTime.Now
    End Function End Class


” Origen “genetico” de todos mis form’s

Public Class MiForm
    ‘ A su vez heredo todas las particularidades de WinForms
    Inherits Form    ‘ La referencia a mi antepasado
    Private MiPadre As Object
   
    ‘ Nacimiento!
   
    Sub New(ByVal padre As Object)
        ‘ Referenciar y no olvidar mis origenes
        MiPadre = padre
        MdiParent = MiPadre
       
        ‘ Mi descendencia heredara un boton mas que yo.
        
        Dim BotonDelHijo As New Button
        BotonDelHijo.Name = “BotonDelHijo”
        BotonDelHijo.Text = “Papa!… que hora es?”
        BotonDelHijo.Dock = DockStyle.Top
        Controls.Add(BotonDelHijo)
        ‘ Llamar a mi papa por click en boton del hijo
        AddHandler BotonDelHijo.Click, AddressOf llamarAPapa
    End Sub
   
    ‘ LLamar a papa
   
    Sub llamarAPapa()
        MessageBox.Show(MiPadre.mensajeDePapa, “Ummm…”)
    End Sub
   
    ‘ Llamar a mis antecesores… eres tu abuelo?
   
    Sub YoSoyElVerdaderoPadre()
        MessageBox.Show(” Yo soy tu verdadero padre!!”, “Aunque te respondio Mi padre”)
    End Sub 

End Class


 

Delegados?

A menudo preguntamos sobre que son y para que sirven los delegados… valga esta entradrilla :-))

‘Según definición…
‘ Un delegado es un tipo que referencia un método compartido
‘ de un método tipo o una instancia de un objeto
‘ Cualquier procedimiento puede ser utilizado para crear una clase delegada
‘ de la instancia y posteriormente ser invocada a través del delegado
‘ … ea una especie de punteros…

 


‘Aunque el siguiente ejemplo no ilustre todos los usos 
espero sirva de punto de partida para los que empiezan.


‘No olvideis que el delegado puede contener y devolver parámetros…


‘pero eso es trabajo del artista.
 


 Delegate Function MiDelegado()

 Public Class Form1
    Private Encendido As Boolean = False

    Private Sub Form1_Load() Handles MyBase.Load
        ‘construir botón
        Dim MiBoton As New Button
        MiBoton.Text = “Asignar Delegado”
        MiBoton.AutoSize = True
        MiBoton.Dock = DockStyle.Bottom
        ‘al hacer click ejecutar sub
        AddHandler MiBoton.Click, AddressOf EncenderApagar
        ‘añadir botón al form
        Me.Controls.Add(MiBoton)
    End Sub

 
   Private Sub EncenderApagar()
        ‘Crear mi referencia al tipo delegado
        Dim MiRefencia As MiDelegado
        ‘Encender si está apagado / apagar si encendido
        If Not Encendido Then
            ‘asignar referencia a la función de encender
            MiRefencia = AddressOf Encender
        Else
            ‘asignar referencia a la función de apagar
            MiRefencia = AddressOf Apagar
        End If
        ‘Invocar la función en mi delegado
        MessageBox.Show(MiRefencia.Invoke)
    End Sub
   
    ‘Devolver el estado de encendido
    Private Function Encender() As String
        Encendido = True
        Return “Encendido”
    End Function
   
    ‘Devolver el estado de apagado
    Private Function Apagar() As String
        Encendido = False
        Return “Apagado”
    End Function
 End Class

Saludos,
Pep Lluis,

Ya me estas tardando mucho!… pero cuanto es mucho?


En algunas ocasiones puede interesarnos cronometrar el tiempo de determinadas operaciones. Aunque bien entendido que puede hacerse de diversas formas y a determinar la cual mas precisa, os dejo una idea como siempre muy simple de averiguar cuando nos esta tardando cierta operación, ya sea dentro de un bucle, en petición a un procedimiento externo, en una consulta a SQL o cualquier otra transacción.


‘ Simplificado y en VB9

‘Bucles para test del tiempo en ejecucion
Dim Bucles = Val(InputBox(“Numero de iteraciones”))
‘Poner en marcha el cronometro
Dim CronoIncial = System.DateTime.Now
‘Tarea a cronometrar
Dim numero = 0       ‘Variable para la simulacion

For x = 0 To Bucles
     numero += 1
     Text = numero.ToString
     Refresh()
 Next
‘para saber el tiempo empleado! .. restamos
MessageBox.Show(“Tiempo empleado : “ + _
               (System.DateTime.Now – CronoIncial).ToString + _

                ” s.”, “Cronometro”)


…………..


‘ En VB8 Podria lucir como sigue



        ‘Variable simulacion de calculos
        Dim numero As Integer = 0
        ‘Bucles para test del tiempo en ejecucion
        Dim Bucles As Integer = Val(InputBox(“Numero de iteraciones”))
        ‘Poner en marcha el cronometro
        Dim CronoIncial As DateTime = System.DateTime.Now
        ‘Tarea a cronometrar
        For x As Integer = 0 To Bucles
            numero += 1
            Label1.Text = numero.ToString
            Label1.Refresh()
        Next
        ‘Tomar el tiempo del cronometro al finalizar
        Dim CronoFinal As DateTime = System.DateTime.Now
        ‘Restar Fin de Inicio para saber el tiempo empleado!

        MessageBox.Show(“Tiempo empleado : “ + (CronoFinal – CronoIncial).ToString + ” s.”, “Cronometro”


Saludos,
Pep Lluis,