LeXicoEl poder de los simple

  

Ejemplos de aplicaciones dirigidas por eventos

(Un evento es un suceso que ocurre y para su atención se programa un método que controle las acciones necesarias según el tipo de evento. A diferencia de la programación secuencial, no se sabe cual será el orden de aparición de los eventos)

El programa más pequeño

Se presenta la estructura mínima de un programa dirigido por eventos. La ventana tiene incorporada la funcionalidad clásica por haberla heredado (derivada_de) de la clase Form. Por ello puede ampliarse, minimizarse...

/* ventanaLexico00.lx */

clase ventana derivada_de "System.Windows.Forms.Form"
{
publicos:
mensajes:
ventana nop	/*nop ::= No hay OPeraciones explícitas */
}

Caption o título de la ventana

En éste caso hay una operación explícita en el constructor de la ventana: se modifica el atributo Text para que salga un título.

/* ventanaLexico01.lx */

clase ventana derivada_de "System.Windows.Forms.Form"
{
publicos:
mensajes:
ventana copie " Mi segunda ventana" en ventana.Text
}

Controlador para el evento pintura (Paint)

La zona interior de la ventana (área del usuario) permite efectuar actividades pictóricas tales como pintar figuras geométricas, pintar imágenes y generar efectos gráficos. Cada vez que Windows descubre que hay que repintar la ventana, por ejemplo cuando se crea la ventana, cuando quitan otra ventana que la cubría o cuando varían su tamaño, pinta el marco si está establecido y envía un mensaje a la aplicación para que ella pinte lo necesario en el área del usuario. Por lo anterior es necesario programar el controlador de pintura e inscribirlo como un manejador para que Windows "sepa a quien llamar" y éste realice las actividades necesarias.

/* ventanaLexico02.lx */

clase ventana derivada_de "System.Windows.Forms.Form"
{
publicos:
mensajes:
mi_controlador_de_pintura(entra objeto_enviador, entra chismoso es_un "System.Windows.Forms.PaintEventArgs")
	{
	el objeto graficador es un "System.Drawing.Graphics" no_crear
	copie chismoso.Graphics en graficador

        /* Aquí se programan las acciones pictóricas necesarias */
	}

ventana 
	{
	copie " Mi segunda ventana" en ventana.Text
	ventana.manejador(sale "ventana.Paint", sale "mi_controlador_de_pintura")
	}
}

Pintar una línea roja de grosor 3

Se crea un objeto de la clase Color y con él se crear un lápiz (de la clase Pen). Se le envía el mensaje apropiado (en éste caso que dibuje una línea DrawLine) al objeto graficador (que es de la clase Graphics). Observe que en el objeto chismoso (que es de la clase PaintEventArgs) se recibe la información que envía Windows sobre el estado de la ventana en ese momento pues él lo sabe y el programador no.

/* ventanaLexico03.lx */

clase ventana derivada_de "System.Windows.Forms.Form"
{
publicos:
mensajes:
mi_controlador_de_pintura(entra objeto_enviador, entra chismoso es_un "System.Windows.Forms.PaintEventArgs")
	{
	el objeto graficador es un "System.Drawing.Graphics" no_crear
	copie chismoso.Graphics en graficador
	el objeto color es un "System.Drawing.Color"
	el objeto lápiz es un "System.Drawing.Pen"(sale color.Red, sale 3)
	graficador.DrawLine(sale lápiz, sale 0, sale 0, sale 100, sale 100)
	}

ventana 
	{
	copie " Mi cuarta ventana (con control para el evento pintura)" en ventana.Text
	ventana.manejador(sale "ventana.Paint", sale "mi_controlador_de_pintura")
	}
}

Cómo escribir en el área del usuario ?

Para escribir texto en el área del usuario construya un color y con él construya un pincel. También construya un tipo de letra. Ordene al graficador dibujar el chorro de caracteres (DrawString) usando el tipo de letra y pincel que desee. En el ejemplo se dibuja dos veces para dar un efecto de sombra.

clase DibujarTexto derivada_de "System.Windows.Forms.Form"

publicos
  el objeto g es un "System.Drawing.Graphics" no_crear
  el objeto color es un "System.Drawing.Color"
  el objeto pincel es un "System.Drawing.SolidBrush"(sale color.Blue)
  el objeto pincel2 es un "System.Drawing.SolidBrush"(sale color.White)
  el objeto tipo_de_letra es un "System.Drawing.Font"(sale "Verdana", sale 20)

mensajes:

pinte(entra Q, entra CH es un "System.Windows.Forms.PaintEventArgs")
       {
       copie CH.Graphics en g

       g.DrawString( sale "Hola Sócrates", sale tipo_de_letra, sale pincel, sale 22, sale 62 )
       g.DrawString( sale "Hola Sócrates", sale tipo_de_letra, sale pincel2, sale 20, sale 60 )
       }

DibujarTexto DibujarTexto.manejador(sale "DibujarTexto.Paint", sale "pinte")


Pintura de una imagen completa y parte de ella

Muchas veces es útil mostrar una parte de una imagen tal como al hacer un sprite animado. Para ello debe crearse un rectángulo (sector) y utilizarlo en el mensaje DrawImage enviado al graficador (g). También debe indicar allí que las unidades (unidad) son Pixel mediante un objeto tipo GraphicsUnit: (Si desea correr éste programa recuerde tener una imagen llamada GATICO.JPG en el mismo directorio donde se encuentre el fuente .lx)

/*Demo50_Sector_Bitmap.lx*/ 

clase ventana derivada_de "System.Windows.Forms.Form" 

publicos 

el objeto imagen es un "System.Drawing.Bitmap"(sale "GATICO.JPG") 
el objeto sector es un "System.Drawing.Rectangle"(sale 20, sale 20, sale 30, sale 30) 
el objeto unidad es un "System.Drawing.GraphicsUnit" 

mensajes 

pintura (entra Enviador, entra él es_un "System.Windows.Forms.PaintEventArgs") 
{ 
el objeto g es un "System.Drawing.Graphics" no_crear 
copie él.Graphics en g 

g.DrawImage(sale imagen, sale 100, sale 100) /*Este mensaje la muestra completa*/ 
g.DrawImage(sale imagen, sale 0, sale 0, sale sector, sale unidad.Pixel) 
} 

ventana ventana.manejador(sale "ventana.Paint", sale "pintura")


Controlador del evento tecla pulsada (KeyDown)

Se programa un comportamiento (mi_controlador_de_teclado) para manejar la lógica de lo que se necesita hacer cuando pulsen una tecla y se le inscribe como un manejador para que windows "sepa" cual método llamar ante la apareción del evento. Observe que chismoso esta vez es del tipo KeyEventArgs para recibir de Windows la información apropiada (Argumentos de un evento de tecla pulsada). Éste en su atributo KeyCode tiene el código de la tecla. Se ha construido un objeto del tipo Keys para aprovechar los nombres que él conoce y evitar tener que usar los números equivalentes logrando con ello un código más legible.

/* ventanaLexico04.lx */

clase ventana derivada_de "System.Windows.Forms.Form"
{
publicos:
mensajes:

mi_controlador_de_teclado(entra objeto_enviador, entra chismoso es_un "System.Windows.Forms.KeyEventArgs")
               {
               el objeto tecla_tipo es una "System.Windows.Forms.Keys"
               es chismoso.KeyCode=tecla_tipo.A ? si: muestre "Pulsada la tecla A"
               es chismoso.KeyCode=tecla_tipo.B ? si: muestre "Pulsada la tecla B"
               es chismoso.KeyCode=tecla_tipo.D1 ? si: muestre "Pulsada la tecla 1"
               es chismoso.KeyCode=tecla_tipo.D2 ? si: muestre "Pulsada la tecla 2"
               es chismoso.KeyCode=tecla_tipo.Escape ? si: { muestre "Pulsada la tecla Esc"       ventana.Close }
               }

ventana 
	{
	copie " Mi quinta ventana (con control del teclado para eventos a, b, 1, 2 y Esc)" en ventana.Text
	ventana.manejador(sale "ventana.KeyDown", sale "mi_controlador_de_teclado")
	}
}

Control del evento clik con el mouse (MouseDown)

Se programa un método para controlar las acciones a realizar ante la aparición de un evento tipo MouseDown y se inscribe como un manejador. El segundo parámetro (ésta vez del tipo MouseEventArgs o argumentos de un evento del mouse) recibe de Windows en su atributo Button el código del botón usado en el click. Se ha creado un objeto tipo MouseButons para usar los nombres de los botones que él sabe en vez de los códigos numéricos y lograr más legibilidad.

/* ventanaLexico05.lx */

clase ventana derivada_de "System.Windows.Forms.Form"
{
publicos:
mensajes:

mi_controlador_de_raton(entra objeto_enviador, entra chismoso es_un "System.Windows.Forms.MouseEventArgs")
               {
               el objeto boton_tipo es una "System.Windows.Forms.MouseButtons"
               es chismoso.Button=boton_tipo.Left ? si: muestre "Pulsado el botón izquierdo"
               es chismoso.Button=boton_tipo.Right ? si: muestre "Pulsadael botón derecho"
               es chismoso.Button=boton_tipo.Middle ? si: muestre "Pulsada el botón central"
               }

ventana 
	{
	copie " Mi sexta ventana (con control del evento boton pulsado del ratón)" en ventana.Text
	ventana.manejador(sale "ventana.MouseDown", sale "mi_controlador_de_raton")
	}
}

Control para un temporizador (Timer)

Un temporizador permite crear alertas por medio de la generación de eventos tipo Tick. Cuando se genere el evento Windows activará el método programado para controlar las acciones necesarias (en éste caso mi_controlador_de_temporizador) si éste ha sido inscrito como un manejador. El temporizador entiende los mensajes Start (para iniciarlo), Stop (para detenerlo) y permite acceder al atributo Interval (para conocer o establecer el período para las alertas).

/* ventanaLexico06.lx */

clase ventana derivada_de "System.Windows.Forms.Form"
{
publicos:
el objeto temporizador es un "System.Windows.Forms.Timer"
mensajes:

mi_controlador_de_temporizador(entra objeto_enviador, entra chismoso es_un "System.EventArgs")
               {
                muestre "Ya fuí avisado por el temporizador"
                temporizador.Stop
                ventana.Close
               }

ventana 
	{
	copie " Mi séptima ventana (con control de un evento temporizador)" en ventana.Text
	ventana.manejador(sale "temporizador.Tick", sale "mi_controlador_de_temporizador")
                copie 5000 en temporizador.Interval
                temporizador.Start
	}
}

Movimiento horizontal automático o animación de un rectángulo

Se crea un temporizador para que alerte cada vez (no se apaga). Cuando se genere el evento Tick Windows activará el método, en éste caso mi_controlador_de_temporizador, programado para controlar las acciones necesarias (modificar la x y obligar a la ventana a repintarse). En el constructor de la ventana se inicia el temporizador enviándole el mensaje Start y el valor del atributo x copiándole el valor 0. La sección de pintura pinta un rectángulo utilizando la variable x y cada vez que la invoquen contendrá un valor diferente.

/* ventanaLexico07.lx */

clase ventana derivada_de "System.Windows.Forms.Form"
{
publicos:
el objeto temporizador es un "System.Windows.Forms.Timer"
el objeto x es una cantidad
mensajes:

mi_controlador_de_temporizador(entra objeto_enviador, entra chismoso es_un "System.EventArgs")
               {
                copie x + 1 en x
                ventana.Refresh
               }

mi_controlador_de_pintura(entra objeto_enviador, entra chismoso es_un "System.Windows.Forms.PaintEventArgs")
               {
                el objeto g es un "System.Drawing.Graphics" no_crear
                copie chismoso.Graphics en g
                el objeto color es un "System.Drawing.Color"
                el objeto crayola es un "System.Drawing.Pen"(sale color.Gray, sale 2)

                g.DrawRectangle(sale crayola, sale x, sale 10, sale 40, sale 20)
               }

ventana 
	{
	copie " Mi séptima ventana (con control de un evento temporizador)" en ventana.Text
	ventana.manejador(sale "temporizador.Tick", sale "mi_controlador_de_temporizador")
	ventana.manejador(sale "ventana.Paint", sale "mi_controlador_de_pintura")
        copie 5000 en temporizador.Interval
        temporizador.Start
        copie 0 en x
	}
}

Una mejora al movimiento horizontal automático o animación de un rectángulo

En un programa muchas veces se crean y destruyen objetos que no van a cambiar dentro de un método que se invoca reiteradamente produciendo una sobrecarga de trabajo innecesaria para la máquina tal como sucede en el ejemplo anterior con los objetos g, color y crayola. Aquí se han ubicado sus definiciones como atributos de la clase para que ocurra una sola vez.

/* ventanaLexico08.lx */

clase ventana derivada_de "System.Windows.Forms.Form"
{
publicos:
el objeto temporizador es un "System.Windows.Forms.Timer"
el objeto x es una cantidad
                el objeto g es un "System.Drawing.Graphics" no_crear
                el objeto color es un "System.Drawing.Color"
                el objeto crayola es un "System.Drawing.Pen"(sale color.Blue, sale 2)

mensajes:

mi_controlador_de_temporizador(entra objeto_enviador, entra chismoso es_un "System.EventArgs")
               {
                copie x + 1 en x
                ventana.Refresh
               }

mi_controlador_de_pintura(entra objeto_enviador, entra chismoso es_un "System.Windows.Forms.PaintEventArgs")
               {
                copie chismoso.Graphics en g

                g.DrawRectangle(sale crayola, sale x, sale 10, sale 40, sale 20)
               }

ventana 
	{
	copie " Mi séptima ventana (con control de un evento temporizador)" en ventana.Text
	ventana.manejador(sale "temporizador.Tick", sale "mi_controlador_de_temporizador")
	ventana.manejador(sale "ventana.Paint", sale "mi_controlador_de_pintura")
                copie 5000 en temporizador.Interval
                temporizador.Start
                copie 0 en x
	}
}

Movimiento oscilatorio, horizontal y automático

Se hace desplazar un rectángulo horizontalmente con retornos automáticos. Obsérvese en el controlador para el temporizador que se controla tanto el sentido del movimiento como la llegada a los extremos del recorrido.

/* ventanaLexico09.lx */

clase ventana derivada_de "System.Windows.Forms.Form"
{
publicos:
el objeto temporizador es un "System.Windows.Forms.Timer"
los objetos x, ancho_del_recorrido son cantidades
el objeto sentido son caracteres
                el objeto g es un "System.Drawing.Graphics" no_crear
                el objeto color es un "System.Drawing.Color"
                el objeto crayola es un "System.Drawing.Pen"(sale color.Green, sale 2)

mensajes:

mi_controlador_de_temporizador(entra objeto_enviador, entra chismoso es_un "System.EventArgs")
               {
                es sentido="derecho" ? si: es x<ancho_del_recorrido ? si: copie x + 1 en x
                                                                      no:copie "izquierdo" en sentido
                                       no: es x>0 ? si: copie x-1 en x
                                                    no:copie "derecho" en sentido
                ventana.Refresh
               }

mi_controlador_de_pintura(entra objeto_enviador, entra chismoso es_un "System.Windows.Forms.PaintEventArgs")
               {
                copie chismoso.Graphics en g

                g.DrawRectangle(sale crayola, sale x, sale 10, sale 40, sale 20)
               }

ventana 
	{
	copie " Mi séptima ventana (con control de un evento temporizador)" en ventana.Text
	ventana.manejador(sale "temporizador.Tick", sale "mi_controlador_de_temporizador")
	ventana.manejador(sale "ventana.Paint", sale "mi_controlador_de_pintura")
                copie 5000 en temporizador.Interval
                temporizador.Start
                copie 0 en x
                copie 80 en ancho_del_recorrido
                copie "derecho" en sentido
	}
}

Aquí próximamente se colocarán más ejemplos de programación con el lenguaje Lexico (Mayo.4.2005)
También puede encontrar ejemplos en:

Artículos

Programas de ejemplo

Trabajos de estudiantes

También se presentan ejemplos en los foros

 
Todos los derechos reservados :: Powered by Riosur :: Diseñado por EnDeT