Вы находитесь на странице: 1из 19

3.

Programacin por Eventos.


3.1. Evento.

Se define como la Notificacin de un acontecimiento o requerimiento que se suscita en el sistema o en un objeto.. Ejemplos de acontecimientos: Mover el Mouse, cambiar el tamao de la ventana, llegada de informacin por el puerto serial, tecla oprimida por el usuario, etc. Ejemplos de requerimientos: Arrancar un programa, leer un archivo, cerrar una ventana, etc.

Flujo Accin Evento Mensaje.

Evento

Mensaje

Accin

Un Evento produce el envo de un Mensaje... Si el Mensaje es atrapado, el objeto procesa el Mensaje mediante... - La ejecucin de alguna(s) Accion(es) - El mensaje contina por defecto o puede detenerse

SQLWindows

33

Donde se Envan los Mensajes A la Aplicacin misma A objetos de una Aplicacin


Acciones de Mensaje Ejemplo: Form Window frmMain Contents Pushbutton: pbOK Message Actions !mensajes del pushbutton On SAM_Create Call SalDisableWindow (pbOK) Message Actions !mensajes de la Form Window On SAM_Close ...pregunta al usuario si va salir

Acciones de Aplicacin Ejemplo: Declaraciones Globales ... Application Actions On SAM_AppStartup Call InitGlobals() OnSAM_AppExit Call Cleanup() On SAM_SqlError ...maneja el error...

Quien Enva los Mensajes Windows:


Mensajes dirigidos por evento: Mensajes generados Ejemplos: WM_KEYUP WM_PAINT SAM_Timer

SQLWindows:
Mensajes dirigidos por evento: (anlogo al mensaje Windows? WM_TIMER) Mensajes generados: (desde Windows WM_LBUTTONDOWN y WM_LBUTTONUP)

SAM_Click

Los eventos son identificados por una constante numrica (Nmero Hexadecimal: 1 a 0xFFFF). Microsoft defini todos los mensajes que las aplicaciones pueden recibir en ambiente Windows, listndolos y asignando un nmero nico a cada uno de ellos. Algunos valores estn descritos a continuacin:
SQLWindows 34

/* Mouse input messages */ #define WM_MOUSEMOVE #define WM_LBUTTONDOWN #define WM_LBUTTONUP #define WM_LBUTTONDBLCLK #define WM_RBUTTONDOWN #define WM_RBUTTONUP #define WM_RBUTTONDBLCLK #define WM_MBUTTONDOWN #define WM_MBUTTONUP
Windows Message

0x0200 0x0201 0x0202 0x0203 0x0204 0x0205 0x0206 0x0207 0x0208 0x0209

#define WM_MBUTTONDBLCLK

El valor asignado al mensaje no tiene relevancia, salvo que debe identificar un solo evento, el nico atributo del mensaje de importancia es su significado, por ejemplo WM_MOUSEMOVE es una notificacin de que el usuario movi el ratn, si el valor del mensaje fuera otro nmero 300, 320, 450, no importara porque sigue significando lo mismo. La notificacin de eventos se puede ver claramente en el siguiente diagrama:
Windows Mensaje Aplicacin 1 Aplicacin 2

Mensaje

SQLWindows

35

Windows monitorea los diferentes dispositivos y en el momento de recibir una notificacin decide a quien corresponde y le enva el mensaje correspondiente. Debido a que en general las aplicaciones necesitan de mensajes extra para realizar su tarea, Microsoft defini una constante a partir de la cual se pueden colocar mensajes propios, esta constante se llama WM_USER, y los mensajes propios de la aplicacin pueden definirse como sigue: #define MI_MENSAJE_1 #define MI_MENSAJE_2 . #define MI_MENSAJE_n WM_USER + n WM_USER + 1 WM_USER + 2

De igual forma SQLWindows tiene una nmero de mensajes predefinidos identificados con el prefijo SAM (SQLWindows Aplication Message), este conjunto de mensajes no es tan vasto como el de Windows y solo se usa para objetos dentro de SQLWindows, el flujo es como sigue:

Windows Mensaje Windows Aplicacin 1 SQLWindow s Mensaje SAM Ventana 2

Mensaje Windows Aplicacin 2

Mensaje SAM Ventana 1

SQLWindows

36

Los mensajes de Windows son diferentes de los mensajes de SAM y en general no se pueden utilizar en forma indistinta. Algunos mensajes de SQLWindows son: SAM_Create 0x1001

Se refiere por un objeto cuando este se crea en la memoria pero antes de que sea visible. SAM_Click 0x2006

Lo reciben algunos objetos (Push button, Combo Box, Picture, etc.) cuando el usuario coloca el cursor en el objeto y presiona y suelta el botn derecho izquierdo del Mouse.

SAM_SetFocus

0x0209

Lo reciben los objetos cuando el Focus es colocado en ellos.

3.2. Mensajes definidos de Usuarios.


El programador puede agregar mensajes de usuario a partir del nmero SAM_User. Los mensajes definidos por el usuario se registran generalmente con las siglas PAM (Programmer Aplication Message), los mensajes definidos por el usuario se registran como constantes en la seccin Global Declarations.

SQLWindows

37

Que hace un objeto cuando recibe un mensaje ? El mensaje es enviado al objeto que afecta, el control del programa va a la seccin de atencin de mensajes (Message Actions) del objeto y busca la clusula On que corresponde al mensaje.

SQLWindows

38

Algunos mensajes no son recibidos por todos los objetos: por ejemplo un Data Field no recibe el mensaje SAM_Click, un Push Button no recibe un SAM_AnyEdit. Ejemplos de algunos mensajes: Form Window SAM_Create SAM_CreateComplete Data Field SAM_AnyEdit SAM_Validate

SQLWindows

39

Existen ciertos eventos que afectan a toda la aplicacin y no a la ventana en especifico, el cdigo para atenderlos se coloca en la seccin Application Actions dentro de Global Declarations.

Algunos de ellos: SAM_AppStartup Es el primer evento que ocurre, este mensaje lo recibe la aplicacin al momento de ejecutarse y SAM_AppExit SAM_SqlError antes de crear cualquier ventana. Este evento se recibe cuando todas las ventanas de la aplicacin han sido cerradas. Este mensaje se recibe cuando una funcin de SQLWindows regresa FALSE indicando que fallo su ejecucin.
SQLWindows 40

Notas: Los objetos que se emplean para la captura de informacin pueden manipularse como variables, como el Data Field. Algunos mensajes se reciben por la ventana padre y despus por los hijos, el mensaje SAM_Create por ejemplo.

Quien envia los Mensages ? Mensajes definidos por Usuarios enviados va funciones SQLWindows
Funcin SalPostMsg() Descripcin Agrega un mensaje a la cola de mensajes para un objeto de window. La transmisin del mensaje es asincrnica. Enva un mensaje inmediatamente y su transmisin es sincrnica. Enva un mensaje inmediatamente a los hijos de una ventana padre Nombre Nom msje. Info. adicional
41

SalSendMsg() SalSendMsgToChildren()

SQLWindows

Descripcin: SalxxxMsg(Objeto, Ejemplos de Evento y Mensaje Evento Inicio de aplicacin Creacin box de revisin Click del botn Escribir caracter en campo Elegir una ventana Form Salir de la aplicacin Un error SQL Creacin de ventana Form Ejemplo de Acciones Evento Inicio de aplicacin Creacin box de chequeo Click de un botn Escribir caracter en campo Cerrar una ventana Form Salir de aplicacin Error de SQL Creacin de ventana Form

Mensaje,

Nmero, Nmero )

Mensaje SAM_AppStartup SAM_Create SAM_Click SAM_AnyEdit SAM_Close SAM_AppExit SAM_SqlError PM_Init

(NOTA: SAM_* = MSJE. SqlWindows; PM_Init = Msje.defin.usuario)

Accin Conctese a base de datos Inhabilite seleccin Asigne valor al campo de datos Habilite botn de llamada Indique fn de aplicacin Desconctese de la base Despliegue error a usuario Inicialice objetos hijos

SQLWindows

42

Ejercicio. Considere la interfaz mostrada en la imagen siguiente.

El Propsito de esta aplicacin es sencillo, cuando el usuario presione el botn sumar se suma uno al valor desplegado en el Data Filed.

Primera versin del programa. Qu hace el programa?

EL programa inicializa el Data Field con cero (0) cuando la ventana se crea, es decir cuando la ventana recibe el mensaje SAM_Create.

SQLWindows

43

El programa suma 1 al Data Field cuando el usuario hace Click en el botn, es decir cuando el Push Botn recibe el mensaje SAM_Click.

Notas adicionales:

Los objetos que se emplean para la captura de informacin Algunos mensajes se reciben por la ventana padre y despus por

pueden manipularse como variables, como el Data Field.

los hijos, el mensaje SAM_Create por ejemplo.

Cree la interface del programa para el contador de la siguiente forma:


1. 2.

Cree una forma nueva desde el Customizar o del Tool Box. Configrela para que no tenga accesorios (si es que tiene), entonces haciendo click derecho sobre la forma aparecer el Customizer o Asistente, la propiedad de Object Name pngala como frmMain (Va de acuerdo a la nomenclatura vista), y la propiedad de Accessories = No, al igual que pngale ttulo a su forma en la propiedad de Object Title.

3. 4. 5.

Ahora implemente el men de File con una nica opcin que sea Salir. A continuacin agregue el Background Text para Contador. Coloque y configure para el tipo de dato numrico el DataField, al igual de ponerle su respectivo identificador (dfContador). Ahora deber insertar el Push Button de sumar (pbSumar) y configurar sus propiedades de nombre y tamao.

6.

7. Programe ahora el cdigo ya visto para que la aplicacin funcione correctamente.

Agregue clusulas On SAM_Create para cada objeto y en cada una de ellas inicialice el valor del Data Field Que valor prevalece?
SQLWindows 44

3.3. Principios de OOP (Programacin Orientada a Objetos)


Cada objeto en SQLWindows tiene una seccin de descripcin.
SQLWindows 45

Aunque la primera versin del programa contador funciona (y funciona bien), el cdigo no sigue los principios de OOP recomendados a continuacin: Encapsulamiento: Cada objeto debe ser responsable de sus propios datos, un objeto por lo tanto no debe Comunicacin por mensajes: manipular los datos de otro objeto. Para lograr su propsito los objetos deben comunicarse utilizando mensajes.

El encapsulamiento permite crear entes independientes, las cuales pueden volverse a utilizar, al hacer que un objeto sea el nico que modifique su valor, tambin se agiliza la labor de depuracin pues no es necesario rastrear todo el programa para encontrar la causa del problema. El encapsulamiento de datos obliga que los objetos se comuniquen entre s, valo de tal forma: en una sala de cine el operador es el nico de montar el film, cuando el gerente quiere cambiar la pelcula no lo hace directamente, sino que le enva una notificacin al operador para que lo haga.

Ya que el Data Field debe ser el nico que inicialice y modifique el valor, es necesario que el botn enve un mensaje para indicarle que debe hacer la suma. Primero se debe declarar el mensaje de usuario.

SQLWindows

46

Para enviar un mensaje se utiliza la funcin: SalSendMsg( hWndVentana, nMensaje, wParam, Iparam ) En donde:

hWndVentana Es el identificador del objeto al que se enva el mensaje. nMensaje wParam lparam El identificador del mensaje. Primer parmetro del mensaje (2 Bytes, sin signo) Segundo parmetro del mensaje (4 Bytes, con signo)

Segunda versin del programa (versin optimizada). En este segundo programa, el Data Field es el nico que modifica el valor.

SQLWindows

47

Trate de implementar el programa contar/decrementar utilizando un solo mensaje.

Ejercicio: 1. Modifique el programa del contador para incluir otro botn. 2. En este caso el botn indicar que contador se decremente. En la seccin de constans en User de Global Declarations declare el siguiente mensaje:
48

SQLWindows

Number: PAM_Decrementa = SAM_User + 2


3.

Agregue el nuevo Push button y configrelo seleccionando el botn con el cursor y haciendo click derecho aparecer el Customizer, en Object Name ponga pbRestar.

4.

Agregue el siguiente cdigo en el Datafield:

Evaluacin:
1. Un ________________________ se identifica con un cdigo ya establecido. 2. Los mensajes ___________ son mensajes definidos en SQLWindows, mientras los mensajes ____________ son mensajes que el programador define para las operaciones de la aplicacin.
3.

El

programador

define

sus

propios

mensajes

en

la

seccin

_______________________.

SQLWindows

49

4. Los mensajes definidos por el programador pueden tener asignado el mismo valor numrico. Cierto 5. Los
6.

Falso mensajes en la seccin

objetos

atienden

los

______________________. Los mensajes son enviados a todos los objetos de una ventana sin importar su tipo. Cierto desplegada. Cierto
8.

Falso

7. El mensaje SAM_AppStartup lo recibe una ventana antes de ser Falso

Los objetos que se utilizan para capturar datos pueden usarse como ______________________ en el cdigo del programa.

9. A la caracterstica de que cada objeto es responsable de sus propios actos se le denomina ________________________________. 10. 11. Un objeto enva un mensaje a otro utilizando la funcin Cuando se necesita enviar datos referentes al evento se pueden ______________________________________. utilizar parmetros _________________ y ___________________.

3. PROGRAMACIN POR EVENTOS..................................................................33


3.1. Evento...........................................................................................................................................................33 3.2. Mensajes definidos de Usuarios..............................................................................................................37 3.3. Principios de OOP (Programacin Orientada a Objetos)..................................................................45

SQLWindows

50

SQLWindows

51