@Source: Event y Screen
Sentencias exclusivas de archivos Screen.
Event
Event NombreEstandar
...
EndEvent
Event 'Etiqueta' NumeroTecla ["Texto"]
...
EndEvent
Dos formas: evento estándar (nombre bare, sin comillas) o evento personalizado atado a una tecla de función (nombre entre comillas + número de tecla, 1-24, es decir F1-F24; F13-F24 vía Shift).
Eventos estándar
| Evento | Cuándo dispara |
|---|---|
Enter | Al presionar Enter (sin tecla de función activa). CurrentInput() identifica qué Input tenía foco, decodificado de la posición del cursor tras EXFMT. |
Close | Fijo a F3 en el DSPF generado (CF03) — siempre corre (incluso vacío) y termina la pantalla; no requiere declaración para atar la tecla. |
Load | Una sola vez, antes del primer despliegue — típicamente contiene el For Each/LoadRow() que llena el DataGridView (la grilla se reinicia al entrar). Page Up/Down son scroll nativo sobre lo ya cargado; este evento sólo vuelve a correr con Refresh/Refresh Keep o con F5 (ver más abajo). |
Refresh | Al presionar F5, si F5 está declarada en @FunctionKeys del .warpcfg y no está tomada por un Event 'Nombre' 5 personalizado. Ejecuta Event Refresh (si existe) y después recarga el DataGridView (si el Screen tiene uno con Event Load). Ver Refresh y Refresh Keep. |
Init | Una sola vez, la primera vez que arranca esta pantalla, antes del primer despliegue. No hace nada si no se declara. Único lugar de un Screen donde Member(...) es válido — ver Reportes con Member()/Export(). |
Eventos personalizados
Event 'BuscarCliente' 4
Message("Se presionó F4", Info)
EndEvent
Por defecto, la etiqueta mostrada en la fila de teclas de función de la pantalla es el nombre del evento (F4=BuscarCliente).
Texto de la tecla
Después del número de tecla se puede agregar un texto opcional entre comillas, que es el que se muestra en esa fila (F4=Buscar):
Event 'BuscarCliente' 4 "Buscar"
Message("Se presionó F4", Info)
EndEvent
- Sólo se admite en eventos con tecla (1-24); no puede estar vacío ni pasar de 20 caracteres (
E00344). - Si se omite, se usa el nombre del evento.
- El nombre del evento se convierte en el nombre de un subprocedimiento RPG, así que debe ser un identificador (letras, dígitos y
_, empezando por letra); de lo contrario es el errorE00357. El texto con espacios va como tercer valor:Event 'Nombre' 6 "Texto con espacios". - El texto del
Eventtiene prioridad sobre el que se declare para esa misma tecla en@FunctionKeysdel.warpcfgdel proyecto (ver Proyecto), igual que antes ocurría con el nombre.
Color de la tecla
Al final se puede agregar un color, con o sin texto: Green, White, Red, Blue, Yellow, Pink o Turquoise (los mismos de Style):
Event 'Borrar' 7 "Borrar" Red
Message("Registro borrado", Info)
EndEvent
Event 'Buscar' 4 Blue
Message("Se presionó F4", Info)
EndEvent
- El texto y el color son opcionales; sin texto se usa el nombre del evento (
F4=Buscaren el segundo ejemplo). - El color de la tecla manda sobre
Function Keys Color(de@Propertieso de@Screen). Aplica también a cada juego de la rotación de F24. - Un color inválido da
E00347. - Las teclas declaradas solo en
@FunctionKeysno admiten color propio; usanFunction Keys Color.
Message
Message(texto, Error|Warning|Info)
Muestra un mensaje en la línea de mensaje de la pantalla: Error (rojo), Warning (amarillo), Info (color normal de texto). Se muestra en el siguiente refresco de pantalla y se limpia después de un ciclo.
LoadRow / RefreshSelectRow / For Each Row
Exclusivos de pantallas con DataGridView — ver la guía completa: DataGridView.
| Sentencia | Uso |
|---|---|
LoadRow() | Sin argumentos. Toma los valores actuales de las variables atadas a cada Column y agrega una fila a la grilla. Válida en el cuerpo de cualquier Event de un Screen (directo, dentro de If, Case, While, For o For Each) y en cualquier Procedure. En Event Load la grilla se reinicia al entrar; en cualquier otro Event o Procedure las filas se agregan a las existentes. No se permite en una Function ni fuera de un Event/Procedure (E00198). Un For Each que cargue la grilla debe declarar Index. |
RefreshSelectRow() | Sin argumentos. Inversa de LoadRow(): relee la fila bajo el cursor y escribe cada columna (incluidas Hidden) de vuelta en su variable atada. Válida en cualquier Event de un Screen con DataGridView. |
For Each Row ... EndFor | Recorre todas las filas ya cargadas en el subfile (no la tabla), escribiendo cada Column en su variable atada antes de cada iteración. Sin Index/Where/When None. |
CurrentInput
&Control = CurrentInput()
Devuelve el Nombre del Input/DataGridView (de @Layout) que tiene el foco actualmente. Para un DataGridView, coincide si el cursor cae en cualquier parte de su rectángulo (encabezado, fila de atención o cualquier fila de datos), no sólo en una celda exacta. Válida en cualquier Event, Procedure o Function de un Screen (una Procedure llamada desde un evento ve la posición igual), porque el driver calcula la posición del cursor tras cada lectura de pantalla. No vale en sentencias sueltas de nivel superior de @Source (nunca se ejecutan) ni fuera de un Screen: es el error E00192. Si la Procedure se invoca desde Event Init (antes de la primera lectura), el cursor aún no tiene posición y CurrentInput() devuelve vacío.
Cursor
If Cursor(&Codigo)
&Aviso = "Ayuda de codigos"
EndIf
Es verdadera si el cursor está sobre el control atado a &Codigo, sea un Input o una columna visible del DataGridView del @Layout. Se usa como condición directa; no se combina con = 1, porque el resultado ya es una condición.
- Para un
Inputcompara la fila y el rango de columnas del campo. - Para una columna del grid compara las filas de datos y el rango de columnas de esa columna. Una columna
Hiddennunca coincide. - Mismo ámbito que
CurrentInput():Event,ProcedureoFunctionde unScreen(E00192en otro lugar). Si se invoca desdeEvent Init, aún no hay posición y da falso. - Errores:
E00336(cantidad de argumentos),E00337(el argumento no es una&variable),E00338(la variable no es de ningúnInputni columna del grid).
Ejemplo de uso dentro de una Procedure (ver example/screens/SFOCUS01.warp):
Procedure PideAyuda()
If Cursor(&Cod)
&Aviso = "Ayuda de codigos"
Else
If Cursor(&Descrip)
&Aviso = "Ayuda de descripciones"
EndIf
EndIf
EndProc
Refresh y Refresh Keep: recargar el DataGridView
Refresh
Refresh Keep
Sentencias sin argumentos que recargan el DataGridView de la pantalla. La recarga no es inmediata: el código posterior al Refresh en el mismo evento sigue ejecutándose, y al comenzar la siguiente vuelta del driver se limpia el subfile y se vuelve a ejecutar Event Load.
Refreshvuelve a la primera fila.Refresh Keepconserva la fila donde estaba el usuario (recortada al nuevo total si la grilla quedó con menos filas).
Reglas:
- Sólo válidas en un
Screen; en otro tipo de fuente danE00335. Si el Screen no tieneDataGridView, no hacen nada. - Se pueden llamar desde cualquier
EventoProcedure. - No son palabras reservadas: un
Event Refreshy un campo llamadoRefreshsiguen funcionando. - Limitación: la recarga repite la secuencia de la primera carga. Un
Refreshdentro deEvent Loadse vuelve a evaluar en cada vuelta.
Ejemplo (ver example/screens/SREFRSH01.warp):
Event Enter
Refresh Keep
EndEvent
Cambio de comportamiento de F5
Si F5 está declarada en @FunctionKeys y no la reclama un evento personalizado, F5 ejecuta Event Refresh (si existe) y después recarga el DataGridView (si el Screen tiene uno con Event Load). Antes sólo se llamaba a Event Refresh. Así, Event Refresh sirve para preparar datos (por ejemplo, limpiar un filtro) antes de la recarga.
SetFocus: ubicar el cursor
&Variable.SetFocus()
Pone el cursor en el Input cuya variable es &Variable la próxima vez que se muestre la pantalla. Es una sentencia: no devuelve valor.
- Sólo válida en un
Screen(E00331). - La variable debe ser la de algún
Inputdel@Layout(E00332). - No recibe argumentos (
E00333). - No es una expresión; no puede usarse dentro de una (
E00334). - Si hay varios
SetFocusen una misma vuelta, gana el primero. - Se puede usar en
Event Initpara fijar el foco inicial.
Event Init
&Cod.SetFocus()
EndEvent
Event Enter
If &Cod = ""
&Aviso = "Falta el codigo"
&Cod.SetFocus()
EndIf
EndEvent
Ejemplo completo: example/screens/SFOCUS01.warp.
Implementación (para el lector avanzado): el compilador escribe la fila y la columna del campo en campos ocultos CSRLOC y los pone en cero tras cada lectura. En pantallas con DataGridView usa los CSRLOC de la grilla. En popups las coordenadas son relativas a la ventana.