2010-10-27 22 views
6

Tengo un diccionario de datos de formulario que deseo modificar utilizando una función.¿Puede una función de VBScript devolver un diccionario?

function queryCleanForm(myDictForm) 

    dim arrayKeys 
    arrayKeys = myDictForm.keys 

    for i=0 to myDictForm.count-1 
     myDictForm(arrayKeys(i)) = replace(myDictForm(arrayKeys(i)), "'", "''") 
     response.write myDictForm(arrayKeys(i)) 
    next 

    queryCleanForm = myDictForm 
end function 

El problema es la línea queryCleanForm = myDictForm errores como

Wrong number of arguments or invalid property assignment 

¿Hay una manera de hacer esto en VBScript?

+1

Esta pregunta es inquietantemente similar a http://stackoverflow.com/questions/4038021/vba-return-dictionary-from-function preguntado 5 minutos antes que el suyo. – JohnFx

+1

¡guau! (cumpliendo con el requisito de carácter mínimo) – quakkels

Respuesta

14

Prueba esto:

SET queryCleanForm = myDictForm 

Con los objetos que necesita para utilizar SET para decirle VBScript que se trata de una referencia de objeto que está asignando no es un tipo de valor.

+1

gracias ... eso es dolorosamente obvio ahora :-) – quakkels

1

Sí, es necesario utilizar el comando SET:

Conjunto queryCleanForm = myDictForm

0

También puede usar los valores ByRef o ByVal en la función. ByVal, el objeto que envía a una función o sub se copia en la memoria privada para ser utilizado dentro de la función y se descarta después de que se completa la función. Por referencia, se hace referencia al objeto que enviaste a una función y todas las manipulaciones que realizas, quitando claves, configurando el objeto, etc., se hace directamente al objeto que enviaste.

E.g.

Sub test 
    DIM testDict as variant 
    call setdict(testDict) 

    testDict.Add "test", "value" 

    call addValue(testDict, "test2","another value") 

    msgbox testDict.Count 

    Set testDict = Nothing 
End Sub 

Sub setdict(ByRef in_Dict as Variant) 
    If Typename(in_Dict) <> "Dictionary" Then 
    SET in_Dict = CreateObject("Scripting.Dictionary") 
    end if 
end sub 

sub addValue(ByRef in_Obj as Variant, ByVal in_Key as String, ByVal in_Value as String) 
if not in_Obj.Exists(in_Key) then 
    in_Obj.Add in_Key, in_Value 
end if 
end sub 

El submarino de prueba llama con una variable de tipo variante al subconjunto. En la función Valido el tipo de objeto enviado al sub. Si el tipo de objeto no es un objeto de diccionario (que no lo es), entonces el objeto in_Dict que en realidad es el objeto testDict declarado en la prueba secundaria, se establecerá en un objeto de diccionario.

Para demostrar mejor la referencia, también incluí el segundo sub llamado addValue. Paso nuevamente el objeto a la función como referencia y agrego otra clave al objeto del diccionario. En la prueba principal secundaria, publique el recuento. En este caso, hay 2 claves presentes.

+0

Esta pregunta ya tiene una respuesta aceptada de * años * atrás ... – alestanis

Cuestiones relacionadas