Los Trucos del Guille publicados en MSDN España

 

Lista de trucos publicados en MSDN España



Truco publicado con fecha 25/Jun/99

 

El objeto Dictionary

Si has usado las colecciones de Visual Basic, me imagino que habrás echado en falta algunas mejoras, por ejemplo un método que compruebe si un determinado elemento ya existe; para saberlo habrás tenido que recurrir al "truco" de volver a añadirlo y si se produce un error, significa que dicho elemento ya está en la colección. Pues, entre otras, esa es una característica soportada por el objeto Dictionary. Ese objeto forma parte del componente Microsoft Scripting Runtime , (el mismo en el que se incluye el File System Objects)

 

¿Cómo manejar el objeto Dictionary?

Todos los elementos incluidos en el objeto Dictionary, siempre van por pares: una clave y el elemento propiamente dicho.

Para acceder a cualquiera de esos elementos, "siempre" tendremos que usar la clave asociada, a diferencia de las colecciones, que nos permite acceder por el índice; es decir, siempre es necesario conocer la clave para acceder a cualquiera de los elementos contenidos en el diccionario. Pero esto no es un problema, ya que, en caso de que no sepamos cuales son esas claves, podemos acceder a todas ellas; para este fin, el objeto Dictionary tiene una propiedad que devuelve un array con todas las claves contenidas en el objeto:

Claves = m_Dic.Keys

Esto es útil si, por ejemplo, queremos tener en una lista todas las claves, (después veremos un ejemplo)

Además de las claves, el objeto Dictionary también nos permite asignar a un array todos los elementos contenidos que contiene, esto es posible mediante la propiedad Items:

Elementos = m_Dic.Items

 

Antes de ver un ejemplo completo, repasemos algunos de los métodos disponibles:

Para añadir elementos al objeto Dictionary usaremos, conmo es habitual en la mayoría de los objetos tipo colección, el método Add. Éste método tiene dos parámetros, no opcionales, que son la clave y el elemento a añadir al diccionario:

m_Dic.Add sClave, Elemento

La clave es una cadena de caracteres y el elemento puede ser cualquier cosa que "quepa" en un Variant, es decir, casi todo...

Para saber si un determinado elemento ys está, usaremos la porpiedad Exists, la cual devolverá Verdadero o Falso según el elemento comprobado esté o no incluido en el objeto Dictionary. Como parámetro, hay que indicarle la clave que queremos comprobar:

If m_Dic.Exists(sClave) Then

Para acceder a un elemento, usaremos el método Item:

x = m_Dic.Item(sClave)

No sólo podemos acceder a un elemento o comprobar si existe, también podemos borrarlo:

m_Dic.Remove sClave

incluso podemos borrar todos los elementos del diccionario:

m_Dic.RemoveAll

También podemos saber el número de elementos contenido en el diccionario, (esto es útil si hay algún alma despiadada que ha borrado todo el contenido... que haberlas hay-las...),

x = m_Dic.Count

La "gracia" del objeto Dictionary es que siempre se usan por pares: la clave y el elemento asociado a dicha clave, esto que puede parecer una limitación, realmente, al menos desde mi punto de vista, no lo es, ya que nos obliga a hacer, o al menos a intentarlo, las cosas bien...
Si, simplemente quieres tener objetos contenidos "sin ton ni son", usa un objeto Collection; pero si tu intención es tener datos relacionados, usa Dictionary.

 

Un ejemplo

Veamos un ejemplo para manejar este objeto.

Una cosa que hay que saber, es que los arrays creados con las propiedades Keys e Items siempre son en base cero, independientemente del valor indicado con Option Base, osea, que el índice menor de dicho array será cero y el mayor será el valor devuelto por Count menos 1.

Para probar este ejemplo, crea un nuevo proyecto, en el menú Proyecto/Referencias selecciona Microsoft Scripting Runtime (SCRRUN.DLL)
Añade al formulario un control ComboBox (Combo1), un TextBox (Text1), un botón (Command1) y una etiqueta (Label1).
Distribuye los controles a tu gusto.

El textbox se usará para indicar un elemento a buscar, al pulsar en el botón se comprobará si dicha clave existe y el acierto o fallo se mostrará con un MsgBox. En el combo estarán todas las claves.

Añade el siguiente código al formulario:

'
'------------------------------------------------------------------------------
' Tips05, trucos para MSDN España                                   (21/Jun/99)
'
' ©Guillermo 'guille' Som, 1999
'------------------------------------------------------------------------------
Option Explicit

' Para poder usar el objeto Dictionary hay que tener una referencia a:
' Microsoft Scripting Runtime (SCRRUN.DLL)
' o creando un objeto usando CreateObject("Scripting.Dictionary")
Private m_Dic As Dictionary


Private Sub Command1_Click()
    Dim sKey As String
    
    sKey = Text1
    
    ' Comprobar si la clave indicada existe
    If m_Dic.Exists(sKey) Then
        MsgBox "El elemento " & sKey & " es: " & m_Dic.Item(sKey)
    Else
        MsgBox "No existe el elemento " & sKey & " en el diccionario"
    End If
End Sub


Private Sub Form_Load()
    Dim i As Long
    Dim tClaves As Variant
    
    ' Crear un nuevo objeto del tipo Dictionary
    Set m_Dic = New Dictionary
    
    ' Crear los elementos de prueba
    For i = 1 To 100
        '         Clave     Elemento
        m_Dic.Add "C" & i, "Item número " & i
    Next
    
    ' Copiar las claves usadas en el diccionario
    ' Se crea un array con base CERO, independientemente del valor de Option Base,
    ' es decir desde 0 a m_Dic.Count - 1
    tClaves = m_Dic.Keys
    
    ' Pasar los datos al combo
    Combo1.Clear
    For i = 0 To m_Dic.Count - 1
        ' Añadir la clave al combo
        Combo1.AddItem tClaves(i)
    Next
    Combo1.ListIndex = 0
    
    Randomize
    ' Una clave de prueba
    Text1 = tClaves(Int(Rnd * 100) + 1)
    
End Sub


Private Sub Form_Unload(Cancel As Integer)
    ' Eliminamos los objetos al descargar el formulario
    Set m_Dic = Nothing
    Set Form1 = Nothing
End Sub

 


la Luna del Guille o... el Guille que está en la Luna... tanto monta...