# statictext — `u_pbt_statictext` #

← Referencia de componentes · Índice de la guía

> Bloque de texto enriquecido: etiquetas, alineaciones, enlaces y acciones en los que se puede hacer clic, aspecto de encabezado, modo desplazable (marquee) y zona para soltar ficheros.

> ▶ Verlo en vivo — Aplicación de demostración, mosaico Statictext: la vista previa, el código que lo genera y esta página, uno al lado del otro.

## De un vistazo #

Userobject | `u_pbt_statictext`
Clase de items | — (componente sin items)
Sirve para | Sustituir un `statictext` de PowerBuilder por un bloque de texto formateado, en el que se puede hacer clic, capaz de servir de encabezado, de banda desplazable o de zona para soltar ficheros
Opciones opt-in | `ib_auto_height`, `ib_track_mouse`, `ib_allow_drop`, `ib_selectable`, `ib_hover_effect`

## Inicio rápido #

    // event open de la ventana
    uo_texte.is_text = "Bienvenido a [b][accent]PBToolboxAI[/accent][/b][br]" &
                       + "Consulte la [hyperlink=https://pbtoolboxai.net]documentación[/hyperlink]."
    uo_texte.is_align = uo_texte.ALIGN_CENTER
    uo_texte.is_valign = uo_texte.VALIGN_CENTER

El texto admite el texto enriquecido con etiquetas: es este componente el que mejor partido le saca, ya que es el único que hace que las zonas `[hyperlink=…]` y `[action=…]` sean realmente pulsables.

## Constantes #

Constante | Valor | Para
--- | --- | ---
`ALIGN_START` · `ALIGN_CENTER` · `ALIGN_END` · `ALIGN_JUSTIFY` | `"start"` `"center"` `"end"` `"justify"` | `is_align`
`VALIGN_TOP` · `VALIGN_CENTER` · `VALIGN_BOTTOM` | `"top"` `"center"` `"bottom"` | `is_valign`

`start` y `end` son lógicos: siguen el sentido de escritura (Idioma y RTL). Los valores físicos `left` y `right` se siguen aceptando como alias.

## Propiedades #

### Texto y formato #

Propiedad | Tipo | Predeterminado | Función
--- | --- | --- | ---
`is_text` | string | `""` | El texto mostrado, con el texto enriquecido con etiquetas: `[b]`, `[i]`, `[u]`, colores, `[picture=…]`, `[hyperlink=…]`, `[action=…]`
`is_align` | string | `"start"` | Alineación horizontal: `ALIGN_START`, `ALIGN_CENTER`, `ALIGN_END`, `ALIGN_JUSTIFY`
`is_valign` | string | `"top"` | Alineación vertical dentro del control: `VALIGN_TOP`, `VALIGN_CENTER`, `VALIGN_BOTTOM`
`ib_wrap` | boolean | `true` | Salto de línea automático. `false` fuerza una única línea
`ib_ellipsis` | boolean | `false` | Con `ib_wrap = false`, trunca el desbordamiento con puntos suspensivos en lugar de cortarlo en seco
`ib_ellipsis_tooltip` | boolean | `false` | Opt-in: cuando el texto no cabe en la caja, mostrarlo entero en una sugerencia (marcado incluido). Nunca sustituye una sugerencia que usted haya puesto con `is_tooltip` o `is_super_tooltip_*`: la suya gana
`is_font_family` | string | `""` | Fuente predeterminada del bloque (vacío = fuente del tema)
`ii_font_size` | integer | `0` | Tamaño predeterminado en puntos (`0` = tamaño del tema)
`il_text_color` | long | `-1` | Color del texto `RGB()` (`-1` = color del tema). Las etiquetas `[color]` siguen teniendo prioridad sobre su fragmento
`ii_line_spacing` | integer | `0` | Interlineado en porcentaje (`150` = 1,5 líneas; `0` = predeterminado)
`ib_enabled` | boolean | `true` | Bloque activo o atenuado (los enlaces y las acciones quedan inertes cuando está atenuado)
`ib_selectable` | boolean | `false` | Opt-in: permite al usuario seleccionar y copiar el texto (desactivado de forma predeterminada, como una etiqueta)

### Aspecto de bloque (aire de «encabezado») #

Propiedad | Tipo | Predeterminado | Función
--- | --- | --- | ---
`il_back_color` | long | `-1` | Fondo del bloque `RGB()` (`-1` = fondo del tema)
`il_border_color` | long | `-1` | Color del borde (`-1` = sin borde)
`ii_border_width` | integer | `0` | Grosor del borde en píxeles (`0` = sin borde)
`ii_corner_radius` | integer | `0` | Radio de redondeo de las esquinas, en píxeles
`ii_padding` | integer | `0` | Margen interior en píxeles (`0` = valor del tema)
`ib_hover_effect` | boolean | `false` | Opt-in: ligero oscurecimiento al pasar el cursor, para una etiqueta que actúa como botón

### Modo desplazable (marquee) #

Propiedad | Tipo | Predeterminado | Función
--- | --- | --- | ---
`ib_marquee` | boolean | `false` | Convierte el bloque en una banda desplazable horizontalmente
`ii_marquee_speed` | integer | `60` | Velocidad de desplazamiento, en píxeles por segundo
`is_marquee_direction` | string | `MARQUEE_START` | Sentido del desplazamiento: `MARQUEE_START` (hacia el inicio de la lectura) o `MARQUEE_END`. Se aceptan los alias físicos `"left"` / `"right"`
`ib_marquee_overflow_only` | boolean | `false` | Opt-in: desplazar solo si el texto es demasiado ancho para la caja. Un rótulo que desplaza un texto ya legible no es más que ruido visual. Desactivado de forma predeterminada, para que `ib_marquee = true` siga significando se desplaza
`ib_marquee_pause_on_hover` | boolean | `false` | Opt-in: detiene el desplazamiento mientras el puntero está sobre el bloque, para que un texto largo se pueda leer. La posición del ciclo se conserva: nada salta cuando el puntero se va

### Interacciones opcionales #

Propiedad | Tipo | Predeterminado | Función
--- | --- | --- | ---
`ib_allow_drop` | boolean | `false` | Opt-in: acepta que se suelten ficheros desde el Explorador de Windows; las rutas completas llegan por `ue_drop_files`
`ib_track_mouse` | boolean | `false` | Opt-in: activa `ue_mouse_enter` / `ue_mouse_leave`
`ib_auto_height` | boolean | `false` | Opt-in: el bloque mide su altura ideal y redimensiona el userobject; véase Base común
`is_theme_style` | string | `fluent` | Estilo visual del componente (constantes `THEME_STYLE_*`)
`is_theme_mode` | string | `light` | Variante clara u oscura (constantes `THEME_MODE_*`)
`il_theme_accent` | long | `-1` | Color de acento de este componente (`-1` = acento del tema)
`is_tooltip` | string | `""` | Tooltip simple mostrado al pasar el ratón por el componente
`is_super_tooltip_title` | string | `""` | Título del tooltip enriquecido (prevalece sobre `is_tooltip`)
`is_super_tooltip_text` | string | `""` | Texto del tooltip enriquecido (se acepta el marcado enriquecido)
`is_super_tooltip_image` | string | `""` | Imagen del tooltip enriquecido

## Métodos #

Método | Función
--- | ---
`of_reset ( )` | Devuelve todas las propiedades a su valor predeterminado y vacía el texto
`of_set_redraw (boolean)` | Agrupa una ráfaga de modificaciones en una única representación
`of_save_as_png (string)` · `of_save_as_jpg (string)` | Exporta la representación como imagen
`of_scroll_to_end ( )` | Baja al final del texto. Para un registro, cuya línea más reciente está al final: sin esto queda por debajo de la línea de flotación en cuanto el texto supera la altura visible

## Eventos #

Evento | Se activa cuando
--- | ---
`ue_clicked ( )` | Clic izquierdo sobre el bloque — no se activa sobre una zona `[action]` o `[hyperlink]` (sin duplicados)
`ue_hyperlink (string as_url)` | Se pulsó una zona `[hyperlink=url]`. El navegador se abre solo: el evento le llega además, para registrar el clic o hacer algo más con él
`ue_action (string as_id)` | Se ha hecho clic en una zona `[action=id]`: le corresponde a usted enganchar ahí su código
`ue_drop_files (string as_files[])` | Se han soltado ficheros desde Windows: rutas completas, una entrada por fichero. Requiere `ib_allow_drop = true`
`ue_drag_enter ( )` | Un arrastre de ficheros entra en el componente (`ib_allow_drop`)
`ue_drag_leave ( )` | El arrastre de ficheros sale del componente
`ue_auto_height (long al_height)` | El bloque ha calculado su altura ideal — requiere `ib_auto_height = true`
`ue_rclicked ( )` | Clic derecho sobre el bloque
`ue_double_clicked ( )` | Doble clic sobre el bloque, como el `StaticText` nativo de PowerBuilder. Los clics simples que lo preceden también se emiten, en el mismo orden. No sobre una zona `[action]` o `[hyperlink]`, que tienen su propio canal
`ue_text_overflow (boolean ab_truncated)` | El texto ha dejado de caber en la caja — o vuelve a caber. Emitido únicamente al cambiar, nunca en ráfaga: un bloque con salto de línea cuenta como cortado cuando queda recortado por abajo, y uno de una sola línea cuando se corta de lado. Trátelo para ensanchar una columna, ofrecer un botón ver más, o simplemente activar `ib_ellipsis_tooltip`
`ue_mouse_enter ( )` | El ratón entra — requiere `ib_track_mouse = true`
`ue_mouse_leave ( )` | El ratón sale — requiere `ib_track_mouse = true`
`ue_cycle ( )` | Solo en modo desplazable: el texto acaba de terminar una pasada completa
`ue_ready ( )` | El componente ha terminado de cargarse; todo lo enviado antes se ha reproducido
`ue_runtime_missing ( )` | El runtime WebView2 está ausente: el componente permanece vacío
`ue_bg_color (long al_color)` | El componente ha calculado el color de fondo de su tema; el userobject ya lo ha adoptado (`backcolor`)

## Ejemplos #

### Un encabezado de sección #

Fondo liso, texto blanco centrado y altura ajustada al contenido: el bloque se lee como una auténtica barra de título.

    uo_entete.of_set_redraw(false)

    uo_entete.is_text  = "[b]Cuadro de mando de ventas"
    uo_entete.is_align = uo_entete.ALIGN_CENTER

    // Fondo liso y texto blanco legible
    uo_entete.il_back_color = RGB(/*rojo*/ 60, /*verde*/ 110, /*azul*/ 190)
    uo_entete.il_text_color = RGB(/*rojo*/ 255, /*verde*/ 255, /*azul*/ 255)
    uo_entete.ii_padding = 14

    // El bloque se cine a su contenido : se lee como una barra de titulo
    uo_entete.ib_auto_height = true

    uo_entete.of_set_redraw(true)

    // event ue_auto_height de uo_entete
    of_repositionner_sous_entete(al_height)   // desplaza el contenido bajo el encabezado

### Texto enriquecido con enlace y acción #

    uo_texte.is_text = "Su licencia caduca el [b]31/12[/b]. " &
                       + "[hyperlink=https://pbtoolboxai.net]Más información[/hyperlink] " &
                       + "o [action=renew]renuévela ahora[/action]."

    // event ue_action de uo_texte : (string as_id)
    choose case as_id
        case "renew" ; of_ouvrir_renouvellement()
    end choose

`ue_hyperlink` está reservado a las URL (el navegador se abre solo); `[action=id]` es la opción adecuada cuando el clic debe permanecer dentro de su aplicación. La variante `[invisibleaction=id]` activa el mismo `ue_action` sin la apariencia de un enlace.

### Un bloque plegable #

    uo_recap.is_text = "[b]Pedido 2026-0148[/b][br]" &
                       + "[foldarea:[b]Entrega[/b]]Enviado el 12/07, en 48 horas.[/foldarea]" &
                       + "[foldarea-closed:[i]Aviso legal[/i]]Devolucion aceptada en 14 dias.[/foldarea]"

    uo_recap.ib_auto_height = true   // el bloque se encoge cuando se pliega una seccion

Un `[foldarea:Título]` añade un encabezado en el que se puede hacer clic sobre su contenido: el lector pliega la sección con un clic y el marcador pasa de `−` a `+`. `[foldarea-closed:Título]` produce el mismo bloque, plegado desde el principio. Los bloques se anidan y el pliegue no emite ningún evento: es una cuestión de lectura, no de código. Si `ib_auto_height` está activo, la altura se vuelve a notificar en cada pliegue. El título es texto con etiquetas: `[foldarea:[b][accent]Pedido 2026-0148[/accent][/b]]` pone el suyo en negrita y con el color de acento.

### Una banda desplazable #

    uo_bandeau.is_text = "[b]Información[/b] -- cierre excepcional del servicio el viernes 12."

    // Modo desplazable, al estilo de un teletipo de noticias
    uo_bandeau.ib_marquee = true
    uo_bandeau.ii_marquee_speed = 90        // pixeles por segundo
    uo_bandeau.is_marquee_direction = uo_bandeau.MARQUEE_START

El desplazamiento se repite sin tiempos muertos. Para detenerlo, vuelva a poner `ib_marquee` en `false`: el texto recupera su disposición normal.

En cada pasada completa del texto se activa el evento `ue_cycle` — práctico para ir rotando varios mensajes:

    // En ue_cycle de la banda : pasar al mensaje siguiente
    ii_message = Mod(ii_message, UpperBound(is_messages)) + 1
    uo_bandeau.is_text = is_messages[ii_message]

### Una zona para soltar ficheros #

    // Aceptar los ficheros arrastrados desde el Explorador de Windows
    uo_zone.ib_allow_drop = true

    uo_zone.is_text = "[size=32][accent][b]Suelte aquí sus ficheros[/b][/accent][/size][br][br]" &
                      + "Arrastre uno o varios ficheros desde el Explorador de Windows."
    uo_zone.is_align  = uo_zone.ALIGN_CENTER
    uo_zone.is_valign = uo_zone.VALIGN_CENTER

    // event ue_drop_files de uo_zone : (string as_files[])
    integer li

    for li = 1 to UpperBound(as_files)
        of_importer(as_files[li])       // as_files[li] = ruta COMPLETA del fichero
    next

    // event ue_drag_enter de uo_zone : senalar el destino al pasar el cursor
    uo_zone.il_border_color = RGB(/*rojo*/ 21, /*verde*/ 101, /*azul*/ 192)
    uo_zone.ii_border_width = 2

Las rutas recibidas son completas: puede pasarlas directamente a `FileOpen` o a su rutina de importación.

### Una etiqueta que se comporta como un botón #

    uo_lien.is_text = "Seleccionar todo"
    uo_lien.il_text_color = RGB(/*rojo*/ 21, /*verde*/ 101, /*azul*/ 192)
    uo_lien.ii_padding = 8
    uo_lien.ii_corner_radius = 6
    uo_lien.ib_hover_effect = true       // reacciona al paso del cursor como un boton

    // event ue_clicked de uo_lien
    of_tout_selectionner()

## Buenas prácticas #

- Un texto sin etiquetas no tiene ningún coste añadido: no dude en sustituir sistemáticamente sus `statictext` de PowerBuilder, incluso para texto sin formato.
- Prefiera `is_align = uo.ALIGN_START` a `"left"`: su pantalla seguirá siendo correcta si la aplicación pasa a escritura de derecha a izquierda.
- `ib_selectable` permanece desactivado de forma predeterminada, como una etiqueta. Actívelo solo allí donde copiar tenga sentido (número de expediente, mensaje de error técnico).
- Para un encabezado, combine `il_back_color` + `ii_padding` + `ib_auto_height`: el bloque se dimensiona solo cuando el texto cambia de longitud.
- Active `ib_track_mouse` únicamente si realmente programa `ue_mouse_enter` / `ue_mouse_leave`.
- Llame a `of_reset()` antes de reutilizar un bloque para otro contenido: de lo contrario, permanecerán en su sitio el fondo, el borde o el modo desplazable anteriores.

← Referencia de componentes · Índice de la guía