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 (
).
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