| |  |  | Miembros: Mensajes: Temas: Online: Ultimo Miembro: | | |  | | |
 | 
29-01-2007, 11:15:10
| | Un Nuevo Amigo | | Registrado: nov 2006 Posts: 22
| | Claves en un objeto Collection Hola a todos,
quisiera salvar en un fichero un objeto de tipo Collection, pero no encuentro la forma de acceder al key de cada elemento.
¿Alguien sabe cómo se hace?
Muchas gracias y un saludo.
A. Luis Diez | 
29-01-2007, 11:34:12
|  | Usuario VIP del Foro | | Registrado: feb 2005 Ubicación: España Posts: 632
| | Hola,
Bueno yo no sé como tienes estructurado el código pero te muesto un ejemplo:
En una clase: Código: Option Explicit
Private mCol As Collection
Public Sub Add(Item As Variant, Optional sKey As String, Optional Before As Variant, Optional After As Variant)
Dim objNewMember() As Variant
ReDim objNewMember(0 To 1)
If IsObject(Item) Then
Set objNewMember(0) = Item
Else
objNewMember(0) = Item
End If
objNewMember(1) = sKey
If Len(sKey) = 0 Then
mCol.Add objNewMember, , Before, After
Else
mCol.Add objNewMember, sKey, Before, After
End If
End Sub
Public Property Get Item(vntIndexKey As Variant) As Variant
Dim vItem() As Variant
vItem = mCol(vntIndexKey)
If IsObject(vItem(0)) Then
Set Item = vItem(0)
Else
Item = vItem(0)
End If
End Property
Public Property Get ItemKEY(vntIndexKey As Variant) As String
ItemKEY = mCol(vntIndexKey)(1)
End Property
Public Property Get Count() As Long
Count = mCol.Count
End Property
Public Sub Remove(vntIndexKey As Variant)
mCol.Remove vntIndexKey
End Sub
Public Property Get NewEnum() As IUnknown
Set NewEnum = mCol.[_NewEnum]
End Property
Private Sub Class_Initialize()
Set mCol = New Collection
End Sub
Private Sub Class_Terminate()
Set mCol = Nothing
End Sub En un formulario: Código: Option Explicit
Private Sub Form_Load()
Dim ClsKey As New CollectionKEY, Itm As Variant
Dim K As Long
ClsKey.Add "probando... 1", "KEY1"
ClsKey.Add "probando... 2", "KEY2"
ClsKey.Add "probando... 3", "KEY3"
ClsKey.Add "probando... 4", "KEY4", "KEY1"
ClsKey.Add "probando... 5", "KEY5", , "KEY2"
For K = 1 To ClsKey.Count
Debug.Print ClsKey.Item(K), ClsKey.ItemKEY(K)
Next K
Debug.Print
For Each Itm In ClsKey
Debug.Print Itm(0), Itm(1)
Next Itm
End Sub Un saludo :-) | 
29-01-2007, 12:31:44
| | Un Nuevo Amigo | | Registrado: nov 2006 Posts: 22
| | Por lo que he entendido, con este método tuyo:
Public Property Get ItemKEY(vntIndexKey As Variant) As String
ItemKEY = mCol(vntIndexKey)(1)
End Property
accedes a la clave de cada elemento.
Yo lo tengo que poner en un bucve que recorre la colección entera, el problema es que los datos almacenados en la colección son arrays de String y me da problemas con los índices....
Éste es mi código:
For I = 0 To parcelas.Count - 1
MsgBox "Parcela " & parcelas.Item(I)(0)(1)
Next I | 
29-01-2007, 20:13:04
| | Moderador | | Registrado: dic 2002 Ubicación: Madrid Posts: 4.271
| | Utiliza el método que te sugiere Korku. Las colecciones no son arrays de string, son lo más parecido a un hashmap en el que se almacenan pares; Una KEY por la que buscar, y un OBJETO que queda contenido en la colección y asociado a esa KEY.
Puedes recorrerlo por su índice (Paradójicamente es algo más lento) o simplemente utilizando la función de Korku, reclamar el objeto por su clave.
Solamente decir que se debe añadir una captura de error al método de korku, pues si se solicita una KEY no contenida en la colección, se produce un error en tiempo de ejecución. | 
30-01-2007, 09:18:25
| | Un Nuevo Amigo | | Registrado: nov 2006 Posts: 22
| | Me temo que no me he explicado bien,
conozco el funcionamiento de las colecciones, lo que no se es cómo funcionan en Visual Basic. Mi problema es que los OBJETOS contenidos en mi colección son arrays de String, entonces si yo hiciera
ItemKEY = mCol(vntIndexKey)(1)
como hace Korku en su código, me inentaría coger el segundo elemento de mi array de String, y ahí me da el problema con los índices. | 
30-01-2007, 21:47:22
| | Gran Participación en el Foro | | Registrado: ago 2004 Ubicación: Tunja Posts: 243
| | Pues la verdad yo nunca he intentado agregar matrices de datos a una colección pero si tu dices que se puede yo te creo. Entonces lo único que se me ocurre es que utilices de bucles así: Código: Dim i As Integer
Dim X As Integer
Dim sCadena() As String
Dim sItem As String
For i = 1 to mcol.Count
Set sCadena = mcol(i)
For X = 0 To UBound(sCadena) 'Aquí hay que tener encuenta si la matriz empieza con 0
sItem = sCadena(X) 'En sItem se guardaría cada elemento de la matriz, luego tendrías que detyerminar qué hacer con esa información
Next
Next Es lo único que se me ocurre, espero te sirva de algo. | 
31-01-2007, 10:26:08
| | Un Nuevo Amigo | | Registrado: nov 2006 Posts: 22
| | Muchas gracias, pero lo cierto es que eso no me sirve para lo que yo quiero.
No tengo problemas en acceder a los datos, para lo que tengo problemas es para saber qué KEY está asociada a cada array de String. Lo que quiero es "volcar" de alguna manera el contenido completo de la colección en un fichero de texto de una manera similar a la siguiente.
KEY OBJETO(0) OBJETO(1) OBJETO(2) ...
En un principio había pensado en recorrer la coleccion con un bucle y hacer (como haría en C++) un getKey y luego acceder al array de cadenas de caracteres y recorrerlo para guardar cada cadena. Pero lo que no consigo hacer en Visual Basic es lo que haría el getKey; y si aplicara el método que me ha recomendado Korku de acceder al elemento 1 del objeto, al ser éste un array intentaría acceder a la cadena que está en la posición 1 y si no existe me da un error.
Siento parecer brusco o desagradable, pero sé que no me explico demasiado bien y me preocupa estar haciéndoles perder el tiempo por un problema que probablemente es muy sencillo.
Muchas gracias otra vez y un saludo. | | Herramientas | | | | Desplegado | Mode Lineal |
Normas de Publicación
| no Puedes crear nuevos temas no Puedes responder a temas no Puedes adjuntar archivos no Puedes editar tus mensajes Código [IMG] está habilitado Código HTML está deshabilitado | | | La franja horaria es GMT. Ahora son las 03:42:20.
Powered by vBulletin® Version 3.6.8 Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO 3.1.0
A vBSkinworks Design
|  |