Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

@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

EventoCuándo dispara
EnterAl presionar Enter (sin tecla de función activa). CurrentInput() identifica qué Input tenía foco, decodificado de la posición del cursor tras EXFMT.
CloseFijo a F3 en el DSPF generado (CF03) — siempre corre (incluso vacío) y termina la pantalla; no requiere declaración para atar la tecla.
LoadUna 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).
RefreshAl 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.
InitUna 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 error E00357. El texto con espacios va como tercer valor: Event 'Nombre' 6 "Texto con espacios".
  • El texto del Event tiene prioridad sobre el que se declare para esa misma tecla en @FunctionKeys del .warpcfg del 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=Buscar en el segundo ejemplo).
  • El color de la tecla manda sobre Function Keys Color (de @Properties o 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 @FunctionKeys no admiten color propio; usan Function 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.

SentenciaUso
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 ... EndForRecorre 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 Input compara 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 Hidden nunca coincide.
  • Mismo ámbito que CurrentInput(): Event, Procedure o Function de un Screen (E00192 en otro lugar). Si se invoca desde Event 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ún Input ni 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.

  • Refresh vuelve a la primera fila.
  • Refresh Keep conserva 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 dan E00335. Si el Screen no tiene DataGridView, no hacen nada.
  • Se pueden llamar desde cualquier Event o Procedure.
  • No son palabras reservadas: un Event Refresh y un campo llamado Refresh siguen funcionando.
  • Limitación: la recarga repite la secuencia de la primera carga. Un Refresh dentro de Event Load se 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 Input del @Layout (E00332).
  • No recibe argumentos (E00333).
  • No es una expresión; no puede usarse dentro de una (E00334).
  • Si hay varios SetFocus en una misma vuelta, gana el primero.
  • Se puede usar en Event Init para 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.