PBToolboxAI v4 ← Site

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 #

Userobjectu_pbt_statictext
Clase de items— (componente sin items)
Sirve paraSustituir 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-inib_auto_height, ib_auto_width, ib_follow_end, ib_track_mouse, ib_track_cycle, ib_allow_drop, ib_selectable, ib_hover_effect

Inicio rápido #

// event open de la ventana
uo_text.is_text = "Bienvenido a [b][accent]PBToolboxAI[/accent][/b][br]" &
                   + "Consulte la [hyperlink=https://pbtoolboxai.net]documentación[/hyperlink]."
uo_text.is_align = uo_text.ALIGN_CENTER
uo_text.is_valign = uo_text.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 pulsables las zonas [action=…] (un [hyperlink=…] se abre en todas partes).


Constantes #

ConstanteValorPara
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 #

PropiedadTipoPredeterminadoFunción
is_textstring""El texto mostrado, con el texto enriquecido con etiquetas: [b], [i], [u], colores, [picture=…], [hyperlink=…], [action=…]
is_alignstring"start"Alineación horizontal: ALIGN_START, ALIGN_CENTER, ALIGN_END, ALIGN_JUSTIFY
is_valignstring"top"Alineación vertical dentro del control: VALIGN_TOP, VALIGN_CENTER, VALIGN_BOTTOM
ib_wrapbooleantrueSalto de línea automático. false fuerza una única línea
ib_ellipsisbooleanfalseCon ib_wrap = false, trunca el desbordamiento con puntos suspensivos en lugar de cortarlo en seco
ib_ellipsis_tooltipbooleanfalseOpt-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_familystring""Fuente predeterminada del bloque (vacío = fuente del tema)
ii_font_sizeinteger0Tamaño predeterminado en puntos (0 = tamaño del tema)
il_text_colorlong-1Color del texto RGB() (-1 = color del tema). Las etiquetas [color] siguen teniendo prioridad sobre su fragmento
ii_line_spacinginteger0Interlineado en porcentaje, de 50 a 400 (150 = 1,5 líneas; 0 = predeterminado). Un valor fuera de esos límites se lleva al más cercano, y se relee tal como se aplicó
ib_enabledbooleantrueBloque activo o atenuado (los enlaces y las acciones quedan inertes cuando está atenuado)
ib_selectablebooleanfalseOpt-in: permite al usuario seleccionar el texto y copiarlo con Ctrl+C (desactivado de forma predeterminada, como una etiqueta). Soltar el ratón tras una selección no genera ue_clicked

Aspecto de bloque (aire de «encabezado») #

PropiedadTipoPredeterminadoFunción
il_back_colorlong-1Fondo del bloque RGB() (-1 = fondo del tema). Con ii_corner_radius sigue el redondeo, y fuera de las esquinas el bloque muestra el color del objeto sobre el que está colocado
il_border_colorlong-1Color del borde (-1 = sin borde)
ii_border_widthinteger0Grosor del borde en píxeles (0 = sin borde)
ii_corner_radiusinteger0Radio de redondeo de las esquinas, en píxeles. El borde Y el fondo il_back_color lo siguen
ii_paddinginteger-1Margen interior en píxeles: -1 = el del tema (predeterminado), 0 = ningún margen (el texto se alinea con el borde de un campo vecino), más = píxeles
ib_hover_effectbooleanfalseOpt-in: ligero oscurecimiento al pasar el cursor (aclarado en un tema oscuro), para una etiqueta que actúa como botón

Modo desplazable (marquee) #

PropiedadTipoPredeterminadoFunción
ib_marqueebooleanfalseConvierte el bloque en una banda desplazable horizontalmente
ii_marquee_speedinteger60Velocidad de desplazamiento, en píxeles por segundo (0 = velocidad por defecto, 60)
is_marquee_directionstringMARQUEE_STARTSentido del desplazamiento: MARQUEE_START (hacia el inicio de la lectura) o MARQUEE_END. Se aceptan los alias físicos "left" / "right": siguen siendo físicos, sea cual sea el sentido de lectura. Cualquier otro valor vale, y se relee, MARQUEE_START
ib_marquee_overflow_onlybooleanfalseOpt-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_hoverbooleanfalseOpt-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 #

PropiedadTipoPredeterminadoFunción
ib_allow_dropbooleanfalseOpt-in: acepta que se suelten ficheros desde el Explorador de Windows; las rutas completas llegan por ue_drop_files. Un texto desactivado (ib_enabled = false) rechaza cualquier depósito
ib_track_mousebooleanfalseOpt-in: activa ue_mouse_enter / ue_mouse_leave
ib_track_cyclebooleanfalseOpt-in: activa ue_cycle, lanzado al final de cada pasada del desplazamiento; sin él, el texto se desplaza en silencio
ib_auto_heightbooleanfalseOpt-in: el bloque mide su altura ideal y redimensiona el userobject; véase Base común
ib_auto_widthbooleanfalseOpt-in: el userobject toma la ANCHURA de su texto — la línea más larga, sin salto de línea (los [br] cuentan), más el margen y el borde; un texto nuevo, una fuente o un margen lo redimensionan de nuevo, y ue_auto_width indica la anchura adoptada. Un texto desplazable (ib_marquee) no tiene anchura natural y no informa ninguna
ib_follow_endbooleanfalseOpt-in, para un registro escrito con of_append_text: la vista se queda ABAJO a medida que llegan las líneas — salvo si el lector ha subido a leer una línea más antigua: nunca se le aparta de ella
is_theme_stylestring""Estilo visual del componente (constantes THEME_STYLE_*); vacío = el de la aplicación, seguido en cada cambio
is_theme_modestring""Variante clara u oscura (constantes THEME_MODE_*); vacío = la de la aplicación, seguida en cada cambio
il_theme_accentlong-1Color de acento de este componente (-1 = acento de la aplicación, o el del tema)
is_tooltipstring""Tooltip simple mostrado al pasar el ratón por el componente
is_super_tooltip_titlestring""Título del tooltip enriquecido (prevalece sobre is_tooltip)
is_super_tooltip_textstring""Texto del tooltip enriquecido (se acepta el marcado enriquecido)
is_super_tooltip_imagestring""Imagen del tooltip enriquecido

Métodos #

MétodoFunción
of_reset ( )Devuelve todas las propiedades a su valor predeterminado y vacía el texto. Devuelve 0 una vez aplicado, -2 si el componente no está creado
of_set_redraw (boolean)Agrupa una ráfaga de modificaciones en una única representación. Devuelve 0 una vez aplicado, -2 si el componente no está creado
of_save_as_png (string) · of_save_as_jpg (string)Exporta la representación como imagen. Devuelve 0 una vez escrita la imagen, -4 si la escritura falla, -2 si el componente no está creado
of_refresh_parent_color ( )Vuelve a leer el color del objeto sobre el que está el bloque. Con il_back_color e ii_corner_radius, las esquinas redondeadas muestran ese color, leído cuando se asignan esas dos propiedades: llámela después de cambiar el BackColor de su ventana, o de mover el bloque a otro padre. Devuelve 0 una vez enviado, -2 si el componente no está creado
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. Devuelve 0 una vez enviado, -2 si el componente no está creado
of_append_text (string as_markup)Añade UNA línea al final del texto, para un registro: solo esa línea viaja al componente y solo ella se dibuja — reescribir is_text en cada línea reenviaba y redibujaba todo el registro. as_markup admite el mismo marcado que is_text; releído, is_text contiene todas las líneas, unidas por [br]. Con ib_follow_end la vista se queda abajo. Devuelve 0 una vez enviado, -2 si el componente no está creado

Eventos #

EventoSe activa cuando
ue_clicked ( )Clic izquierdo sobre el bloque — no se activa sobre una zona [action] o [hyperlink] (sin duplicados), sobre el encabezado de un [foldarea] (plegar no genera nada), ni tras una selección de texto
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_key)Se ha hecho clic en una zona [action=id]: le corresponde a usted enganchar ahí su código. La zona también se alcanza con el teclado: Tab hasta ella, luego Intro o Espacio
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_auto_width (long al_width)El bloque ha tomado una nueva anchura, en unidades PowerBuilder — requiere ib_auto_width = 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 (una animación DENTRO del texto nunca cuenta como pasada) — requiere ib_track_cycle = true
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.

// Congelar la visualizacion mientras se configura todo
uo_header.of_set_redraw(/*on*/ false)

// El titulo, centrado
uo_header.is_text  = "[b]Cuadro de mando de ventas"
uo_header.is_align = uo_header.ALIGN_CENTER

// Fondo liso y texto blanco legible
uo_header.il_back_color = RGB(/*red*/ 60, /*green*/ 110, /*blue*/ 190)
uo_header.il_text_color = RGB(/*red*/ 255, /*green*/ 255, /*blue*/ 255)
uo_header.ii_padding = 14

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

// Todo se dibuja de una vez
uo_header.of_set_redraw(/*on*/ true)
// event ue_auto_height de uo_header
of_reposition_below_header(al_height)   // desplaza el contenido bajo el encabezado

Texto enriquecido con enlace y acción #

// Un enlace a una pagina web y una accion que su aplicacion trata (ue_action)
uo_text.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_text : (string as_key)
choose case as_key
    case "renew" ; of_open_renewal()
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 #

// Dos secciones plegables : la segunda empieza plegada
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]"

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

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 #

// El mensaje de la banda
uo_banner.is_text = "[b]Información[/b] -- cierre excepcional del servicio el viernes 12."

// Modo desplazable, al estilo de un teletipo de noticias
uo_banner.ib_marquee = true
uo_banner.ii_marquee_speed = 90        // pixeles por segundo
uo_banner.is_marquee_direction = uo_banner.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.

Una vez puesto ib_track_cycle = true, 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_banner.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

// Lo que muestra la zona, centrado
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

// Cada fichero soltado, uno tras otro
for li = 1 to UpperBound(as_files)
    of_import(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(/*red*/ 21, /*green*/ 101, /*blue*/ 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 #

// Un texto que se comporta como un boton-enlace
uo_link.is_text = "Seleccionar todo"
uo_link.il_text_color = RGB(/*red*/ 21, /*green*/ 101, /*blue*/ 192)
uo_link.ii_padding = 8
uo_link.ii_corner_radius = 6
uo_link.ib_hover_effect = true       // reacciona al paso del cursor como un boton
// event ue_clicked de uo_link
of_select_all()

Un registro escrito línea a línea #

Cada llamada envía solo la línea añadida; ib_follow_end mantiene la última a la vista mientras el lector no suba.

// Once, when the window opens
uo_log.ib_follow_end = true
uo_log.is_text = "[b]Import[/b]"

// For every row imported : one line, sent alone
uo_log.of_append_text(/*markup*/ "Row " + String(ll_row) + " [color=#2e7d32]imported[/color]")

Una etiqueta tan ancha como su texto #

// A status chip : background, rounded corners, and the width of its text
uo_status.is_text = "[b]Status :[/b] connected"
uo_status.il_back_color = RGB(/*red*/ 232, /*green*/ 245, /*blue*/ 233)
uo_status.ii_corner_radius = 12
uo_status.ib_auto_width = true

Buenas prácticas #

Heredado de la base común #

Estos miembros existen en todos los componentes visuales — no son propios de este. Se detallan una sola vez, en los capítulos transversales; esta tabla solo dice dónde leerlos.

MiembrosFunciónDetallado en
of_resetPoner el componente a cero3.6 Poner un componente a cero: of_reset()
of_register_shortcut · of_clear_shortcutsAtajos de teclado del componente3.5 Los atajos de teclado
of_is_created · of_is_ready · of_get_last_errorSi ha nacido, si está listo, qué ha fallado3.7 Diagnóstico
of_save_as_png · of_save_as_jpgExportar el render como imagen3.8 Exportar la representación como imagen
of_set_redrawAgrupar los cambios en un solo repintado3.10 Buenas prácticas
of_preload_iconsIconos mostrados sin retardoVisualización instantánea: of_icon
of_set_translationTraducir una etiqueta del componente5.2 Adaptar una etiqueta: of_set_translation
of_focus_webviewDar el foco al componente6.4 Teclado y foco
of_print · of_print_to_pdfImprimir, o escribir un PDF6.9 Imprimir
of_set_property · of_get_property · of_component_nameControlar una propiedad por su nombre3.1 El motor de propiedades

Dos ayudas no se heredan: of_icon y of_escape_markup viven en n_pbt_utils. Declare uno — n_pbt_utils lnv_utils, nada que crear — y llámelas sobre él.


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