¡Hola, chicos del scripting!Flores que nacen, diálogos que emergen, la primavera ha llegado...

Los chicos del scripting de Microsoft

Ah, la primavera ya está aquí. Y jamás estuvimos tan contentos. Después de un invierno con lluvia sin precedentes, tormentas de hielo, tempestades de nieve y tempestades de viento (una de las cuales estrelló un árbol enorme en el patio de uno de los chicos del scripting, y le erró a la casa por centímetros e hizo que el perro del scripting se escondiera detrás del sofá), la primavera finalmente está aquí, y disfrutamos de una llovizna fresca antes que empiecen las lluvias más tibias del noroeste del Pacífico en el verano.

Mientras observamos la llovizna afuera, pensamos que es un buen momento para una pequeña aventura con nuestro scripting y mirar las aplicaciones HTML (HTA). Y cuando decimos aventura, vamos en serio. No vamos a hacer ninguna clase de introducción; supondremos que ya sabe lo que es un HTA y cómo crear uno. Si no lo sabe, deberá consultar el HTA Developers Center en el Script Center. En particular, consulte los dos artículos en la sección HTAs for Beginners. Una vez que lo haya hecho, estará al día y listo para regresar aquí.

En esta columna, le mostraremos cómo crear cuadros de diálogo. No sólo eso, le mostraremos cómo transferir información de aquí para allá entre el HTA principal y el cuadro de diálogo. Sí, el aire fresco de la primavera nos puso ambiciosos, ¿no? Disfrútelo mientras dura.

Como ya sabe, hay dos clases de cuadros de diálogo: modal y no modal. La diferencia es que cuando abre un cuadro de diálogo modal, no puede volver a la ventana principal desde la que lo abrió hasta que cierre el cuadro de diálogo. Cuándo abre un cuadro de diálogo no modal, se puede mover de aquí para allá entre ventanas. Sin embargo, si cierra la ventana principal, el cuadro de diálogo no modal también se cerrará.

La creación de un cuadro de diálogo modal funciona exactamente igual que la de un cuadro de diálogo no modal. La única diferencia es que crear un cuadro de diálogo modal llama a la función ShowModalDialog, y crear un cuadro de diálogo no modal llama a la función ShowModelessDialog. Ambas funciones aceptan los mismos parámetros. Comencemos con un HTA sencillo que abre un cuadro de diálogo modal (consulte la figura 1).

Figure 1 Cuadro de diálogo inicia sencillo

<html> 
<head> 
<title>Modal Example</title>
<HTA:APPLICATION 
  APPLICATIONNAME=”MainModal”>
</head>

<script language=”VBScript”> 
Sub ShowDialog 
 intReturn = _
    ShowModalDialog(“modaldialog.hta”) 
 textbox.Value = intReturn
End Sub
</script> 

<body> 
<button onclick=”ShowDialog”>
 Show Dialog Box</button> <p>
<input type=”text” name=”textbox”>
</body> 
</html>

Aquí creamos un HTA con el título Modal Example. En el área <body> de nuestro HTA, agregamos dos elementos: un botón con la etiqueta Show Dialog Box y un cuadro de texto denominado textbox, ambos se puede observar en la figura 2. Cuando hace clic en el botón, se ejecutará la subrutina ShowDialog.

Figura 2 Verdadero cuadro de diálogo modal HTA

Figura 2** Verdadero cuadro de diálogo modal HTA **

La subrutina ShowDialog es bastante sencilla. Llamamos a la función ShowModalDialog y transferimos como parámetro el nombre del archivo HTA que queremos mostrar como cuadro de diálogo modal, en este caso modaldialog.hta (se supone que modaldialog.hta está en la misma carpeta que este HTA. Si no está, deberá incluir aquí la ruta de archivo completa).

Capturamos también un valor devuelto (int­Return) de ShowModalDialog. Mostramos este valor en el cuadro de texto. En un momento verá cómo obtenemos este valor devuelto. Una cosa importante a tener en cuenta es que la llamada a ShowModalDialog no retornará hasta que se cierre el cuadro de diálogo modal. Eso significa que el valor devuelto no se asignará al cuadro de texto hasta después de que se cierre el cuadro de diálogo.

Ahora observemos modaldialog.hta, el cuadro de diálogo que abre la llamada a HTA (consulte la figura 3). En este HTA, creamos dos elementos: un cuadro de lista denominado listbox y un botón con la etiqueta OK, tal como se muestra en la figura 4. Agregamos cuatro elementos al cuadro de lista con las etiquetas Option 1, Option 2 y demás, y asignamos los valores correspondientes (1 al 4) a cada uno de esos elementos. Cuando se hace clic en el botón OK, se ejecutará la subrutina CloseWindow.

Figure 3 modaldialog.hta

<html> 
<head> 
<title>Modal Dialog Box</title>
<HTA:APPLICATION 
  APPLICATIONNAME=”ModalDialog”>
</head>

<script language=”VBScript”> 
Sub CloseWindow
  window.returnValue = listbox.Value
  window.Close 
End Sub
</script> 

<body> 
<select size=”3” name=”listbox”>
 <option value=”1”>Option 1</option>
 <option value=”2”>Option 2</option>
 <option value=”3”>Option 3</option>
 <option value=”4”>Option 4</option>
</select>
<p>
<input type=”button” id=”idBtn” value=”OK” onclick=”CloseWindow”> 
</body> 
</html>

Figura 4 HTA que representa el cuadro de diálogo modal

Figura 4** HTA que representa el cuadro de diálogo modal **

La subrutina CloseWindow es bastante sencilla. Lo primero que hacemos es leer el valor del elemento del cuadro de lista seleccionado y asignar ese valor a la propiedad window.returnValue. Por ejemplo, si el usuario eligió Option 2, el valor 2 se asignará a window.returnValue. A continuación, llamamos el método window.Close para cerrar el cuadro de diálogo.

En este momento, se devuelve el control al HTA principal. Recuerde nuestra llamada a ShowModalDialog:

intReturn = _
  ShowModalDialog(“modaldialog.hta”) 

El valor devuelto asignado a intReturn es el valor que asignamos a window.returnValue en nuestro HTA de cuadro de diálogo. Entonces, si elegimos Option 2 en el cuadro de diálogo, que asigna el valor 2 a window.re­turnValue, intReturn será igual a 2 y la línea siguiente de código muestra ese valor en el cuadro de texto:

textbox.Value = intReturn

Ahora que hemos visto cómo obtener un valor de un cuadro de diálogo, veamos cómo obtendríamos un valor para el mismo. Esta vez usaremos un cuadro de diálogo no modal (consulte la figura 5). Pero recuerde, el trabajo modal y no modal es el mismo, de modo que este mismo proceso funcionará con un cuadro de diálogo modal.

Figure 5 Ir a no modal

<html>
<head>
<title>Modeless Example</title>
<HTA:APPLICATION 
  APPLICATIONNAME=”ModelessMain”>
</head>

<script language=”VBScript”>
Sub ShowDialog
  intReturn = _
    window.ShowModelessDialog _
    (“modelessdialog.hta”, _
    lstServers.Value, _
    “dialogHeight:400px;dialogWidth:300px”)
End Sub
</script>

<body>
<select size=”1” name=”lstServers”>
 <option value=”server1”>Server1</option>
 <option value=”server2”>Server2</option>
 <option value=”server3”>Server3</option>
 <option value=”server4”>Server4</option>
</select>
<p>
<input type=”button” value=”Retrieve Processes” onclick=”ShowDialog”>
</body>
</html>

Figura 7 Datos transferido al cuadro de diálogo no modal

Figura 7** Datos transferido al cuadro de diálogo no modal **

Esta vez hemos creado un cuadro de lista desplegable denominado lstServers (puede ver que es desplegable porque el tamaño es igual a 1). También hay un botón con la etiqueta Retrieve Processes. Cuando se hace clic en el botón, se ejecutará la subrutina ShowDialog. La subrutina ShowDialog tiene sólo una línea, la llamada a la función window.ShowModelessDialog, tal como se muestra aquí:

intReturn = _
  window.ShowModelessDialog _
  (“modelessdialog.hta”, _
  lstServers.Value, _
  “dialogHeight:400px;dialogWidth:300px”)

El primer parámetro que transferimos a esta función es el nombre del HTA que queremos ejecutar en el cuadro de diálogo, en este caso modelessdialog.hta. El segundo parámetro es la propiedad Value de nuestro cuadro de lista. Recuerde, el propiedad Value contiene el valor de la opción seleccionada en el cuadro de lista. Entonces, si el usuario selecciona Server2 del cuadro de lista, el Valor sería server2. Este parámetro indica cómo transferimos información al cuadro de diálogo (si desea transferir múltiples valores, los podría pasar en este parámetro como una matriz o quizá una colección).

Veremos en un instante cómo recibe el cuadro de diálogo el valor en este parámetro. Pero primero, observe que agregamos un tercer parámetro:

“dialogHeight:400px;dialogWidth:300px”

Este parámetro contiene una cadena que especifica la altura y el ancho que queremos para nuestro cuadro de diálogo. En este caso, especificamos una altura de 400 píxeles (400px) y un ancho de 300 píxeles. Como vimos en nuestro ejemplo modal, podemos dejar en blanco este parámetro y el cuadro de diálogo se mostrará con el tamaño predeterminado para el equipo.

Ahora observemos modelessdialog.hta (en la figura 6) y veamos cómo lee el cuadro de diálogo el valor que le pasamos.

Figure 6 modelessdialog.hta

<html>
<head>
<title>Modeless Dialog</title>
<HTA:APPLICATION 
  APPLICATIONNAME=”Processes”>
</head>

<script language=”VBScript”>
Sub window_onLoad
  strComputer = window.dialogArguments
  Set objWMIService = GetObject(“winmgmts:” _
    & “{impersonationLevel=impersonate}!\\” _
    & strComputer & “\root\cimv2”)
  Set colProcesses = objWMIService.ExecQuery   _
    (“Select * from Win32_Process”)

  strHTML = “<h1>” & strComputer & “</h1><p>”
  For Each objProcess in colProcesses
    strHTML = strHTML & objProcess.Name & _
       “<br>”
  Next

  DataArea.InnerHTML = strHTML
End Sub
</script>

<body>
<span id=”DataArea”></span>
</body>
</html>

En este HTA, el único elemento que especificamos es un intervalo, que contiene el área completa del cuadro de diálogo. En nuestra sección de secuencia de comandos, definimos una subrutina window_onLoad. Esta subrutina se ejecutará en el momento en que se abra el HTA (en este caso, por la llamada a ShowModelessDialog). Observe la primera línea en esta subrutina:

strComputer = window.dialogArguments

Asignamos a la variable strComputer el contenido de la propiedad window.dialogArguments. ¿Y qué piensa que hay en esta propiedad? Como puede ver, también se está despertando con la primavera. Es cierto, es el valor transferido en el segundo parámetro de la llamada a ShowModelessDialog. Si se seleccionó Server2 en la ventana principal, ahora strComputer contiene el valor server2.

El resto de la subrutina recupera simplemente todos los procesos de strComputer y los muestra en el intervalo del área. Puede ver los resultados de esta operación en la figura 7.

Felizmente, ahora tiene el verano entero para jugar con los cuadros de diálogo de HTA. A menos que, por supuesto, viva en el hemisferio sur, en cuyo caso está llegando el invierno y quizás tenga alguna dificultad si termina con tantos apagones durante su invierno como los que nosotros tuvimos por aquí durante el nuestro.

Los chicos del scripting de Microsoft trabajan para (bueno, son empleados de) Microsoft. Cuando no juegan al béisbol, ni entrenan ni lo ven (u otras actividades varias), dirigen TechNet Script Center. Visite la página web www.scriptingguys.com.

© 2008 Microsoft Corporation and CMP Media, LLC. Reservados todos los derechos; queda prohibida la reproducción parcial o total sin previa autorización.