statusbar — u_pbt_statusbar #
← Referencia de componentes · Índice de la guía
Barra de estado con paneles: texto enriquecido, iconos, anchuras fijas o automáticas, alineación a la izquierda o a la derecha, paneles en los que se puede hacer clic, mini barra de progreso y estados con color.
▶ Verlo en vivo — Aplicación de demostración, mosaico Statusbar: la vista previa, el código que lo genera y esta página, uno al lado del otro.
De un vistazo #
| Userobject | u_pbt_statusbar |
| Clase de items | n_pbt_statusbar_panel (panel) · n_pbt_statusbar_menu_item (entrada de lista) |
| Sirve para | Mostrar en la parte inferior de la ventana el estado de la aplicación: contexto, avance, avisos discretos |
| Opciones opt-in | ib_announce |
Inicio rápido #
// event open de la ventana
// of_add_panel(clave, texto, icono, alineacion, anchura)
// la clave encuentra el panel mas tarde ; anchura 0 = ajustada al texto, -1 = toma el espacio libre
uo_status.of_add_panel(/*key*/ "state", /*text*/ "Ready", /*icon_file*/ "", /*align*/ uo_status.ALIGN_START, /*width*/ -1)
uo_status.of_add_panel(/*key*/ "pos", /*text*/ "Line 12, Col 4", /*icon_file*/ "", /*align*/ uo_status.ALIGN_START, /*width*/ 0)
uo_status.of_add_panel(/*key*/ "clock", /*text*/ "12:00", /*icon_file*/ "", /*align*/ uo_status.ALIGN_END, /*width*/ 140)
// Actualizar un panel en cualquier momento, mediante su identificador
uo_status.of_panel(/*key*/ "state").is_text = "Guardando..."
El modelo: paneles con clave #
La barra es una sucesión de paneles, añadidos por orden. Un panel recibe un identificador al crearse: es por él como se le encuentra después para cambiar su texto, su icono o su estado.
El identificador es una clave de direccionamiento, no un interruptor de interactividad:
- Identificador indicado: el panel se puede volver a encontrar — se cambia su contenido, se le pone una información sobre herramientas. Sigue siendo inerte: una barra de estado muestra ante todo, y un panel como
Línea 12, Col 4no debe parecer pulsable. Recibe sin embargo el clic derecho (ue_panel_rclicked) : un menú contextual « Copiar » no es una activación. - Identificador vacío: el panel es puramente decorativo. No se puede encontrar ni pulsar, y no se le puede adjuntar ninguna información sobre herramientas. Dé un identificador a todos sus paneles: no cuesta nada y deja la puerta abierta. Cuenta sin embargo en
of_county en las posiciones, yof_keys_atdevuelve para él una clave vacía. - Para hacer un panel pulsable, pídalo:
of_panel(/*key*/ "id").ib_clickable = true. Un panel dotado de una lista desplegable (of_add_menu_item) ya lo es.
// El panel muestra un texto nuevo
uo_status.of_panel(/*key*/ "state").is_text = "3 registros modificados"
Véase Base común · Los items.
Propiedades #
| Propiedad | Tipo | Predeterminado | Función |
|---|---|---|---|
ib_show_resize_grip | boolean | false | Muestra el asa de redimensionamiento en la esquina del final de la barra; arrastrarla redimensiona la ventana que lleva la barra — una hoja MDI, no su marco — desde su esquina inferior derecha (inferior izquierda en lectura de derecha a izquierda). Solo se dibuja cuando la barra ocupa la esquina inferior de esa ventana y la ventana puede redimensionarse: maximizada, sin borde redimensionable o con la barra colocada más arriba, desaparece y la propiedad sigue establecida |
ib_announce | boolean | false | Para los lectores de pantalla: a true, un texto o un estado que cambia en un panel visible se lee (una región viva cortés, que deja al lector terminar su frase). Un mensaje de of_flash_panel se lee siempre, diga lo que diga esta propiedad: un mensaje está hecho para leerse. Desactivado por defecto: un reloj al segundo hablaría todo el día |
is_help | string | "" | La MicroHelp de un marco PowerBuilder: lo que escribía SetMicroHelp. Se muestra ENCIMA del texto del panel que nombra is_help_panel — su is_text sigue leyendo su propio texto —; "" le devuelve su texto. Un mensaje de of_flash_panel pasa delante mientras dura |
is_help_panel | string | "" | Clave del panel que muestra is_help — normalmente el primero, el de Ready. Vacío = ningún panel de ayuda: is_help espera a que se nombre uno |
is_theme_style | string | "" | Estilo visual del componente (constantes THEME_STYLE_*); vacío = el de la aplicación, seguido en cada cambio |
is_theme_mode | string | "" | Variante clara u oscura (constantes THEME_MODE_*); vacío = la de la aplicación, seguida en cada cambio |
il_theme_accent | long | -1 | Color de acento de este componente (-1 = acento de la aplicación, o el 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_add_panel (string as_key, string as_text, string as_icon_file, string as_align, integer ai_width) | Añade un panel al final de la barra; una anchura de -1 lo convierte en un muelle que toma el espacio libre (ib_spring). Devuelve 0 una vez aplicado, -5 si la clave ya está tomada, contiene / o ` | o empieza por __ (una clave vacía añade un panel decorativo), -2` si el componente no está creado |
of_add_sep ( ) | Inserta una ruptura de grupo en la posición actual. Los paneles ya se separan con una línea fina : esta es más ancha, para que los paneles de antes y de después se lean como dos grupos. Llámela entre dos of_add_panel ; abre el grupo del panel que la sigue (del lado del anterior cuando viene la última). Un separador no es un panel : no cuenta ni para of_count / of_keys_at ni en las posiciones. Devuelve 0 una vez aplicado, -2 si el componente no está creado | |
of_insert_panel (string as_key, string as_text, string as_icon_file, string as_align, integer ai_width, integer ai_index) | Inserta un panel en una posición concreta, contada en paneles a partir de 1 (0 o menos = el primero, más allá del último = al final). Mismos rechazos que of_add_panel. Devuelve 0 una vez aplicado, -5 si la clave ya está tomada o contiene / o ` | , -2` si el componente no está creado |
of_move_panel (string as_key, integer ai_index) | Desplaza un panel existente a otra posición, contada en paneles a partir de 1. Devuelve 0 una vez aplicado, -5 ante una clave vacía o que la barra nunca recibió, -2 si el componente no está creado | |
of_remove_panel (string as_key) | Elimina un solo panel, con su lista desplegable ; los demás conservan su estado. Devuelve 0 una vez aplicado, -5 ante una clave vacía o que la barra nunca recibió, -2 si el componente no está creado | |
of_panel (string as_key) → n_pbt_statusbar_panel | Devuelve el handle de un panel (creado en el primer acceso). Una clave vacía (panel decorativo), una dirección o una lista no designan nada: su handle no escribe en ninguna parte y se relee vacío | |
of_flash_panel (string as_key, string as_text, long al_ms) | Muestra un mensaje durante al_ms milisegundos y luego vuelve a mostrar el texto del panel (al_ms ≤ 0 = 2 segundos). El mensaje pasa POR ENCIMA del texto: is_text se relee siempre como el texto del panel, nunca como el mensaje. Devuelve 0 una vez aplicado, -5 ante una clave vacía, una dirección o una clave que la barra nunca recibió, -2 si el componente no está creado | |
of_add_menu_item (string as_keys, string as_label) · (as_keys, as_label, as_image) | Añade una entrada a la lista desplegable de un panel : as_keys tiene dos niveles, el panel y luego la entrada ("enc/utf8"). Desde la primera entrada el panel se vuelve un selector : el clic abre la lista, y la elección vuelve por ue_panel_menu_clicked con la misma dirección. Una etiqueta vacía toma la clave. Devuelve 0 una vez aplicado, -5 ante una dirección que no tiene dos niveles, un panel que la barra nunca recibió o una entrada ya tomada, -2 si el componente no está creado | |
of_insert_menu_item (string as_keys, string as_label, integer ai_index) · (as_keys, as_label, as_image, ai_index) | Inserta una entrada en una posición precisa, contada en entradas a partir de 1: un separador no lo es. Devuelve 0 una vez aplicado, -5 con una dirección que no tiene dos niveles, una clave que empieza por __, un panel que la barra nunca recibió o una entrada ya tomada, -2 si el componente no está creado | |
of_add_menu_separator (string as_key) | Línea de separación en la lista del panel as_key. Un separador no tiene dirección: solo of_clear_menu lo retira, y una lista hecha solo de separadores no es una lista (ni flecha ni clic). Devuelve 0 una vez aplicado, -5 ante una clave vacía o un panel que la barra nunca recibió, -2 si el componente no está creado | |
of_remove_menu_item (string as_keys) | Quita una sola entrada; ida la última, el panel recupera el comportamiento que le da ib_clickable. Devuelve 0 una vez aplicado, -5 con una dirección que la barra nunca recibió, -2 si el componente no está creado | |
of_move_menu_item (string as_keys, integer ai_index) | Mueve una entrada a otra posición de su lista, contada en entradas a partir de 1: un separador no lo es. Devuelve 0 una vez aplicado, -5 con una dirección que la barra nunca recibió, -2 si el componente no está creado | |
of_menu_item (string as_keys) → n_pbt_statusbar_menu_item | Devuelve el handle de una entrada (creado en el primer acceso), para atenuarla, marcarla o renombrarla. Una dirección sin dos niveles no designa nada : su handle no escribe en ningún sitio y se relee vacío | |
of_clear_menu (string as_key) | Quita toda la lista desplegable; el panel recupera el comportamiento que le da ib_clickable. Devuelve 0 una vez aplicado, -5 con una clave vacía, una dirección o un panel que la barra nunca recibió, -2 si el componente no está creado | |
of_dock_bottom ( ) | Coloca la barra a lo largo del borde INFERIOR de lo que la lleva (una ventana, una pestaña, un userobject), en todo su ancho; su altura no cambia. Llámela en el evento resize de la ventana. En un marco MDI, redimensione mdi_1 al espacio que queda: WorkSpaceHeight() - uo_status.Height. Devuelve 0 una vez colocada, -5 si la barra no está ni en una ventana ni en un userobject, -2 si el componente no está creado | |
of_clear ( ) | Vacía la barra: todos los paneles y todos los separadores. Devuelve 0 una vez aplicado, -2 si el componente no está creado | |
of_reset ( ) | Vacía la barra y devuelve las propiedades a su valor predeterminado. Devuelve 0 una vez aplicado, -2 si el componente no está creado |
Los argumentos de of_add_panel #
| Argumento | Valores | Efecto |
|---|---|---|
as_key | libre, o "" | Clave del panel, con la que se le vuelve a encontrar después. Vacío = panel decorativo, ni direccionable ni pulsable |
as_text | texto | Contenido del panel. Se acepta el texto enriquecido con etiquetas |
as_icon_file | ruta de imagen, o "" | Icono mostrado antes del texto (formas aceptadas) |
as_align | ALIGN_START (predeterminado) o ALIGN_END | Lado hacia el que se empuja el panel. Valores lógicos: START = inicio de la lectura (izquierda en escritura de izquierda a derecha). Los alias físicos "left" / "right" siguen aceptándose |
ai_width | píxeles, 0 o -1 | Anchura fija. 0 = el panel se ajusta a su contenido; -1 = un muelle que toma todo el espacio libre de la barra (ib_spring) |
En un panel — n_pbt_statusbar_panel #
| Miembro | Tipo | Predeterminado | Función |
|---|---|---|---|
is_text | string | "" | Texto del panel, se acepta el texto enriquecido con etiquetas |
is_image | string | "" | Icono del panel, modificable en cualquier momento |
ib_enabled | boolean | true | Panel atenuado y sin clic |
ib_visible | boolean | true | Panel oculto, sin ser retirado de la barra |
ii_progress | integer | — | Minibarra de progreso en el panel, junto al texto, de 0 a 100 (por encima de 100 la barra está llena y se relee 100); un valor negativo la hace desaparecer. Se relee -1 cuando el panel no tiene barra (y 0 para una barra al 0 %) |
is_state | string | "" | Estado semántico del panel, que colorea su texto y marca su borde inicial: véanse las constantes más abajo. Cualquier otro valor equivale a « ningún estado » y se relee vacío; un panel desactivado aparece atenuado, marca de estado incluida |
ib_indeterminate | boolean | false | Barra animada sin valor, para un tratamiento de duración desconocida. Independiente de ii_progress, que sigue siendo el porcentaje exacto |
ib_clickable | boolean | false | ¿Reacciona el panel al clic? Opt-in: un panel permanece inerte mientras no se pida, conservando su clave — se pilota y lleva una información sobre herramientas. Un panel con lista desplegable ya es pulsable |
ib_spring | boolean | false | Muelle: el panel toma todo el espacio libre de la barra, y su texto es el primero en recortarse cuando la ventana se estrecha — el panel Ready que crece con la ventana. Varios muelles se reparten el espacio; una anchura fija cede |
is_tooltip | string | "" | Información sobre herramientas del panel (se acepta el marcado de texto enriquecido). También aparece en un panel atenuado, para decir por qué. Sin ella, un panel cuyo texto está recortado muestra su texto entero al pasar el ratón |
is_super_tooltip_title | string | "" | Título de la información enriquecida del panel (prevalece sobre is_tooltip) |
is_super_tooltip_text | string | "" | Texto de la información enriquecida del panel (se acepta el marcado) |
is_super_tooltip_image | string | "" | Imagen de la información enriquecida del panel |
il_accent | long | -1 | Acento de este panel: el relleno de su mini barra de progreso. -1 = el acento del componente |
il_back_color | long | -1 | Fondo de este panel en reposo. -1 = el de la barra |
il_text_color | long | -1 | Color del texto de este panel en reposo. Un estado (is_state) o un panel atenuado pinta primero su propio color: el significado gana al color. -1 = el de la barra |
il_back_color_hover | long | -1 | Fondo bajo el puntero — solo un panel clicable (ib_clickable) responde al puntero. -1 = el del tema |
il_text_color_hover | long | -1 | Color del texto bajo el puntero, en un panel clicable. -1 = el del tema |
En una entrada de lista — n_pbt_statusbar_menu_item #
Obtenida con of_menu_item(/*keys*/ "enc/utf8"): la dirección tiene dos niveles, el panel y luego la entrada. La lista es un menú nativo: una propiedad cambiada mientras está abierto se ve en la siguiente apertura.
| Miembro | Tipo | Predeterminado | Función |
|---|---|---|---|
is_label | string | "" | Texto de la entrada |
is_image | string | "" | Imagen delante del texto, modificable en cualquier momento |
ib_enabled | boolean | true | Entrada atenuada: se muestra, pero no se puede elegir |
ib_checked | boolean | false | Marca delante de la entrada, para el valor en uso |
ib_visible | boolean | true | Entrada retirada de la lista sin ser eliminada: volver a mostrarla no requiere nada más |
Las propiedades que hereda todo manejador de elemento — is_tooltip, is_super_tooltip_title, is_super_tooltip_text, is_super_tooltip_image, il_accent, il_back_color, il_text_color, il_back_color_hover, il_text_color_hover — no tienen efecto en una entrada: la lista es un menú nativo, que no muestra ni información sobre herramientas ni colores de una entrada. Se ignoran y se releen vacías (-1 para un color). Una posición en una lista cuenta entradas: un separador no lo es, y of_count("enc"), of_keys_at("enc", n), of_has("enc/utf8") recorren las entradas de un panel. Una clave que empieza por __ está reservada al componente.
// The menu of the encoding panel, entry by entry
uo_status.of_add_menu_item(/*keys*/ "enc/utf8", /*label*/ "UTF-8")
uo_status.of_add_menu_item(/*keys*/ "enc/ansi", /*label*/ "ANSI")
uo_status.of_menu_item(/*keys*/ "enc/utf8").ib_checked = true // the current value
uo_status.of_menu_item(/*keys*/ "enc/ansi").ib_enabled = false // not available here
Constantes de estado #
| Constante | Valor | Uso |
|---|---|---|
STATE_NONE | "" | Ningún estado: apariencia normal |
STATE_INFO | "info" | Información |
STATE_WARNING | "warning" | Advertencia |
STATE_ERROR | "error" | Error |
STATE_SUCCESS | "success" | Éxito |
Como para toda propiedad con valores predefinidos, utilice la constante en lugar de la cadena:
// The panel takes the colors of a warning
uo_status.of_panel(/*key*/ "state").is_state = n_pbt_statusbar_panel.STATE_WARNING
Eventos #
| Evento | Se activa cuando |
|---|---|
ue_panel_clicked (string as_key) | Se hace clic en un panel pulsable (ib_clickable) |
ue_panel_double_clicked (string as_key) | Un panel pulsable recibe un doble clic — el atajo clásico detrás de Línea 12, Col 4 que abre un "Ir a la línea". Nunca en un panel con lista desplegable: su primer clic abrió la lista |
ue_panel_rclicked (string as_key, long al_x, long al_y) | Un panel con clave recibe un clic derecho — clicable o no (un menú contextual no es una activación), nunca si está desactivado. Un solo evento por clic derecho. al_x y al_y son píxeles de pantalla ; para un menú PowerBuilder, PopMenu(PointerX(), PointerY()) de su ventana. Desde el teclado, la tecla Menú o Mayús+F10 sobre el panel que tiene el foco lo lanza también, en la esquina inferior izquierda del panel |
ue_panel_menu_clicked (string as_keys) | Se ha elegido una entrada de una lista desplegable de panel (véase of_add_menu_item). as_keys lleva los dos niveles: el panel, luego la entrada — "enc/utf8". Con el teclado, Intro, Espacio, Flecha arriba o abajo abren la lista. Un panel retirado, desactivado u ocultado mientras su lista está abierta la cierra, y no se activa nada |
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) |
Con el teclado #
La barra es una sola parada de tabulación: solo entran en ella los paneles hechos para ser pulsados, y las flechas los recorren.
| Tecla | Efecto |
|---|---|
| Flechas | Pasan al panel interactivo anterior / siguiente, en bucle; los paneles de visualización y los desactivados se saltan |
| Inicio / Fin | Primer / último panel interactivo |
| Intro o Espacio | Dispara el panel — es decir, ue_panel_clicked, o la apertura de su lista desplegable si la tiene |
| Arriba / Abajo | En un panel que lleva una lista desplegable: la abren, encima del panel |
| Tecla Menú o Mayús+F10 | ue_panel_rclicked del panel que tiene el foco, en su esquina inferior izquierda |
Un panel que se limita a mostrar no es un control: no es enfocable ni se anuncia como tal. Un panel pulsable pero desactivado sí permanece anunciado como no disponible, en lugar de pasar por texto. Una barra de progreso anuncia su valor, y una indeterminada no anuncia ninguno — esa ausencia es el sentido de la palabra. Un panel clicable atenuado sigue mostrando su información sobre herramientas — la que dice por qué está atenuado — y un panel con lista dice si su lista está abierta.
Un lector de pantalla oye los mensajes de of_flash_panel sin que el foco se mueva: para eso sirve una barra de estado (una región viva cortés). Los demás cambios — un texto nuevo, un estado nuevo — solo se leen con ib_announce = true; si no, un reloj al segundo hablaría todo el día.
El foco sobrevive a la reconstrucción de la barra: un panel añadido, quitado, oculto o atenuado la reconstruye, y el foco vuelve al mismo panel (al siguiente cuando ya no puede tomarlo). Un texto, un estado o un progreso cambian en su sitio, sin reconstruir nada — un reloj al segundo nunca roba el foco.
Ejemplos #
Anchuras fijas y anchuras automáticas #
// Anchura 0 : el panel ocupa exactamente el espacio de su texto
uo_status.of_add_panel(/*key*/ "", /*text*/ "Panel ajustado al contenido", /*icon_file*/ "", /*align*/ uo_status.ALIGN_START, /*width*/ 0)
// Anchura fija en pixeles : util cuando el texto cambia a menudo,
// para que los paneles vecinos no se muevan en cada actualizacion
uo_status.of_add_panel(/*key*/ "pos", /*text*/ "Línea 1, Col 1", /*icon_file*/ "", /*align*/ uo_status.ALIGN_START, /*width*/ 150)
// Un panel empujado al extremo opuesto
uo_status.of_add_panel(/*key*/ "clock", /*text*/ "12:00", /*icon_file*/ "", /*align*/ uo_status.ALIGN_END, /*width*/ 140)
Iconos y paneles con clic #
// Una clave hace el panel direccionable ; ib_clickable lo hace pulsable
uo_status.of_add_panel(/*key*/ "save", /*text*/ "Guardado", /*icon_file*/ "mono:img\save.svg", /*align*/ uo_status.ALIGN_START, /*width*/ 0)
uo_status.of_add_sep() // linea de separacion entre dos grupos de paneles
uo_status.of_add_panel(/*key*/ "conn", /*text*/ "Conectado", /*icon_file*/ "mono:img\plug.svg", /*align*/ uo_status.ALIGN_START, /*width*/ 0)
uo_status.of_add_panel(/*key*/ "user", /*text*/ "Alex Martin", /*icon_file*/ "mono:img\user.svg", /*align*/ uo_status.ALIGN_END, /*width*/ 160)
// Solo estos dos responden al clic (ue_panel_clicked)
uo_status.of_panel(/*key*/ "conn").ib_clickable = true
uo_status.of_panel(/*key*/ "user").ib_clickable = true
// event ue_panel_clicked de uo_status
choose case as_key
case "conn" ; open(w_connection_settings)
case "user" ; open(w_profile)
end choose
Texto enriquecido en un panel #
Los paneles aceptan el texto enriquecido con etiquetas: estilos, colores y pequeñas imágenes directamente en el texto.
// Una bienvenida a la izquierda
uo_status.of_add_panel(/*key*/ "", /*text*/ "Bienvenido [b]a[/b] [accent]PBToolboxAI[/accent]", &
/*icon_file*/ "", /*align*/ uo_status.ALIGN_START, /*width*/ 0)
// El estado de la conexion a la derecha
uo_status.of_add_panel(/*key*/ "", /*text*/ "[green]En línea[/green] [picture=mono:img\plug.svg,14,14]", &
/*icon_file*/ "", /*align*/ uo_status.ALIGN_END, /*width*/ 0)
// Variables locales
long ll_changed
// El texto enriquecido vale tambien para las actualizaciones
ll_changed = dw_list.ModifiedCount()
uo_status.of_panel(/*key*/ "state").is_text = "[b]" + String(ll_changed) + "[/b] records changed"
Seguir un proceso largo #
// Local variables
n_pbt_statusbar_panel lnv_import
// El panel de importacion, luego su handle para seguirlo
uo_status.of_add_panel(/*key*/ "import", /*text*/ "Importación", /*icon_file*/ "", /*align*/ uo_status.ALIGN_START, /*width*/ 220)
lnv_import = uo_status.of_panel(/*key*/ "import")
// Variables locales
long ll_percent
// En el bucle de tratamiento : la mini barra sigue el progreso
for ll_percent = 0 to 100 step 25
lnv_import.ii_progress = ll_percent
lnv_import.is_text = "Import " + String(ll_percent) + " %"
next
// Al final : ocultar la mini barra y senalar el resultado
lnv_import.ii_progress = -1 // valor negativo = barra oculta
lnv_import.is_text = "Importación finalizada"
lnv_import.is_state = lnv_import.STATE_SUCCESS
Señalar un aviso discreto #
// Local variables
n_pbt_statusbar_panel lnv_panel
// El panel de la conexion
lnv_panel = uo_status.of_panel(/*key*/ "conn")
// Sin conexion : el panel muestra un error ; conectado : vuelve a la normalidad
if not ib_connected then
lnv_panel.is_text = "Sin conexión"
lnv_panel.is_state = lnv_panel.STATE_ERROR
else
lnv_panel.is_text = "Conectado"
lnv_panel.is_state = lnv_panel.STATE_NONE // vuelta a la apariencia normal
end if
Adaptar la barra al contexto #
// Ocultar un panel sin eliminarlo : mas tarde recuperara su sitio
uo_status.of_panel(/*key*/ "user").ib_visible = ib_user_signed_in
// Atenuarlo cuando la accion correspondiente no tiene sentido
uo_status.of_panel(/*key*/ "save").ib_enabled = ib_document_open
// Reorganizar : colocar el panel de estado al principio (posiciones contadas a partir de 1)
uo_status.of_move_panel(/*key*/ "state", /*index*/ 1)
// Retirar un panel que ya no sirve
uo_status.of_remove_panel(/*key*/ "import")
El asa de redimensionamiento #
// Arrastrar el asa de la esquina redimensiona la ventana que lleva la barra (oculta mientras esta maximizada)
uo_status.ib_show_resize_grip = true
Un panel que toma el espacio libre #
Como el panel « Listo » de toda barra de estado de Windows: crece con la ventana, empuja los paneles del final hasta el extremo, y su texto es el primero en recortarse cuando falta espacio.
// Una anchura de -1 : el panel toma todo el espacio libre
uo_status.of_add_panel(/*key*/ "state", /*text*/ "Ready", /*icon_file*/ "", /*align*/ uo_status.ALIGN_START, /*width*/ -1)
uo_status.of_add_panel(/*key*/ "clock", /*text*/ "12:00", /*icon_file*/ "", /*align*/ uo_status.ALIGN_END, /*width*/ 140)
// Lo mismo en un panel que ya existe
uo_status.of_panel(/*key*/ "state").ib_spring = true
Colocar la barra al pie de la ventana #
of_dock_bottom la coloca a lo largo del borde inferior de lo que la lleva, en todo el ancho: basta una llamada en el evento resize. En un marco MDI, las hojas se reparten lo que queda encima.
// evento resize de la ventana : la barra sigue el borde inferior
uo_status.of_dock_bottom()
// evento resize de un marco MDI : la barra abajo, las hojas encima
uo_status.of_dock_bottom()
mdi_1.Resize(WorkSpaceWidth(), WorkSpaceHeight() - uo_status.Height)
Retomar la MicroHelp #
En un marco MDI con MicroHelp, PowerBuilder escribe la ayuda del elemento de menú bajo el puntero, y SetMicroHelp escribe la suya. La barra retoma ese papel: nombre una vez el panel que muestra la ayuda (is_help_panel) y luego escriba is_help donde llamaba a SetMicroHelp. La ayuda se muestra encima del texto del panel, y "" le devuelve el texto.
// Una vez : el panel que muestra la ayuda (el primero, normalmente)
uo_status.is_help_panel = "state"
// Donde llamaba a SetMicroHelp : la ayuda aparece encima de Ready
uo_status.is_help = "Saving the order..."
// "" devuelve al panel su propio texto
uo_status.is_help = ""
// evento ue_item_hover de una menubar (uo_menu) : la ayuda de la entrada bajo el puntero
uo_status.is_help = this.of_item(/*keys*/ as_keys).is_tooltip
// evento getfocus de un campo (sle_name) : su Tag es su ayuda
uo_status.is_help = sle_name.Tag
Buenas prácticas #
- Dé una anchura fija a los paneles cuyo texto cambia a menudo (posición del cursor, contadores): los paneles vecinos dejarán de saltar en cada actualización.
- Haga del primer panel un muelle (
ib_spring, o una anchura de-1): toma el espacio libre, y su texto es el primero en recortarse. - Un panel es inerte por defecto: pida el clic con
ib_clickable, y deje sin reacción los paneles que solo muestran. - Reserve el final de la barra (
ALIGN_END) a la información estable (hora, usuario, conexión) y el principio (ALIGN_START) al contexto actual; en lectura de derecha a izquierda, los dos lados se invierten solos. - Emplee
is_stateen lugar de colores en el texto: el estado sigue tanto el tema claro como el oscuro. - Recuerde devolver
is_stateaSTATE_NONEyii_progressa un valor negativo en cuanto el aviso o el proceso haya terminado. - Una barra de estado no es un registro: más allá de cinco o seis paneles, es preferible una notificación toaster.
- Si el avance merece más que una mini barra de panel, pase a la progressbar.
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.
| Miembros | Función | Detallado en |
|---|---|---|
of_count · of_keys_at · of_has | Recorrer lo que el componente contiene | 3.2 Los items |
of_reset | Poner el componente a cero | 3.6 Poner un componente a cero: of_reset() |
of_register_shortcut · of_clear_shortcuts | Atajos de teclado del componente | 3.5 Los atajos de teclado |
of_is_created · of_is_ready · of_get_last_error | Si ha nacido, si está listo, qué ha fallado | 3.7 Diagnóstico |
of_save_as_png · of_save_as_jpg | Exportar el render como imagen | 3.8 Exportar la representación como imagen |
of_set_redraw | Agrupar los cambios en un solo repintado | 3.10 Buenas prácticas |
of_preload_icons | Iconos mostrados sin retardo | Visualización instantánea: of_icon |
of_set_translation | Traducir una etiqueta del componente | 5.2 Adaptar una etiqueta: of_set_translation |
of_focus_webview | Dar el foco al componente | 6.4 Teclado y foco |
of_print · of_print_to_pdf | Imprimir, o escribir un PDF | 6.9 Imprimir |
of_set_property · of_get_property · of_component_name | Controlar una propiedad por su nombre | 3.1 El motor de propiedades |
is_accessible_name · is_accessible_description | El nombre y la descripción que dice un lector de pantalla | 3.4 Propiedades y eventos opcionales |
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.