@Layout
Describe la distribución de una pantalla o reporte: Label, Input, Column, DataGridView, Block, o cualquier otro Nombre(...) como control genérico. Los nombres de control pueden llevar @ opcionalmente (@Label/Label son equivalentes).
Controles con gramática propia
| Control | Sintaxis | Válido en | Descripción |
|---|---|---|---|
Label | Label(x, y, texto[, Style(...)]...) | Program, Screen | Etiqueta estática en x,y. texto puede ser &Variable, &variable.miembro (camino de un struct), "literal" o un nombre de campo suelto. x,y = 1,1 (esquina exacta) está prohibido — DDS rechaza cualquier campo ahí. Style(...) (sólo en Screen) le da color y atributos; ver Style. |
Block | Block("Nombre")[ Label(...), ... ] | Program | Grupo nombrado e imprimible de Labels — se imprime una instancia con Print("Nombre") desde @Source. |
Input | Input("Nombre", x, y, texto, &Variable[, habilitado][, Style(...)]...) | Screen | Campo editable en x,y. "Nombre" identifica el control (se lee con CurrentInput()). &Variable (o un camino &variable.miembro) es donde se guarda el valor ingresado. habilitado opcional (default true): literal, &Variable (o camino &variable.miembro), Funcion() de retorno number (no-cero = habilitado) o una condición completa, reevaluado antes de cada redibujado. x,y = 1,1 también prohibido. |
Column | Column(texto, variableOCampo[, Input|Hidden][, Style(...)]...) | sólo dentro de DataGridView | variableOCampo también admite un camino &variable.miembro. El 3er argumento opcional hace la columna editable (Input) o invisible (Hidden). Style(...) le da color y atributos, evaluados por fila; ver Style en Column. |
DataGridView | DataGridView("Nombre", x, y, filas[, separador])[ Column(...), ... ] | Screen | Grilla nombrada en x,y mostrando filas visibles. El nombre es obligatorio y único entre Input/DataGridView. Ver DataGridView para la guía completa. |
Ejemplo (Screen)
@Layout {
@Label(1,2,&Programa)
@Label(1,70,&Fecha)
@Input("txtNroSolicitud",3,1,"Nro. Solicitud: ",&NroSolicitud,true)
@DataGridView("GridSolicitudes",6,1,8," ") [
@Column("Pais",&nPais)
@Column("Usuario",&cUsuario)
]
}
Miembros de struct en el layout
Label, Input (variable destino y habilitado) y Column aceptan caminos de miembros de un struct, incluso anidados: &cli.Codigo, &ped.Cli.Nombre. También funcionan con Print en un Program.
@Layout {
@Label(1,2,&cli.Codigo)
@Input("TxtNombre",3,2,"Nombre:",&cli.Nombre,&cli.Activo)
@Input("TxtCli",4,2,"Cliente:",&ped.Cli.Nombre)
@DataGridView("GridFilas",6,1,8," ") [
@Column("Nombre",&fila.Nombre)
]
}
Cada camino se convierte en un campo DDS: se cambia cada . por _, se pasa a mayúsculas y se trunca a 10 caracteres (cli.Codigo -> CLI_CODIGO, ped.Cli.Nombre -> PED_CLI_NO). Si dos variables o caminos terminan con el mismo nombre DDS (por ejemplo cli.Codigo y cli_Codigo) se reporta E00210. Un miembro que no existe reporta E00178.
Mayúsculas y minúsculas en Input de texto
Un Input cuya variable es char o varchar admite minúsculas: el DDS lleva CHECK(LC), de modo que el terminal 5250 ya no convierte lo tipeado a mayúsculas. El programa recibe exactamente lo que escribió el usuario (por ejemplo Lima). Los Input numéricos, de fecha y de hora no cambian.
Si se compara lo tipeado contra literales, conviene normalizarlo con Upper:
If Upper(&Ciudad) = "LIMA"
...
EndIf
Condiciones completas
El último parámetro opcional habilitado de Input (y la condición opcional de Style) admite, además del literal true/false, estas formas:
&Variable: no-cero = habilitado.Funcion(): función sin argumentos de retornonumber; no-cero = habilitado.- Una condición completa: comparaciones (
= <> < <= > >=),And,Or,Not, números, textos, variables y llamadasFuncion()sin argumentos. Es verdadera cuando se cumple.
@Input("TxtOp",7,2,"Operacion:",&Op, Not &Bloqueado = 1 And &Estado <> "9")
La condición se reevalúa antes de cada redibujado, con el mismo mecanismo de indicadores que ya usaba la habilitación dinámica. Precedencia: ver Not.
No se admiten campos de tabla sueltos, índices ni métodos en la condición: reportan E00322.
Style: color y atributos de pantalla
Style(...) se coloca al final de los parámetros de un Label, un Input o una Column de DataGridView, y sólo es válido en un Screen (en otro tipo de objeto da E00325). Asigna color y atributos de pantalla 5250 (DDS COLOR y DSPATR).
Label(x, y, texto, Style(...)[, Style(...)])
Input("Nombre", x, y, texto, &Var[, habilitado][, Style(...)]...)
Column(texto, &Var[, Input|Hidden][, Style(...)]...)
Sintaxis: Style(Nombre, Nombre, ...[, condición]).
Colores (a lo sumo uno por Style; si no, E00321):
| Nombre | DDS |
|---|---|
Green | COLOR(GRN) |
White | COLOR(WHT) |
Red | COLOR(RED) |
Blue | COLOR(BLU) |
Yellow | COLOR(YLW) |
Pink | COLOR(PNK) |
Turquoise | COLOR(TRQ) |
Atributos (combinables entre sí y con un color):
| Nombre | DDS | Efecto |
|---|---|---|
Reverse | DSPATR(RI) | Video inverso. |
High | DSPATR(HI) | Alta intensidad. |
Underline | DSPATR(UL) | Subrayado. |
Blink | DSPATR(BL) | Parpadeo. |
Hidden | DSPATR(ND) | No se muestra lo escrito (campo oculto). |
Un nombre desconocido da E00320. Un Style sin color ni atributo da E00324.
Equivalencias para quien migra: 'RI' = Reverse, '+' = High, MGN = Pink.
Style con condición
El último argumento de un Style puede ser una condición, con las mismas formas que habilitado (variable, Funcion() o condición completa). El Style se aplica mientras la condición sea verdadera.
Reglas por elemento:
- A lo sumo un
Stylesin condición (el “normal”): se aplica sólo si ningúnStylecon condición está activo. - Hasta tres
Stylecon condición. Más de los permitidos daE00323. - Si dos
Stylecon condición se cumplen a la vez, gana el primero declarado. - Cada
Stylecon condición consume un indicador del mismo rango que la habilitación dinámica (30-89). - Una pantalla monocromo ignora
COLOR.
@Layout {
Label(1,2,&Titulo,Style(Reverse,High))
Label(3,2,"F3=Salir",Style(Red))
Label(5,2,&Desc,Style(Blue,&Estado = "1" Or &Estado = "2"),Style(Pink,&Estado = "3"),Style(Green))
Input("TxtOp",7,2,"Operacion:",&Op,Not &Bloqueado = 1 And &Estado <> "9",Style(Yellow,Underline))
Input("TxtImp",8,2,"Importe:",&Importe,&Bloqueado = 0,Style(Turquoise,&Bloqueado = 1))
}
En &Desc, el texto es azul si &Estado es "1" o "2", rosado si es "3" y verde en cualquier otro caso. Ejemplo completo: example/screens/SSTYLE01.warp.
Style en Column del DataGridView
Column acepta Style(...) después del modo opcional (Input/Hidden). Las reglas son las mismas (colores, atributos, a lo sumo un Style sin condición y tres con condición por columna, gana el primero declarado, errores E00320-E00324):
DataGridView("GridPed",2,2,10)
[
Column("Pedido",&VNroPed)
Column("Cantidad",&VCant,Style(Red,High,&VCant > 100),Style(Green))
]
Diferencia clave: la condición de un Style de columna se evalúa por fila, en el momento de LoadRow() (justo antes de guardar la fila en el subfile), con los valores que tengan las variables en ese instante. Por eso LoadRow() debe ir después de asignar las variables de la fila. Los indicadores se guardan junto con cada fila, de modo que el color de una fila no cambia si luego cambian las variables. Estos indicadores comparten el rango 30-89 con el resto de Style y con habilitado. Ejemplo completo: example/screens/SJNGRD01.warp.
Limitaciones
- La habilitación dinámica por fila del
DataGridView(Column(..., Input)condicionado) aún no existe (planificada).
Ejemplo (Program, con Block imprimible)
@Layout {
@Block("Encabezado") [
Label(1,1,"Reporte de Ventas")
Label(2,1,&FechaHoy)
]
}
@Source {
Print("Encabezado")
}
@Layout es opcional en Program (un programa puramente batch, sin salida impresa, no la necesita) pero obligatoria en Screen. No aplica a tablas.