Clase Dictionary para arrays asociativos

231 views
Skip to first unread message

Victor Espina

unread,
Apr 16, 2012, 12:20:06 AM4/16/12
to publice...@googlegroups.com
Acabo de postear un nuevo articulo en codeWiki sobre una clase llamada Dictionary que permite manejar arrays asociativos en VFP.

Pueden ver el articulo con el codigo fuente de la clase aca:

Saludos

Victor Espina

Mario López

unread,
Apr 16, 2012, 12:34:54 PM4/16/12
to Comunidad de Visual Foxpro en Español
@Victor:

pero eso no sería casi literalmente la clase Collection de VFP?

---
oCol = CREATEOBJECT("Collection")
oCol.Add(1, "Uno")
oCol.Add(2, "Dos")
oCol.Add(3, "Tres")

? oCol.Count && >= 3
? oCol.Item["Uno"] && >= 1
? oCol.Item[1] && >= 1

? oCol.GetKey(1) && => "Uno"
---

Saludos,
Mario


On Apr 16, 1:20 am, Victor Espina <vespi...@gmail.com> wrote:
> Acabo de postear un nuevo articulo en codeWiki sobre una clase llamada
> Dictionary que permite manejar arrays asociativos en VFP.
>
> Pueden ver el articulo con el codigo fuente de la clase aca:http://www.victorespina.com.ve/wiki/index.php?title=Clase_Dictionary_...)
>
> Saludos
>
> Victor Espina

Victor Espina

unread,
Apr 16, 2012, 12:48:30 PM4/16/12
to publice...@googlegroups.com
Pues la verdad Mario, tienes razon. Lo que sucede es que en mi dia a dia trabajo mas con VFP6 que con VFP9, asi que tiendo a olvidar las cosas nuevas que se han introducido en las versiones de VFP posteriores a la 6.

Gracias por la acotacion

Saludos

Victor Espina

Victor Espina

unread,
Apr 16, 2012, 12:50:48 PM4/16/12
to publice...@googlegroups.com
Creo que despues de lo acotado por Mario, lo mas logico seria duplicar la funcionalidad de la clase Collection nativa de VFP para versiones de VFP que no implementen dicha clase, de modo que pueda crear codigo en VFP6 que haga uso de Collection y luego ese codigo funcione correctamente en VFP 9.

Si alguien ya hizo esto, o conoce en donde se puede conseguir dicho codigo, por favor haganmelo saber para no reinventar la rueda.

Saludos

Victor Espina

Mario López

unread,
Apr 16, 2012, 1:14:54 PM4/16/12
to Comunidad de Visual Foxpro en Español
@Victor:

Ken Chazotte (RIP, creo) desarrolló una implementación completa de una
clase Collection en
el libro "Build Your Own Framework with Visual FoxPro"

El libro me pareció muy bueno, el capítulo de Collection está en
http://goo.gl/31kZP.

Lo que sí que no tiene la misma interface que la clase nativa VFP (con
eso te di el pié
perfecto para la entrada de la Wiki sobre Adapter Pattern :)))

Saludos,
Mario

---

Victor Espina

unread,
Apr 16, 2012, 2:12:02 PM4/16/12
to publice...@googlegroups.com
JA Ja, vale. Dejame leer sobre ese pattern, para refrescar la memoria.

Saludos

Victor Espina

Mauricio Ruben Molinero

unread,
Apr 16, 2012, 3:04:36 PM4/16/12
to publice...@googlegroups.com
Si recuerdo haberlo leido, tiene su propia implementacion de Stacks & Queues.


Saludos!

Mauricio R. Molinero,

Victor Espina

unread,
Apr 16, 2012, 4:00:13 PM4/16/12
to publice...@googlegroups.com
Excelente link. Gracias por el aporte. 

Saludos

Victor Espina

Rafa Cano

unread,
Apr 22, 2012, 11:35:58 AM4/22/12
to publice...@googlegroups.com
Una pequeña implementación. Usando la clase collection como padre. El método Add lo he sobrescrito usando la misma nomenclatura que se usa en la clase custom original aunque yo preferiría usar los que trae por defecto la clase collection. Primero el valor (eItem), después la clave (cKey).

DEFINE CLASS dictionary AS collection
Name = "dictionary"
DIMENSION values[1]


PROCEDURE ContainsKey
*----------------------------------------------------------------------
* Método / Evento:
* Dictionary.containskey
* Parámetros:
*
* Objetivo:
* <descripción del método/evento>
* Programador (Máquina):
* Rafael (WIN7X64)
* Fecha de Revisión:
* 22/04/2012 12:49:26
* Modificaciones:
* <Notas de Modificaciones>
*----------------------------------------------------------------------
LPARAMETERS cKey
LOCAL llRet
LOCAL loErr AS EXCEPTION

m.llRet = VARTYPE(m.cKey) = "C"

TRY
m.llRet = m.llRet AND ;
!EMPTY(THIS.GETKEY(m.cKey))

CATCH TO loErr
SET STEP ON
m.llRet = .F.

ENDTRY

RETURN m.llRet
ENDPROC


*-- Devuelve un array con las claves del diccionario.
PROCEDURE GetKeys
*----------------------------------------------------------------------
* Método / Evento:
* Dictionary.getkeys
* Parámetros:
*
* Objetivo:
* Copia en un array la lista de claves registradas.
* Programador (Máquina):
* Rafael (WIN7X64)
* Fecha de Revisión:
* 22/04/2012 16:18:31
* Modificaciones:
* <Notas de Modificaciones>
*----------------------------------------------------------------------
LPARAMETERS taKey
LOCAL lnRet
LOCAL loErr AS EXCEPTION

m.lnRet = THIS.COUNT
IF THIS.COUNT > 0
DIMENSION m.taKey(THIS.COUNT)
FOR m.i = 1 TO THIS.COUNT
m.taKey(m.i) = THIS.GETKEY(m.i)

ENDFOR
ENDIF

RETURN m.lnRet
ENDPROC


*-- Clona este mismo objeto.
PROCEDURE Clone
*----------------------------------------------------------------------
* Método / Evento:
* Dictionary.clone
* Parámetros:
*
* Objetivo:
* <descripción del método/evento>
* Programador (Máquina):
* Rafael (WIN7X64)
* Fecha de Revisión:
* 22/04/2012 16:25:38
* Modificaciones:
* <Notas de Modificaciones>
*----------------------------------------------------------------------
* LPARAMETERS
LOCAL loDict
LOCAL i
LOCAL loErr AS EXCEPTION

m.llRetorno = .T.

* Guardar el área Activa
m.lnUltSelect = SELECT(0)

TRY
m.loDict = NEWOBJECT(THIS.CLASS, THIS.CLASSLIBRARY)
FOR m.i =1 TO THIS.COUNT
m.loDict.ADD(THIS.GETKEY(m.i), THIS.ITEM(m.i))

ENDFOR

CATCH TO loErr

m.loDict = .NULL.

FINALLY

ENDTRY

RETURN m.loDict
ENDPROC


PROCEDURE values_access
*----------------------------------------------------------------------
* Método / Evento:
* Dictionary.values_access
* Parámetros:
* eIndex clave o índice del diccionario a obtener.
* Objetivo:
* <descripción del método/evento>
* Programador (Máquina):
* Rafael (WIN7X64)
* Fecha de Revisión:
* 22/04/2012 16:43:29
* Modificaciones:
* <Notas de Modificaciones>
*----------------------------------------------------------------------
LPARAMETERS eIndex
LOCAL luRet

m.luRet = ICASE(VARTYPE(m.eIndex) = "N" AND BETWEEN(m.eIndex, 1, THIS.COUNT), THIS.ITEM(m.eIndex), ;
THIS.ContainsKey(m.eIndex), THIS.ITEM(m.eIndex), ;
.NULL.)

RETURN m.luRet
ENDPROC


PROCEDURE values_assign
*----------------------------------------------------------------------
* Método / Evento:
* Dictionary.values_assign
* Parámetros:
* vNewVal Valor
* eIndex Clave del diccionario
*
* Objetivo:
* Si no se puede asignar el valor se devuelve el error 46.
* Programador (Máquina):
* Rafael (WIN7X64)
* Fecha de Revisión:
* 22/04/2012 16:46:51
* Modificaciones:
* <Notas de Modificaciones>
*----------------------------------------------------------------------
LPARAMETERS vNewVal, m.eIndex
DO CASE
CASE VARTYPE(m.eIndex) = "N" AND BETWEEN(m.eIndex, 1, THIS.COUNT)
THIS.ITEM(m.eIndex) = m.vNewVal

CASE THIS.ContainsKey(m.eIndex)
THIS.REMOVE(m.eIndex)
THIS.ADD(m.eIndex, m.vNewVal)

OTHERWISE
ERROR 46

ENDCASE
ENDPROC


PROCEDURE Add
*----------------------------------------------------------------------
* Método / Evento:
* Dictionary.add
* Parámetros:
*
* Objetivo:
* <descripción del método/evento>
* Programador (Máquina):
* Rafael (WIN7X64)
* Fecha de Revisión:
* 22/04/2012 12:42:58
* Modificaciones:
* <Notas de Modificaciones>
*----------------------------------------------------------------------
LPARAMETERS cKey AS STRING, eItem AS Variant
LOCAL llRet

m.llRet = VARTYPE(m.cKey) = "C" AND ;
!THIS.ContainsKey(m.cKey)

IF m.llRet
COLLECTION::ADD(m.eItem, m.cKey)

ENDIF

NODEFAULT
RETURN m.llRet
ENDPROC
ENDDEFINE

Carlos Miguel FARIAS

unread,
Apr 22, 2012, 7:48:10 PM4/22/12
to publice...@googlegroups.com
Han pensado en una clase collection pero con mutiples niveles ( o sea varios keys, o sea un array asociativo? ) tipo lo que tiene php?
Saludos: Miguel, La Pampa (RA)

Rafa Cano

unread,
Apr 23, 2012, 4:46:24 AM4/23/12
to publice...@googlegroups.com
Que problema tienes con hacer esto:

myDic = NEWOBJECT("Dictionary", "Dictionary.vcx")

myDic.Add("KEY1", 2)
myDic.Add("KEYB", "hola")
myDic.Add("KEYOBJ", NEWOBJECT("Dictionary", "Dictionary.vcx"))

myDic[KEYOBJ].Add("SUBKEYOBJ", "MiValor")

Rafa Cano

unread,
Apr 23, 2012, 4:48:31 AM4/23/12
to publice...@googlegroups.com
Corrección: 
myDic["KEYOBJ"].Add("SUBKEYOBJ", "MiValor") 
Reply all
Reply to author
Forward
0 new messages