Formularios en PowerShell

A la hora de crear nuestros scripts, por necesidad o por tratar de agregar una capa de interacci贸n con el usuario, podemos crear formularios de Windows, por medio de .Net Framework, permitiendo agregar una GUI (Graphical User Interface) a nuestros scripts.

Para los que han usado PowerShell en varias oportunidades, estar谩n acostumbrados a trabajar con objetos. Pues bien, los elementos WinForms tambi茅n son objetos. Y tambi茅n se sabe, que cada objeto contiene un conjunto de propiedades y m茅todos.

Un bot贸n, por ejemplo, tiene propiedades que definen su tama帽o, posici贸n, ubicaci贸n, texto y muchas m谩s. Todas ellas definibles.

En cambio dentro de los m茅todos (mucho menos utilizados) se destacan por su uso constante: los eventos. Los formularios de Windows Forms son event driven. Esto significa que, despu茅s de haber creado la ventana, colocado los botones, etiquetas y dem谩s, simplemente espera a que algo suceda. Espera a que nosotros hagamos clic en un bot贸n, ingresemos alg煤n texto, o lo que sea que nos haga reaccionar nuestro formulario. Y para configurar estas reacciones a las acciones, es que tenemos los eventos.

Cada elemento tiene una gran cantidad de eventos para todo tipo de cosas. Los obvios, como el bot贸n izquierdo del rat贸n sobre un bot贸n o un texto ingresado en un cuadro de texto, pero tambi茅n algunos no tan obvios.

Creando nuestro primer formulario

Para este primer ejemplo, vamos a describir los pasos para poder crear un formulario que nos muestre un bot贸n (con el texto: salir) que al realizarle un clic con el bot贸n izquierdo nos cierre el formulario.

A continuaci贸n dejo el c贸digo comentado para que pueda entender cada paso y cada l铆nea de comandos:

  #Cargo los Assemblies (necesario para definir el form)
  [void][reflection.assembly]::loadwithpartialname("System.Windows.Forms")
  [void][reflection.assembly]::loadwithpartialname("System.Drawing")
  #Creo el objeto Form
  $Form = New-Object System.Windows.Forms.Form
  #Defino el tama帽o del formulario
  $Form.Size = New-Object Drawing.Size(400,200)
  #Defino la posici贸n inicial
  $Form.StartPosition = "CenterScreen"
  #Defino el titulo del formulario
  $Form.Text = "Mi primer formulario"

  #Defino el bot贸n
  $Button = New-Object System.Windows.Forms.Button
  #Defino la posici贸n del bot贸n
  $Button.Location = New-Object System.Drawing.Size(150,100)
  #Defino el texto del bot贸n
  $Button.Text = "Salir"
  #Defino el evento al hacer el clic
  $Button.Add_Click({$Form.Close()})
  #Cargo el bot贸n al formulario
  $Form.Controls.Add($Button)

  #Ejecuto el formulario
  [void]$Form.ShowDialog()

F谩cil no? Bien, ahora podemos seguir agregando elementos y otro tipo de eventos a nuestro formulario.

Otro elemento muy usado aparte del bot贸n, son las etiquetas (labels) que permiten agregar texto para hacer referencias, como el siguiente ejemplo:

El c贸digo actualizado con la etiqueta agregada es:

  #Cargo los Assemblies (necesario para definir el form)
  [void][reflection.assembly]::loadwithpartialname("System.Windows.Forms")
  [void][reflection.assembly]::loadwithpartialname("System.Drawing")
  #Creo el objeto Form
  $Form = New-Object System.Windows.Forms.Form
  #Defino el tama帽o del formulario
  $Form.Size = New-Object Drawing.Size(400,200)
  #Defino la posici贸n inicial
  $Form.StartPosition = "CenterScreen"
  #Defino el titulo del formulario
  $Form.Text = "Mi primer formulario"

  #Defino la etiqueta
  $Label = New-Object System.Windows.Forms.Label
  #Defino el tama帽o de la etiqueta
  $Label.Size = New-Object System.Drawing.Size(200,20)
  #Defino la posici贸n de la etiqueta
  $Label.Location = New-Object System.Drawing.Size(110,50)
  #Defino el texto de la etiqueta
  $Label.Text = "Esto es el texto de la etiqueta"
  #Cargo la etiqueta en el formulario
  $Form.Controls.Add($Label)

  #Defino el bot贸n
  $Button = New-Object System.Windows.Forms.Button
  #Defino la posici贸n del bot贸n
  $Button.Location = New-Object System.Drawing.Size(150,100)
  #Defino el texto del bot贸n
  $Button.Text = "Salir"
  #Defino el evento al hacer el clic
  $Button.Add_Click({$Form.Close()})

  #Cargo el bot贸n al formulario
  $Form.Controls.Add($Button)

  #Ejecuto el formulario
  [void]$Form.ShowDialog()

Si prestan atenci贸n se cre贸 un nuevo p谩rrafo que define a nuestro nuevo elemento: Label

Creo que no es necesario explicar que se realiz贸 para crear la etiqueta, por lo que vamos a pasar a ver otro elemento muy 煤til a la hora de crear nuestras interfaces gr谩ficas para los scripts Este elemento es el: TextBox

El cuadro de texto es un elemento gr谩fico que nos permite insertar texto para poder utilizarlo dentro de nuestros scripts.

Vamos a ver como se crea un cuadro de texto, las propiedades son muy parecidas a las de las etiquetas:

  #Defino la caja de texto
  $TextBox = New-Object System.Windows.Forms.TextBox
  #Defino la posici贸n
  $TextBox.Location = New-Object System.Drawing.Size(135,70)
  #Defino el texto que viene por defecto
  $TextBox.Text = ""
  #Cargo en el formulario
  $Form.Controls.Add($TextBox)

Ok, ya tenemos varios elementos de un formulario. Vamos a modificar algunas propiedades y metodos para que cuando hagamos clic con el bot贸n izquierdo sobre el bot贸n, en vez de cerrar el form, nos actualice la etiqueta con el texto ingresado en el cuadro de texto.

Lo primero que vamos a modificar es la etiqueta, para que no nos muestre texto ninguno, para ello vamos a la propiedad Text y modificamos el valor de la siguiente manera:

  #Defino el texto de la etiqueta
  $Label.Text = ""

Esto har谩 que nuestra etiqueta no muestre texto alguno.

Luego deberemos de modificar el evento del bot贸n, para ello ingresamos las siguientes l铆neas de c贸digo correspondientes al evento Add_Click:

  #Defino el evento al hacer el clic
  $Button.Add_Click({$Label.Text = $TextBox.Text})

Con estos ejemplos tenemos muchas posibilidades y cosas para poder probar.

En pr贸ximos post vamos a ver mas objetos que podemos agregar a nuestros formularios.

Happy scripting!

Comments