versión 11.2 (Modificado)
Form event Numérico
Parámetro | Tipo | Descripción | ||||
Este comando no necesita parámetros | ||||||
Resultado | Numérico | Número del evento de formulario |
Descripción
Form event devuelve un valor numérico que identifica el tipo de evento de formulario que acaba de ocurrir. Generalmente, Form event se utiliza en un método de formulario o en un método de objeto.
4D ofrece constantes predefinidas (ubicadas en el tema "Eventos de formulario") para comparar los valores devueltos por el comando Form event.
Ciertos eventos son genéricos (generados por todo tipo de objeto) y otros son específicos a un tipo de objeto particular.
Eventos genéricos
Los siguientes eventos pueden ser generados por todo formulario u objeto:
Constante | Valor | Descripción |
On Load | 1 | El formulario se visualiza o se imprime |
On Unload | 24 | El formulario se cierra y se descarga |
On Validate | 3 | La entrada de datos al registro ha sido validada |
On Clicked | 4 | Ocurrió un clic sobre un objeto |
On Double Clicked | 13 | Ocurrió un doble clic sobre un objeto |
On Before Keystroke | 17 | Un carácter va a ser introducido en el objeto que tiene el foco |
Get edited text devuelve el texto del objeto sin este carácter | ||
On After Keystroke | 28 | Un carácter acaba de ser introducido en el objeto que tiene el foco |
Get edited text devuelve el texto del objeto incluyendo este carácter | ||
On After Edit | 45 | El contenido del objeto editable que tiene el foco acaba de ser |
modificado | ||
On Getting Focus | 15 | Un objeto de formulario toma el foco |
On Losing Focus | 14 | Un objeto de formulario pierde el foco |
On Activate | 11 | La ventana del formulario pasa al primer plano |
On Deactivate | 12 | La ventana del formulario pasa a un segundo plano |
On Outside Call | 10 | El formulario recibe una llamada del comando CALL PROCESS |
On Drop | 16 | Se han soltado datos en un objeto |
On Drag Over | 21 | Los datos pueden soltarse en un objeto |
On Begin Drag Over | 46 | Un objeto está siendo arrastrado |
On Mouse Enter | 35 | El cursor del ratón entra en el área gráfica de un objeto |
On Mouse Move | 37 | El cursor del ratón se mueve (por lo menos un pixel) en el área |
gráfica de un objeto | ||
On Mouse Leave | 36 | El cursor del ratón sale del área gráfica de un objeto |
On Menu Selected | 18 | Un comando de menú ha sido seleccionado |
On Data Change | 20 | Los datos de un objeto han sido modificados |
On Plug in Area | 19 | Un objeto externo solicita que su método de objeto se ejecute |
On Header | 5 | El área de encabezado del formulario va a imprimirse o visualizarse |
On Printing Detail | 23 | El cuerpo del formulario va a imprimirse |
On Printing Break | 6 | Un área de ruptura del formulario va a imprimirse |
On Printing Footer | 7 | El área de pie de página del formulario va a imprimirse |
On Close Box | 22 | Se ha hecho clic en la caja de cierre de la ventana |
On Display Detail | 8 | Se va a mostrar un registro en una lista |
On Open Detail | 25 | Se hace doble clic en un registro y pasa al formulario de entrada |
On Close Detail | 26 | El formulario de entrada se cierra y vuelve al formulario de salida |
On Selection Change | 31 | List box: la selección actual de filas o columnas se modifica |
Registros en lista: el registro actual o la selección actual de filas | ||
se modifica en un formulario listado o en un subformulario | ||
Lista jerárquica: la selección en la lista se modifica después de un | ||
clic o de presionar una tecla | ||
On Load Record | 40 | Durante la entrada en lista, un registro se carga en modificación |
(el usuario hace clic en una línea del registro y el campo pasa a | ||
modo edición) | ||
On Timer | 27 | El número de tics definido por el comando SET TIMER ha pasado |
On Resize | 29 | La ventana del formulario es redimensionada |
List box
Los siguientes eventos se generan únicamente para los objetos de tipo List box:
Constante | Valor | Descripción |
On Before Data Entry | 41 | Una celda de list box está a punto de pasar a modo edición |
On Column Moved | 32 | El usuario mueve una columna de list box vía arrastrar y soltar |
On Row Moved | 34 | El usuario mueve una fila de list box vía arrastrar y soltar |
On Column Resize | 33 | El ancho de una columna de list box se modifica |
On Header Click | 42 | Ocurre un clic en el encabezado de una columna de list box |
On After Sort | 30 | Se ha efectuado un ordenamiento estándar en una columna de list box |
Botones 3D
Los siguientes eventos sólo son generados por botones de tipo 3D:
Constante | Valor | Descripción |
On Long Click | 39 | Un botón 3D recibe un clic y el botón del ratón permanece |
presionado por un cierto periodo de tiempo | ||
On Arrow Click | 38 | El área "flecha" de un botón 3D recibe un clic |
Listas jerárquicas
Los siguientes eventos sólo son generados por listas jerárquicas:
Constante | Valor | Descripción |
On Expand | 43 | Un elemento de lista jerárquica ha sido desplegado utilizando |
haciendo clic o presionando una tecla | ||
On Collapse | 44 | Un elemento de la lista jerárquica ha sido contraído haciendo clic o |
presionando una tecla |
Nota: Los eventos específicos de formularios de salida no pueden utilizarse en formularios proyecto. Estos son: On Display Detail, On Open Detail, On Close Detail, On Load Record, On Header, On Printing Detail, On Printing Break, On Printing Footer.
Eventos y métodos
Cuando ocurre un evento de formulario, 4D efectúa las siguientes acciones:
Primero, examina los objetos del formulario y llama al método de objeto para todos los objetos (involucrados en el evento) cuya propiedad de evento de objeto correspondiente ha sido seleccionada.
Segundo, llama al método de formulario si la propiedad de evento de formulario correspondiente ha sido seleccionada.
No asuma que los métodos de objeto, si los hay, serán llamados en un orden particular. La regla es que los métodos de objeto siempre son llamados antes que los métodos de formulario. Si un objeto es un subformulario, se llama primero a los métodos de objeto del formulario de salida del subformulario, luego el método de formulario del formulario de salida. 4D luego continúa llamando a los métodos del formulario padre. En otras palabras, cuando un objeto está en un subformulario, 4D utiliza la misma regla que para los métodos de objeto y formulario en subformularios.
Excepto para los eventos On Load y On Unload, si la propiedad de evento de formulario no está seleccionada para un evento dado, esto no evita las llamadas a los métodos de objeto para los objetos cuya propiedad de evento está seleccionada. Es decir, la activación o desactivación de un evento a nivel del formulario no tiene efecto en las propiedades del evento de los objetos.
El número de objetos involucrados en un evento depende de la naturaleza del evento:
Evento On Load - Los métodos de objeto de todos los objetos del formulario (de todas las páginas) que tengan seleccionada la propiedad de evento On Load serán llamados. Luego, si la propiedad de evento de formulario On Load está seleccionada, el método de formulario será llamado.
Eventos On Activate o On Resize - Ningún método de objeto será llamado, porque este evento aplica al formulario como un todo y no como un objeto en particular. Por lo tanto, si el evento de formulario On Activate está seleccionado, sólo se llamará al método de formulario.
Evento On Timer - Este evento es generado únicamente si el método de formulario contiene una llamada previa al comando SET TIMER. Si la propiedad de evento de formulario On Timer está seleccionada, sólo el método de formulario recibirá el evento, no se llamará al método de formulario.
Evento On Drag Over - Sólo el método del objeto soltable involucrado en el evento será llamado (si la propiedad de evento "Soltable" está seleccionada para el objeto. El método de formulario no será llamado.
Por el contrario, para el evento On Begin Drag over, el método del objeto o el método del formulario del objeto arrastrado será llamado (Si la propiedad de evento "Arrastrable" está seleccionada para el objeto.
Advertencia: A diferencia de otros eventos, durante un evento On Begin Drag over o On Drag over el método llamado se ejecuta en el contexto del proceso de arrastrar y soltar del objeto fuente, no en el del proceso de arrastrar y soltar el objeto de destino. Para mayor información, consulte la sección Arrastrar y soltar.
Si los eventos On Mouse Enter, On Mouse Move y On Mouse Leave han sido seleccionados para el formulario, son generados para cada objeto del formulario. Si están seleccionados para un objeto, son generados sólo para el objeto. En caso de superposición de objetos, el evento se genera por el primer objeto capaz de administrarlo que se encuentre del nivel superior al inferior. Los objetos que se hicieron invisibles utilizando el comando SET VISIBLE no generan estos eventos. Durante la entrada de datos, otros objetos pueden recibir este tipo de eventos dependiendo de la posición del ratón.
Registros en lista: La secuencia de llamadas a métodos y eventos de formularios en formularios listados visualizados a través de MODIFY SELECTION / DISPLAY SELECTION y los subformularios es la siguiente:
Para cada objeto del área de encabezado: Método de objeto con evento On Header Método de formulario con evento On Header Para cada registro: Para cada objeto en el área de detalle: Método de objeto con evento On Display Detail Método de formulario con evento On Display Detail
Llamar un comando 4D que muestre una caja de diálogo desde los eventos On Display Detail y On Header no es permitido y provoca un error de sintaxis.
Más particularmente, los comandos relacionados son: ALERT, DIALOG, CONFIRM, Request, ADD RECORD, MODIFY RECORD, DISPLAY SELECTION y MODIFY SELECTION.
La siguiente tabla resume cómo se llaman los métodos de formulario y objetos para cada tipo de evento:
Evento | Métodos | Método | Qué |
de objeto | de formulario | objetos | |
On Load | Sí | Sí | Todos |
On Unload | Sí | Sí | Todos |
On Validate | Sí | Sí | Todos |
On Clicked | Sí (si cliqueable) (*) | Sí | Sólo el objeto implicado |
On Double Clicked | Sí (si cliqueable) (*) | Sí | Sólo el objeto implicado |
On Before Keystroke | Sí (si editable) (*) | Sí | Sólo el objeto implicado |
On After Keystroke | Sí (si editable) (*) | Sí | Sólo el objeto implicado |
On After Edit | Sí (si editable) (*) | Sí | Sólo el objeto implicado |
On Getting Focus | Sí (si tabulable) (*) | Sí | Sólo el objeto implicado |
On Losing Focus | Sí (si tabulable) (*) | Sí | Sólo el objeto implicado |
On Activate | Nunca | Sí | Ninguno |
On Deactivate | Nunca | Sí | Ninguno |
On Outside Call | Nunca | Sí | Ninguno |
On Begin drag over | Sí (si arrastrable) (**) | Sí | Sólo el objeto implicado |
On Drop | Sí (si soltable) (**) | Sí | Sólo el objeto implicado |
On Drag Over | Sí (si soltable) (**) | Nunca | Sólo el objeto implicado |
On Mouse Enter | Sí | Sí | Todos |
On Mouse Move | Sí | Sí | Todos |
On Mouse Leave | Sí | Sí | Todos |
On Menu Selected | Nunca | Sí | Ninguno |
On Data Change | Sí (si modificable) (*) | Sí | Sólo el objeto implicado |
On Plug in Area | Sí | Sí | Sólo el objeto implicado |
On Header | Sí | Sí | Todos |
On Printing Detail | Sí | Sí | Todos |
On Printing Break | Sí | Sí | Todos |
On Printing Footer | Sí | Sí | Todos |
On Close Box | Nunca | Sí | Ninguno |
On Display Detail | Sí | Sí | Todos |
On Open Detail | Nunca | Sí | Ninguno |
On Close Detail | Nunca | Sí | Ninguno |
On Resize | Nunca | Sí | Ninguno |
On Selection Change | Sí (***) | Sí | Sólo el objeto implicado |
On Load Record | Nunca | Sí | Ninguno |
On Timer | Nunca | Sí | Ninguno |
On Before Data Entry | Sí (List box) | Nunca | Sólo el objeto implicado |
On Column Moved | Sí (List box) | Nunca | Sólo el objeto implicado |
On Row Moved | Sí (List box) | Nunca | Sólo el objeto implicado |
On Column Resize | Sí (List box) | Nunca | Sólo el objeto implicado |
On Header Click | Sí (List box) | Nunca | Sólo el objeto implicado |
On After Sort | Sí (List box) | Nunca | Sólo el objeto implicado |
On Long Click | Sí (Botón 3D) | Sí | Sólo el objeto implicado |
On Arrow Click | Sí (Botón 3D) | Sí | Sólo el objeto implicado |
On Expand | Sí (Lista jerárq.) | Nunca | Sólo el objeto implicado |
On Collapse | Sí (Lista jerárq.) | Nunca | Sólo el objeto implicado |
(*) Para mayor información, ver la sección "Eventos, objetos y propiedades" a continuación.
(**) Consulte la sección "Arrastrar y soltar" para mayor información.
(***) Sólo los objetos de tipo list box, lista jerárquica y subformulario soportan este evento.
IMPORTANTE: Siempre tenga en cuenta que, para cualquier evento, el método de un formulario o de un objeto se llama si el evento correspondiente es seleccionado para el formulario u objeto. El beneficio de desactivar eventos en el entorno Diseño (utilizando la Lista de propiedades del editor de formularios) es que usted puede reducir de manera importante el número de llamadas a métodos y por lo tanto optimizar de manera significativa la velocidad de ejecución de sus formularios.
Advertencia: Los eventos On Load y On Unload son generados por objetos si están activados para el objeto y el formulario al cual pertenece el objeto. Si los eventos están activados para el objeto únicamente, no ocurrirán; estos dos eventos también deben ser activados a nivel del formulario.
Eventos, objetos y propiedades
Un método de objeto es llamado si el evento puede realmente ocurrir para el objeto, dependiendo de su naturaleza y propiedades. La siguiente sección detalla los eventos que usted utilizará generalmente para manejar los diferentes tipos de objetos.
Recuerde que la Lista de propiedades del editor de formularios sólo muestra los eventos compatibles con el objeto seleccionado o el formulario.
Objetos cliqueables
Los objetos cliqueables son administrables principalmente con el ratón. Son los siguientes:
Variables o campos editables de tipo Booleano
Botones, botones por defecto, botones de opción, casillas de selección, rejillas de botones
Botones 3D, Botones de opción 3D, Casillas de selección 3D
Menús desplegables, menús jerárquicos desplegables, menús imagen
Listas desplegables, menús
Áreas de desplazamiento, listas jerárquicas, list boxes
Botones invisibles, botones inversos, botones opción imagen
Termómetros, reglas, dials (también conocidos como objetos deslizables)
Pestañas
Separadores.
Cuando el evento On Clicked u On Double Clicked se selecciona para uno de estos objetos, usted puede detectar y administrar los clics en el objeto, utilizando el comando Form event que devuelve On Clicked u On Double Clicked, dependiendo del caso.
Si ambos eventos están seleccionados para un objeto, los eventos On Clicked y On Double Clicked serán generados cuando el usuario haga doble clic en el objeto.
Para todos estos objetos, el evento On Clicked ocurre una vez se libera el botón del ratón. Sin embargo, hay varias excepciones:
Botones invisibles - El evento On Clicked ocurre tan pronto como se hace clic y no espera a que se libere el botón del mouse.
Objetos deslizables (termómetros, reglas, y dials) - Si el formato de salida indica que el método de objeto debe llamarse mientras usted desliza el control, el evento On Clicked ocurre tan pronto como se hace clic.
Nota: Algunos de estos objetos pueden activarse con el teclado. Por ejemplo, una vez que una casilla de selección obtiene el foco, puede seleccionarse utilizando la barra espaciadora. En tal caso, se genera un evento On Clicked.
Advertencia: Los combo boxes no son considerados objetos cliqueables. Un combo box debe ser tratado como un área de texto editable cuya lista desplegable asociada ofrece valores por defecto. Por lo tanto, usted puede manejar entrada de datos en un combo box con la ayuda de los eventos On Before Keystroke, On After Keystroke y On Data Change.
Objetos editables por teclado
Los objetos editables por teclado son objetos en los cuales usted introduce datos utilizando el teclado y para los cuales puede filtrar los datos de entrada al menor nivel detectando los eventos On After Edit, On Before Keystroke y On After Keystroke. Puede aprovechar estos eventos utilizando el comando Get edited text.
Los objetos y tipos de datos editables por teclado incluyen:
Todos los campos editables de tipo alfa, texto, fecha, hora, numérico u (On After Edit únicamente) imagen
Todas las variables editables de tipo alfa, texto, fecha, hora, numérico u (On After Edit only) imagen
Combo boxes
List boxes.
Nota: Aunque son objetos "editables", las listas jerárquicas no manejan los eventos de formulario On After Edit, On Before Keystroke y On After Keystroke (Ver también el párrafo "Listas jerárquicas" a continuación).
On Before Keystroke y On After Keystroke
Nota: A partir de la versión 2004.2 de 4D, el evento On After Keystroke puede generalmente ser reemplazado por el evento On After Edit (ver a continuación).
Una vez los eventos On Before Keystroke y On After Keystroke hayan sido seleccionados para un objeto, puede detectar y administrar las pulsaciones de teclas en el objeto, utilizando el comando Form event que devolverá On Before Keystroke y luego On After Keystroke (para mayor información, consulte la descripción del comando Get edited text). Estos eventos también son activados por comandos de lenguaje que simulan la acción del usuario, tal como POST KEY.
Recuerde que las modificaciones del usuario que no se llevan a cabo utilizando el teclado (pegar, arrastrar-soltar, etc.) no se tienen en cuenta. Para procesar estos eventos, debe utilizar On After Edit.
Nota: Los eventos On Before Keystroke y On After Keystroke no son generados durante la utilización de un método de entrada. Un método de entrada (o IME, Input Method Editor) es un programa o un componente sistema que puede utilizarse para introducir caracteres complejos o símbolos (por ejemplo, japoneses o chinos) utilizando un teclado occidental.
On After Edit
Cuando se utiliza, este evento se genera después de cada cambio realizado al contenido de un objeto editable, sin importar la acción que originó el cambio, es decir:
- Las acciones de edición estándar que modifican el contenido tales como pegar, cortar, borrar o cancelar;
- Soltar un valor (acción similar a pegar);
- Toda entrada de teclado realizada por el usuario; en este caso, el evento On After Edit se genera después de los eventos On Before Keystroke y On After Keystroke, si son utilizados.
- Toda modificación realizada utilizando un comando de lenguaje que estimula una acción de usuario (por ejemplo POST KEY).
Atención, las siguientes acciones NO activan este evento:
- Las acciones de edición que no modifican el contenido del área, como copiar o seleccionar todo;
- Arrastrar un valor (acción similar a copiar);
- Las modificaciones a los contenidos por programación, excepto para los comandos que simulan una acción de usuario.
Este evento puede utilizarse para controlar acciones de usuario con el fin de prevenir que peguen un texto muy largo, bloquear ciertos caracteres o evitar que se corte un campo de contraseña.
Objetos modificables
Los objetos modificables tienen una fuente de datos cuyos valores pueden modificarse utilizando el ratón o el teclado; no son considerados verdaderamente como controles de interfaz de usuario manejados a través del evento On Clicked. Estos objetos son los siguientes:
Todos los campos editables (excepto subtablas y BLOBs)
Todas las variables editables (excepto BLOBs, punteros, y arrays)
Combo boxes
Objetos externos (para los cuales la entrada de datos es aceptada por el plug-in)
Listas jerárquicas
List boxes.
Estos objetos reciben eventos On Data Change. Cuando el evento On Data Change está seleccionado para uno de estos objetos, usted puede detectar y administrar el cambio de los valores de la fuente de datos, utilizando el comando Form event que devolverá On Data Change. El evento es generado tan pronto como la variable asociada con el objeto sea actualizada internamente por 4D (por lo general, cuando el área de entrada del objeto pierde el foco).
Objetos tabulables
Los objetos tabulables obtienen el foco cuando utiliza la tecla Tab para alcanzarlos y/o cuando hace clic en ellos. El objeto que tiene el foco recibe los caracteres (digitados en el teclado) que no son modificadores de un comando de menú o de un objeto tal como un botón.
Todos los objetos son tabulables, EXCEPTO los siguientes:
Variables o campos no editables
Rejillas de botones
Botones 3D, botones opción 3D, casillas de selección 3D
Menús desplegables, menús jerárquicos desplegables
Menús/listas desplegables
Menús imagen
Áreas de desplazamiento
Botones invisibles, botones inversos, botones opción imágenes
Gráficos
Objetos externos (para los cuales la entrada de datos es aceptada por el plug-in 4D)
Pestañas
Separadores.
Cuando los eventos On Getting Focus y/o On losing Focus son seleccionados para un objeto tabulable, usted puede detectar y administrar el cambio de foco, utilizando el comando Form event que devolverá On Getting Focus u On losing Focus, dependiendo del caso.
Botones 3D
Los botones 3D le permiten establecer interfaces gráficas avanzadas (para una descripción de los botones 3D, consulte el Manual de Diseño). Además de los eventos genéricos, dos eventos específicos pueden utilizarse para administrar estos botones:
On Long Click: este evento se genera cuando un botón 3D recibe un clic y el botón del ratón se mantiene presionado por un cierto periodo de tiempo. En teoría, el periodo de tiempo para el cual este evento se genera es igual a la longitud máxima de tiempo que separa un doble clic, como está definido en las preferencias del sistema.
Este evento puede ser generado por todos los estilos de botones 3D, botones de opción 3D y casillas de selección 3D, con excepción de los botones 3D de "antigua generación" (estilo offset de fondo) y las áreas de flechas de botones 3D con menús desplegables (ver a continuación).
Este evento se utiliza generalmente para mostrar menús desplegables en caso de clics largos en los botones. El evento On Clicked, si está seleccionado, se genera si el usuario libera el botón del ratón antes del tiempo límite de "clic largo".
On Arrow Click: Algunos estilos de botones 3D pueden estar asociados a un menú desplegable y mostrar una flecha. Hacer clic en esta flecha hace que se despliegue una caja de selección que ofrece un conjunto de acciones adicionales en relación con la acción principal del botón.
4D le permite administrar este tipo de botón utilizando el evento On Arrow Click. Este evento se genera cuando el usuario hace clic en la "flecha" (tan pronto como el botón del ratón sea presionado):
- Si el menú desplegable es de tipo "separado," el evento sólo se genera cuando un clic ocurre en la parte del botón con la flecha.
- Si el menú desplegable es de tipo "enlazado," el evento se genera cuando ocurre un clic en cualquier parte del botón. Por favor tenga en cuenta que el evento On Long Click no puede generarse con este tipo de botón.
Los estilos de botones 3D, botones de opción 3D y casillas de selección 3D que aceptan la propiedad "Con menú desplegable" son: Ninguno, Botón de barra, Bevel, Bevel redondeado y Office XP.
List boxes
Siete eventos de formulario pueden utilizarse para administrar las diferentes características específicas de los list boxes:
On Before Data Entry: Este evento se genera justo antes de que una celda de list box sea editada (antes de que el cursor de entrada aparezca). Este evento permite al desarrollador, por ejemplo, mostrar un texto diferente dependiendo de que el usuario esté en modo visualización o en modo edición.
On Selection Change: Este evento se genera cada vez que la selección actual de filas o de columnas del list box se modifica. Este evento también se genera para las listas de registros y listas jerárquicas.
On Column Moved: Este evento se genera cuando una columna del list box es movida por el usuario utilizando arrastrar y soltar. No se genera si la columna se arrastra y suelta en su ubicación inicial. El comando MOVED LISTBOX COLUMN NUMBER devuelve la nueva posición de la columna.
On Row Moved: Este evento se genera cuando una fila del list box es movida por el usuario utilizando arrastrar y soltar. No se genera si la fila es arrastrada y soltada en su ubicación inicial.
On Column Resize: Este evento se genera cuando el largo de una columna del list box se modifica (utilizando el ratón o por programación utilizando el comando SET LISTBOX COLUMN WIDTH).
On Header Click: Este evento se genera cuando ocurre un clic en el encabezado de una columna en el list box. En este caso, el comando Self le permite conocer el encabezado de la columna en la que se hizo clic. El evento On Clicked se genera cuando un clic derecho (Windows) o Ctrl+clic (Mac OS) ocurre en una columna o en un encabezado de columna.
Si la propiedad Ordenable fue seleccionada para el list box, usted puede decidir si permite o no una ordenación estándar de la columna pasando el valor 0 ó -1 en la variable $0:
- Si $0 es igual a 0, se efectúa la ordenación estándar.
- Si $0 es igual a -1, no se efectúa la ordenación estándar y el encabezado no muestra la flecha de ordenación. El desarrollador puede aún generar una ordenación de las columnas basada en criterios de ordenación personalizados utilizando los comandos de gestión de arrays de 4D.
Si la propiedad Ordenable no está seleccionada para el list box, la variable $0 no se utiliza.
On After Sort: Este evento se genera justo después de que se efectúe una ordenación estándar (sin embargo, no se genera si $0 devuelve -1 en el evento On Header Click). Este mecanismo es útil para conservar los sentidos de las últimas ordenaciones efectuadas por el usuario. En este evento, el comando Self devuelve un puntero a la variable de la columna que fue ordenada.
Listas jerárquicas
Además de los eventos genéricos, tres eventos específicos pueden utilizarse para administrar las acciones que los usuarios realizan sobre listas jerárquicas:
On Selection Change: Este evento se genera cada vez que la selección en la lista jerárquica se modifica después de un clic o de que se presione una tecla.
Este evento también es generado en los objetos list box y listas de registros.
On Expand: Este evento se genera cada vez que un elemento de la lista jerárquica se despliega con un clic o al presionar una tecla.
On Collapse: Este evento se genera cada vez que un elemento de la lista jerárquica se contrae con un clic o al presionar una tecla.
Estos eventos no son mutuamente exclusivos. Pueden generarse uno después del otro para una lista jerárquica:
- En respuesta a presionar una tecla (en orden):
Evento | Contexto | |
On Data Change | Un elemento estaba en edición | |
On Expand/On Collapse | Apertura/cierre de una sublista utilizando las teclas de flechas -> o & | |
On Selection Change | Selección de un nuevo elemento | |
On Clicked | Activación de la lista utilizando el teclado |
- En respuesta a un clic (en orden):
Evento | Contexto | |
On Data Change | Un elemento estaba en edición | |
On Expand/On Collapse | Apertura/cierre de una sublista utilizando los iconos de despliegue/contracción | |
o | ||
Doble-clic en una sublista no editable | ||
On Selection Change | Selección de un nuevo elemento | |
On Clicked / On Double Clicked | Activación de la lista por un clic o un doble clic |
Ejemplos
En todos los ejemplos siguientes, se asume que las propiedades de eventos de formularios y objetos han sido seleccionadas de manera apropiada.
1. Este ejemplo ordena una selección de subregistros para la subtabla [Padres]Hijos antes que un formulario de la tabla [Padres] sea visualizado en pantalla:
` Método de un formulario para la tabla [Padres] Case of : (Form event=On Load) ORDER SUBRECORDS BY([Padres]Hijos
;[Padres]Nombre'Hijos;>) ` ... End case
2. Este ejemplo muestra el evento On Validate utilizado para asignar automáticamente (a un campo) la fecha cuando el registro es modificado:
` Método de un formulario Case of ` ... : (Form event=On Validate) [unaTabla]Fecha de modificación:=Current date End case
3. En este ejemplo, la gestión completa de un menú desplegable, (inicialización, clics del usuario, y liberación de objeto) está encapsulada en el método de objeto:
` Método de objeto del menú desplegable asTalla Case of : (Form event=On Load) ARRAY STRING(31;asTalla;3) asTalla{1}:="pequeña" asTalla{1}:="mediana" asTalla{1}:="grande" : (Form event=On Clicked) If (asTalla#0) ALERT("Escogió una hamburguesa "+asTalla{asTalla}") End if : (Form event=On Unload) CLEAR VARIABLE(asTalla) End case
4. Este ejemplo muestra cómo aceptar y administrar una operación de arrastrar y soltar para un objeto de campo que sólo acepta valores de imágenes, en un método de objeto,
` Método de objeto de campo Imagen [unaTabla]unaImagen Case of : (Form event=On Drag Over) ` Ha comenzado una operación arrastrar y soltar y el ratón está sobre el campo ` Obtener la información sobre el objeto fuente DRAG AND DROP PROPERTIES ($vpObjetoOrigen;$vlElementoOrigen;$lProcesoOrigen) ` Note que no necesitamos probar el número de proceso fuente ` para el método de objeto ejecutado ya que es el mismo proceso $vlTipoDatos:=Type ($vpObjetoOrigen->) ` ¿Los datos fuente son una imagen (campo, variable o array)? If (($vlTipoDatos=Is Picture) | ($vlTipoDatos=Picture Array)) ` Si es así, acepte el arrastrar. ` Note que el botón del ratón aún está presionado, el único efecto mientras ` acepta el arrastrar es permitir a 4D resaltar el objeto de manera que el usuario ` sepa que los datos fuente pueden ser soltados en este objeto. $0:=0 Else ` De lo contrario, rechace el arrastrar $0:=-1 ` En este caso, el objeto no se resalta End if : (Form event=On Drop) ` Los datos fuente han sido soltados sobre el objeto, por lo tanto necesitamos copiarlos en el objeto ` Obtener la información sobre el objeto fuente DRAG AND DROP PROPERTIES ($vpObjetoOrigen;$vlElementoOrigen;$lProcesoOrigen) $vlTipoDatos:=Type ($vpObjetoOrigen->) Case of ` El objeto fuente es un campo o una variable tipo imagen : ($vlTipoDatos=Is Picture) ` El objeto fuente es del mismo proceso (de la misma ventana y formulario)? If ($lProcesoOrigen=Current process) ` Si es así, copiar el valor fuente [aTabla]aImagen:=$vpObjetoOrigen-> Else ` Si no, ¿es el objeto fuente una variable? If (Is a variable ($vpObjetoOrigen)) ` Si es así, obtener el valor del proceso fuente GET PROCESS VARIABLE ($lProcesoOrigen;$vpObjetoOrigen->;$vgImagenArrastrada) [aTabla]aImagen:=$vgImagenArrastrada Else ` Si no, utilice CALL PROCESS para obtener el valor del campo del proceso fuente End if End if ` El objeto fuente es un array de imágenes : ($vlTipoDatos=Picture Array) ` ¿Está el objeto fuente en el mismo proceso (en la misma ventana y formulario)? If ($lProcesoOrigen=Current process) ` Si es así, copiar el valor fuente [aTabla]aImagen:=$vpObjetoOrigen->{$vlElementoOrigen} Else ` Sino, obtener el valor del proceso fuente GET PROCESS VARIABLE ($lProcesoOrigen;$vpObjetoOrigen; ->{$vlElementoOrigen};$vgImagenArrastrada) [aTabla]aImagen:=$vgImagenArrastrada End if End case End case
Nota: Para más ejemplos sobre gestión de los eventos On Drag Over y On Drop, consulte los ejemplos del comando DRAG AND DROP PROPERTIES.
5. Este ejemplo es una plantilla para un método de formulario. Muestra cada uno de los posibles eventos que pueden ocurrir cuando un informe utiliza un formulario como formulario de salida:
` Método de un formulario utilizado como formulario de salida de un informe $vpFormTabla:=Current form table Case of ` ... : (Form event=On Header) ` Un área de encabezado está apunto de imprimirse Case of : (Before selection($vpFormTabla->)) ` El código para la primera ruptura de encabezado debe estar aquí : (Level = 1) ` El código para la ruptura de encabezado de nivel 1 debe estar aquí : (Level = 2) ` El código para la ruptura de encabezado de nivel 2 debe estar aquí ` ... End case : (Form event=On Printing Detail) ` Se va a imprimir un registro ` El código para cada registro debe ir aquí : (Form event=On Printing Break) ` Un área de ruptura está a punto de imprimirse Case of : (Level = 0) ` El código para la ruptura 0 debe estar aquí : (Level = 1) ` El código para la ruptura 1 debe estar aquí ` ... End case : (Form event=On Printing Footer) If(End selection($vpFormTabla->)) ` El código para el último pie de página va aquí Else ` El código para el pie de página debe ir aquí End if End case
6. Este ejemplo muestra la plantilla de un método de formulario que administra los eventos que pueden ocurrir en un formulario mostrado utilizando los comandos DISPLAY SELECTION o MODIFY SELECTION. Por propósitos didácticos, muestra la naturaleza del evento en la barra de título de la ventana del formulario.
` Un método de formulario Case of : (Form event=On Load) $vsEvento:="El formulario va a ser visualizado" : (Form event=On Unload) $vsEvento:="El formulario de salida ha sido cerrado y va a desaparecer de la pantalla" : (Form event=On Display Detail) $vsEvento:="Mostrando el registro #"+String(Selected record number([LaTabla])) : (Form event=On Menu Selected) $vsEvento:="Un comando de menú ha sido seleccionado" : (Form event=On Header") $vsEvento:="El área de encabezado está a punto de ser dibujada" : (Form event=On Clicked") $vsEvento:="Se ha hecho clic en un registro" : (Form event=On Double Clicked") $vsEvento:="Se ha hecho doble clic en un registro" : (Form event=On Open Detail) $vsEvento:="Se hizo doble clic en el registro #"+String(Selected record number([LaTabla])) : (Form event=On Close Detail) $vsEvento:="Regreso al formulario de salida" : (Form event=On Activate) $vsEvento:="La ventana de formulario pasa al primer plano" : (Form event=On Deactivate) $vsEvento:="La ventana del formulario no es más la ventana del primer plano" : (Form event=On Menu Selected) $vsEvento:="Se ha seleccionado un elemento del menú" : (Form event=On Outside call) $vsEvento:="Se ha recibido una llamada de exterior" Else $vsEvento:="¿Qué pasa? El evento #"+String(Form event) End case SET WINDOW TITLE ($vsEvento)
7. Para los ejemplos sobre gestión de los eventos On Before Keystroke y On After Keystroke, ver los ejemplos de los comandos Get edited text, Keystroke y FILTER KEYSTROKE.
8. Este ejemplo muestra cómo tratar de la misma forma los clics y doble clic en un área de desplazamiento:
` Método de objeto para el área de desplazamiento asOpciones Case of : (Form event=On Load) ARRAY STRING (...;asOpciones;...) ` ... asOpciones:=0 : ((Form event=On Clicked) | (Form event=On Double Clicked)) If (asOpciones#0) ` Se ha hecho clic en un elemento, hacer algo aquí ` ... End if ` ... End case
9. Este ejemplo muestra cómo tratar los clics y doble clics utilizando una respuesta diferente. Note el uso del elemento cero para conservar el valor del elemento seleccionado:
` Método de objeto para el área de desplazamiento asChoices Case of : (Form event=On Load) ARRAY STRING (...;asOpciones;...) ` ... asOpciones:=0 asOpciones{0}:="0" : (Form event=On Clicked) If (asOpciones#0) If (asOpciones#Num(asOpciones)) ` Se ha hecho clic en un nuevo elemento, hacer algo aquí ` ... ` Guardar el nuevo elemento seleccionado para la próxima vez asOpciones{0}:=String (asOpciones) End if Else asOpciones:=Num(asOpciones{0}) End if : (Form event=On Double Clicked) If (asOpciones#0) ` Se ha hecho doble clic sobre un elemento, hacer algo diferente aquí End if ` ... End case
10. Este ejemplo muestra cómo mantener un área de texto a partir de un método desde un método de formulario, utilizando los eventos On Getting Focus y On losing Focus:
`Método de formulario [Contactos];"Entrada" Case of : (Form event=On Load) C_TEXT(vtAreaEstado) vtAreaEstado:="" : (Form event=On Getting Focus) RESOLVE POINTER (Focus object;$vsNombreVar;$vlNumTabla;$vlNumCampo) If (($vlNumTabla#0) & ($vlNumCampo#0)) Case of : ($vlNumCampo=1) ` Campo nombre vtAreaEstado:="Introduzca el nombre del contacto; se pasará automáticamente a mayúsculas" ` ... : ($vlNumCampo=10) ` Campo código postal vtAreaEstado:="Introduzca un código postal; será verificado y validado automáticamente" ` ... End case End if : (Form event=On Losing Focus) vtAreaEstado:="" ` ... End case
11. Este ejemplo muestra cómo responder al evento de cierre de una ventana con un formulario utilizado para la entrada de datos:
` Método para un formulario de entrada $vpFormTabla:=Current form table Case of ` ... : (Form event=On Close Box) If (Modified record($vpFormTabla->)) CONFIRM ("Este registro ha sido modificado. ¿Quiere guardar los cambios?") If (OK=1) ACCEPT Else CANCEL End if Else CANCEL End if ` ... End case
12. Este ejemplo muestra cómo pasar a mayúsculas un campo de tipo texto o alfanumérico cada vez que el valor se modifique:
`Método de objeto para [Contactos]Nombre Case of ` ... : (Form event=On Data Change) [Contactos]Nombre:= Uppercase(Substring([Contactos]Nombre;1;1))+ Lowercase(Substring([Contactos]Nombre;2)) ` ... End case
Ver también
CALL PROCESS, Current form table, DRAG AND DROP PROPERTIES, FILTER KEYSTROKE, Get edited text, Keystroke, SET TIMER.