Usar los lenguajes Scripts desde Visual Basic

Ejemplos para usar el control msscript.ocx de Microsoft

Fecha: 5/Sep/98


Con este control, podemos usar cualquiera de los lenguajes Script, (JScript o VBScript), desde una aplicaci�n de Visual Basic.
Entre una de las ventajas que se me ocurren es la de poder evaluar f�rmulas e incluso crear un peque�o lenguaje de macros en nuestras aplicaciones de Visual Basic. Adem�s de usar las propias intrucciones de los lenguajes Script, podemos usar dentro del lenguaje script propiedades y m�todos de clases creadas en VB y usarlas internamente como si fuesen propias del lenguaje, aunque esto me imagino que s�lo funcionar� con el VBScript... de todas formas, las pruebas realizadas estar�n hechas en ese lenguaje, ya que es el m�s parecido al VB de los dos que ofrece este control.

Para usarlo, lo �nico que necesitamos es tener el control MSScript.ocx insertado en nuestro formulario y desde ese momento, podemos usarlo, siguiendo las reglas de esos lenguajes, pero se pueden usar.
Vamos a ver un par de ejemplos y despu�s crearemos un formulario que aceptar� una serie de instrucciones y asignaciones para ejecutarlas al pulsar en un bot�n.

Para poder usar este control, tendr�s que bajarte el control y las librer�as necesarias, son de libre distribuci�n (o al menos de libre uso) y te pongo la direcci�n de Microsoft desde la que puedes bajartela... yo ya lo tengo instalado y no recuerdo bien c�mo lleg� a mi equipo, puede ser que ya lo tengas en tu equipo, para comprobarlo, realiza una b�squeda en el disco C: y mira a ver si tienes el msscript.ocx, si es as�, no tienes que realizar la descarga.

En caso de que no tengas el control, pasate por esta direcci�n:
http://msdn.microsoft.com/scripting/
y pincha en la secci�n Script Control y selecciona download.
Te har�n m�s preguntas que para la declaraci�n de hacienda, y al final puede que hasta te hartes de esperar, pero...
El fichero que me he bajado, aunque ya lo ten�a, pero para comprobar, es: sct10en.exe de 247.960 bytes.
Comprobar� si se puede distribuir "gratuitamente" el control, aunque es posible que tengas las librer�as correspondientes instaladas en tu equipo...

Una vez que lo tengas instalado y registrado, realmente no hace falta registrarlo para usarlo desde VB, ya que puedes usar el bot�n "Browse..." y a�adir el control a la lista de controles (componentes) disponibles.
Inserta un control en el formulario que te habr� creado al seleccionar un nuevo proyecto y vamos a empezar a probar.

El cl�sico "Hola Mundo"

El lenguaje que usaremos en estas pruebas, ser� el VBScript, as� ser� m�s f�cil de entender.
Para hacer un programa que muestre "Hola Mundo", lo �nico que necesitamos es mostrar esa frase en un MsgBox, y eso es lo que haremos.
Pero para poder usar algo que est� escrito en VBScript, hay que usar alg�n procedimiento, da igual que sea un Sub o una Funci�n, ya que se tiene que llamar a ese procedimiento, para que la cosa empiece a funcionar.
Veamos el ejemplo y c�mo lo insertar�amos en el control:

'Prueba 1 de ScriptControl
Dim sCodigo As String

'El c�digo a procesar
sCodigo = "Sub Hola() MsgBox ""Hola Mundo"" End Sub"
'A�adimos el c�digo al control
ScriptControl1.AddCode sCodigo
'Ejecutamos el procedimiento
ScriptControl1.Run "Hola"

F�jate que el c�digo se ha escrito en una s�la l�nea, esto se puede hacer as� o usar l�neas diferentes, en caso que que tengas el c�digo en un TextBox, puedes usar cambios de l�neas e indentar el c�digo para que quede m�s legible; pero si lo a�ades manualmente, acuerdate de usar dobles comillas dobles cada vez que quieras poner una cadena literal, sino te encontrar�s con un error. Por supuesto que todo el c�digo debe ir en una misma variable.
Una vez que tenemos el c�digo que queremos ejecutar, lo a�adimos usando el m�todo AddCode, de esta forma, se a�ade el c�digo y est� listo para ser ejecutado.
Y para ejecutar el c�digo se usa el m�todo Run, despu�s de Run se indicar� lo que queremos ejecutar, normalmente el nombre de un procedimiento o funci�n, aunque tambi�n se pueden especificar m�s cosas, por ejemplo los par�metros que espera una funci�n, etc.
Por defecto, el lenguaje usado es el VBScript, pero si queremos usar otro lenguaje, hay que indicarselo mediante la propiedad Language, y los valores aceptados son: JScript y VBScript:
ScriptControl1.Language = "JSCript"

Este control tambi�n se puede usar para evaluar expresiones, usando las funciones que incorporan estos lenguajes scripts, al realizar operaciones con el JScript, me he encontrado con algunos errores, ya que algunas veces no distingue una cadena de un n�mero, as� que he optado por hacer las pruebas con el VBScript.
Si quieres saber las funciones y dem�s cosillas que te permiten hacer estos lenguajes Scripts, pincha en los links de la p�gina principal que te llevar�n a las p�ginas correspondientes.

Puedes fabricarte una utilidad que permita al usuario escribir algunas asignaciones a variables y despu�s a�adir un m�todo que te de el resultado de la operaci�n, incluso crear una funci�n que devuelva el resultado de las operaciones realizadas y usar ese valor para tus propios c�lculos... en fin, cada vez que necesites evaluar expresiones, puedes servirte de este control.

Para hacer las cosas simples, aunque normalmente estos ejemplos simples no suelen servir para nada, vamos a ver c�mo evaluar una expresi�n y obtener el valor devuelto. Para conseguir este valor, se puede usar tanto Run, como Eval, pero esta �ltima es m�s vers�til que la primera, ya que en Run se pueden usar par�metros, pero estos deben especificarse "impl�citamente", sin embargo con Eval, se puede usar una cadena que contenga la funci�n que queremos usar y los par�metros correspondientes.
Veremos los dos ejemplos.

'Prueba 2 de ScriptControl
Dim sCodigo As String
Dim vValor As Variant

sCodigo = "Function Multiplica(a, b)" & vbCrLf & _
          "    Multiplica = a * b" & vbCrLf & _
          "End Function"

'Por supuesto que tambi�n se podr�a asignar as�:
'sCodigo = "Function Multiplica(a, b) Multiplica = a * b End Function"

'A�adimos el c�digo, especificamos el lenguaje y ejecutamos
With ScriptControl1
    .Language = "VBScript"
    .AddCode sCodigo
    
    'Usamos Run para obtener el resultado
    'vValor = .Run("Multiplica", "2", "5")
    
    'Usando Eval, nos permite que la expresi�n est� en
    'una variable... adem�s de hacerlo directamente,
    'pero se usa de la misma forma que lo har�amos desde VB
    vValor = .Eval("Multiplica(2,5)")
    
    'Mostramos el valor devuelto
    MsgBox "El valor devuelto es: " & vValor
End With

En el caso de Run, adem�s de tener que indicar el nombre de la funci�n a ejecutar, que se puede indicar mediante una variable, hay que especificar los par�metros que necesita esa funci�n, por tanto, es preferible usar este m�todo cuando sepamos los valores que se necesitan.

Por otro lado, usando Eval, tenemos mayor libertad, ya que se puede usar el contenido de una variable, en la que se ha asignado lo que queremos evaluar. Por ejemplo, podr�amos tener en un formulario un TextBox para incluir todo el c�digo, en otro TextBox se podr�a introducir lo que queremos evaluar, de esta forma ser�a f�cil de hacer, ya que el usuario tendr�a que escribir lo que quiere evaluar y nosotros simplemente tendr�amos que pasar como par�metro el contenido de ese otro TextBox.

Pero como siempre, vamos a verlo con un ejemplo:
Crea un nuevo proyecto, inserta el control msscript.ocx, un TextBox (Text1) con la propiedad Multiline=True y que tenga las dos barras de scroll, a�ade otro TextBox (Text2), para insertar lo que queremos evaluar y CommandButon (cmdEval) para que al pulsarlo se ejecute el c�digo.
En este bot�n vamos a usar una rutina de detecci�n de errores, ya que los errores se detectan en tiempo de ejecuci�n, ya que todo lo que se ejecuta con los Scripts no es "compilado", sino interpretado... como en los viejos tiempos del Basic de MS-DOS.

Una nota importante, todo lo que se inserte en la caja de texto a evaluar, debe ser una funci�n, o alguna operaci�n que devuelva un valor. Por ejemplo: 25 * 2 dar� el resultado esperado.

Vamos a ver una imagen del formulario en tiempo de ejecuci�n:

Y este es el c�digo:

'------------------------------------------------------------------
'Pruebas de uso del control ScriptControl               (28/Jun/98)
'
'Revisado:                                              (27/Ago/98)
'Para el ejemplo en mis p�ginas:                        (04/Sep/98)
'
'�Guillermo 'guille' Som, 1998
'------------------------------------------------------------------
Option Explicit


Private Sub Form_Load()
    'Un poco de texto de ejemplo:
    Text1 = "Function Multiplica(a, b)" & vbCrLf & _
            "    Multiplica = a * b" & vbCrLf & _
            "End Function"
    
    Text2 = "Multiplica(2,5)"
End Sub


Private Sub cmdEval_Click()
    'Ejecutar el contenido del Text2
    Dim retValue As Variant
    
    'Interceptamos los posibles errores
    On Local Error GoTo Error_Ejecutar
    
    'A�adimos el c�digo y evaluamos
    With ScriptControl1
        .AddCode Text1
        'Esta asignaci�n no es necesaria, ya que VBScript
        'es el lenguaje por defecto
        .Language = "VBScript"
        'Asignamos el valor devuelto
        retValue = .Eval(Text2)
        ' y lo mostramos
        MsgBox "El valor devuelto por: " & Text2 & vbCrLf & " es: " & retValue
    End With
    
    Exit Sub
Error_Ejecutar:
    MsgBox "Se ha producido el siguiente error:" & vbCrLf & _
            ScriptControl1.Error.Number & ", " & _
            ScriptControl1.Error.Description
    Err = 0
End Sub

Pero este control tiene un mont�n de posibilidades m�s, por ejemplo, podemos crear nuestros propios m�dulos e insertarlo en el control y despu�s a�adir funciones y otros procedimientos a ese m�dulo.
Tambi�n podemos crear una clase y usar esa clase desde el c�digo insertado en el propio control, es decir que podemos extender el "vocabulario" del lenguaje script, de la misma forma que ampliamos el de Visual Basic.

Veamos un ejemplo de esto que acabo de decir:

Crea un nuevo proyecto, a�ade al formulario el control msscript.ocx.
A�ade un m�dulo de clase normal, cambiale el nombre a cMiClase, a�ade este c�digo al m�dulo de clase:

'------------------------------------------------------------------
'M�dulo de ejemplo para usar con el control msscript    (04/Sep/98)
'cMiClase.cls
'
'�Guillermo 'guille' Som, 1998
'------------------------------------------------------------------
Option Explicit


Public Function Multiplica(x, y)
    Multiplica = x * y
End Function

Escribe esto en el evento Form_Load:

'Prueba 4 de ScriptControl
Dim miObjeto As cMiClase
Dim sCodigo As String

Set miObjeto = New cMiClase

sCodigo = _
    "Sub PruebaObjeto(a,b)" & vbCrLf & _
    "    Dim Valor" & vbCrLf & _
    "    Valor = MiObjetoScript.Multiplica(a,b)" & vbCrLf & _
    "    Msgbox ""El valor es: "" & Valor" & vbCrLf & _
    "End Sub"
    
With ScriptControl1
    .AddObject "MiObjetoScript", miObjeto
    .AddCode sCodigo
    .Run "PruebaObjeto", 3, 4
End With

Por supuesto que si la clase acepta propiedades, podemos asignar esas propiedades desde el c�digo del script, de la misma forma que asignar�amos en cualquier programa VB.
En este ejemplo, en AddObject, se especifica el nombre del objeto, (para usar en el c�digo script), en este caso es: MiObjetoScript y a continuaci�n se inserta el objeto que acabamos de crear.
Despu�s desde el propio c�digo a usar, llamamos a la funci�n "Multiplica" de igual forma a como lo har�amos en un programa normal y corriente.

Si quieres seguir experimentando, en la ayuda que se incluye con el control vienen unos cuantos ejemplos, de los cuales he tomado los que aqu� te he puesto... je, je.

As� que vamos a dejarlo por hoy y m�s adelante veremos si pongo algo m�s. Es que a�n no he experimentado mucho con este control y no me he "visto" todos los ejemplos...

 

Nos vemos.
Guillermo


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