PBToolboxAI v2 ← Site

dockcontainer — u_pbt_dockcontainer #

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

Paneles acoplables al estilo de Visual Studio: acoplamiento mediante arrastrar y soltar, apilamiento en pestañas, separadores redimensionables, ventanas flotantes, ocultación automática — y guardado/restauración de la disposición.

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


De un vistazo #

Userobjectu_pbt_dockcontainer
Clase de itemsn_pbt_dock_panel (un panel)
Sirve paraDar a una ventana PowerBuilder la ergonomía de un IDE moderno: el usuario organiza él mismo sus paneles, y la disposición reaparece en la sesión siguiente

Al igual que tab, cada panel aloja un control real de PowerBuilder (dragobject): userobject, DataWindow u otro componente PBToolboxAI. Véase Alojar controles reales de PowerBuilder.


Inicio rápido #

// event open de la ventana : los controles de panel ya estan colocados en ella
uo_dock.of_add_panel(/*clave*/ "document", /*posicion*/ "", /*relativo_a*/ "", &
                     /*tamano*/ 0, /*titulo*/ "Documento", /*contenido*/ uo_editeur)

uo_dock.of_add_panel(/*clave*/ "explorateur", /*posicion*/ uo_dock.POSITION_START, &
                     /*relativo_a*/ "document", /*tamano*/ 260, &
                     /*titulo*/ "Explorador", /*contenido*/ uo_arbre)

uo_dock.of_add_panel(/*clave*/ "proprietes", /*posicion*/ uo_dock.POSITION_END, &
                     /*relativo_a*/ "document", /*tamano*/ 300, &
                     /*titulo*/ "Propiedades", /*contenido*/ uo_props)

// La zona central : ni cerrable por el acoplamiento, ni flotante, ni ocultable
uo_dock.is_main = "document"

Propiedades #

PropiedadTipoPredeterminadoFunción
is_mainstring""Clave del panel principal: la zona de documento central, que no puede ocultarse ni desacoplarse. El panel debe existir ya
is_theme_stylestringfluentEstilo visual del componente (constantes THEME_STYLE_*)
is_theme_modestringlightVariante clara u oscura (constantes THEME_MODE_*)
il_theme_accentlong-1Color de acento de este componente (-1 = acento 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

Posiciones de acoplamiento #

Las constantes del componente alimentan as_position en of_add_panel y of_move_panel:

ConstanteValorEfecto
POSITION_START"start"El nuevo panel se acopla por el lado de inicio de lectura del panel de referencia (a la izquierda en escritura de izquierda a derecha)
POSITION_END"end"… por el lado de fin de lectura
POSITION_TOP"top"… encima
POSITION_BOTTOM"bottom"… debajo
POSITION_STACK"stack"El panel se apila como pestaña sobre el panel de referencia. Valor adoptado si as_position está vacío

Propiedades de un panel — n_pbt_dock_panel #

Obtenidas mediante of_panel(clave).

PropiedadTipoPredeterminadoFunción
is_titlestring""Título mostrado en la pestaña del panel. Acepta el texto enriquecido con etiquetas
is_short_titlestring""Forma corta del título, para los lugares donde falta espacio: el raíl de un panel anclado (siempre — es una franja estrecha) y la pestaña de una pila, pero solo cuando el título completo ya no cabe, algo que se mide en lugar de adivinarse. La cabecera del panel conserva el título completo. "" = sin forma corta
ib_visiblebooleantrueMuestra u oculta este panel
ib_pinnedbooleantruetrue = fijado en su sitio; false = el panel se repliega en una lengüeta sobre el borde y solo se despliega al pasar el cursor (ocultación automática)
is_header_colorstring""Color de la cabecera de este panel. Vacío = decide el tema; HEADER_COLOR_ACCENT sigue el acento del tema (y lo sigue tras un cambio de tema, cosa que un código fijo no haría); si no, un #rrggbb. El color de texto legible se calcula
is_border_colorstring""Color del borde de este panel, misma gramática. Enmarca el marco y la cabecera, que tienen cada uno el suyo: colorear solo uno deja una costura visible. Acompaña al panel en su panel deslizante
is_tooltipstring""Tooltip simple mostrado al pasar el ratón por el item
is_super_tooltip_titlestring""Título del tooltip enriquecido del item (prevalece sobre is_tooltip)
is_super_tooltip_textstring""Texto del tooltip enriquecido del item (se acepta el marcado enriquecido)
is_super_tooltip_imagestring""Imagen del tooltip enriquecido del item

Métodos #

MétodoFunción
of_add_panel (string as_key, string as_position, string as_relative_to, integer ai_size, string as_title, dragobject ado_content)Añade un panel cerrable y aloja el control. as_relative_to = clave del panel contra el que se acopla (vacío = la raíz); ai_size = tamaño inicial en píxeles (0 = automático). Devuelve 0 una vez aplicado, -5 ante un argumento no válido (clave vacía, dirección errónea), -2 si el componente no está creado
of_add_panel (…, boolean ab_closable)Ídem, con ab_closable = false para un panel sin botón de cierre. Devuelve 0 una vez aplicado, -5 ante un argumento no válido (clave vacía, dirección errónea), -2 si el componente no está creado
of_select_panel (string as_key)Pone un panel en primer plano dentro de su grupo de pestañas. Devuelve 0 una vez aplicado, -5 ante un argumento no válido (clave vacía, dirección errónea), -2 si el componente no está creado
of_move_panel (string as_key, string as_target, string as_position)Reorganiza desde el código, exactamente como si el usuario hubiera arrastrado la pestaña. Devuelve 0 una vez aplicado, -5 ante un argumento no válido (clave vacía, dirección errónea), -2 si el componente no está creado
of_move_panel (string as_key, string as_target, string as_position, integer ai_index)Lo mismo, indicando el rango del panel en la pila del destino (0 = primero, -1 = último). Solo una pila es una lista ordenada: el índice se ignora para POSITION_START / END / TOP / BOTTOM. Devuelve 0 una vez aplicado, -5 ante un argumento no válido (clave vacía, dirección errónea), -2 si el componente no está creado
of_float_panel (string as_key)Desacopla el panel en una auténtica ventana flotante desplazable y redimensionable. Al cerrarla, el panel se vuelve a acoplar (ue_panel_docked). No el panel principal (is_main): es la zona de documento alrededor de la cual se colocan los demás, construye su propia cabecera, y no puede ser ni desprendido, ni ocultado, ni cerrado. Devuelve 0 una vez aplicado, -5 ante un argumento no válido (clave vacía, dirección errónea), -2 si el componente no está creado
of_notify_panel (string as_key)Señala contenido nuevo: si el panel no está visible, su pestaña muestra un contador de elementos no vistos, que se borra al seleccionarlo. Devuelve 0 una vez aplicado, -5 ante un argumento no válido (clave vacía, dirección errónea), -2 si el componente no está creado
of_clear_notify (string as_key)Borra ese contador sin mostrar el panel. Seleccionar la pestaña era la única otra forma, lo cual es incorrecto cuando su código sabe que el contenido en sí ha desaparecido. Devuelve 0 una vez aplicado, -5 ante un argumento no válido (clave vacía, dirección errónea), -2 si el componente no está creado
of_remove_panel (string as_key)Retira el panel y devuelve el control a su ventana de origen. Devuelve 0 una vez aplicado, -5 ante un argumento no válido (clave vacía, dirección errónea), -2 si el componente no está creado
of_get_layout ( )Devuelve la disposición actual (árbol de divisiones, proporciones, pestañas, visibilidad) en forma de cadena, para almacenarla en un archivo, una base de datos o el registro
of_set_layout (string as_json)Restaura una disposición obtenida con of_get_layout. Los paneles deben haberse vuelto a crear antes de la llamada; los ausentes de la disposición se adjuntan al primer grupo. Devuelve 0 una vez aplicado, -5 ante un argumento no válido (clave vacía, dirección errónea), -2 si el componente no está creado
of_panel (string as_key)Handle n_pbt_dock_panel del panel (creado en el primer acceso)
of_refresh_panel (string as_key)Actualiza la representación de un panel construido fuera de pantalla, sin parpadeo. Devuelve 0, -5 si la clave no designa ningún panel, -2 si el componente no está creado
of_relayout ( )Recalcula y vuelve a publicar todas las zonas para que los controles alojados se reposicionen. Devuelve 0 una vez aplicado, -2 si el componente no está creado
of_reset ( )Vacía el contenedor: cada control alojado vuelve a su ventana de origen, los handles de paneles se liberan y la disposición memorizada se borra. Devuelve 0 una vez aplicado, -2 si el componente no está creado
of_set_redraw (boolean)Agrupa una ráfaga de modificaciones en una sola 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

Eventos #

EventoSe activa cuando
ue_panel_selected (string as_key)Un panel pasa a ser el panel activo de su grupo
ue_panel_closed (string as_key)El usuario cierra un panel
ue_panel_pinned (string as_key, boolean ab_pinned)Un panel se fija (true) o se desfija en ocultación automática (false)
ue_panel_floated (string as_key)Un panel se desacopla en ventana flotante
ue_panel_docked (string as_key)Un panel flotante se vuelve a acoplar
ue_layout_changed (string as_json)La disposición ha cambiado (arrastre, redimensionamiento, acoplamiento). El parámetro lleva la nueva disposición, lista para guardarse
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 #

El contenido de un panel es un verdadero control PowerBuilder: allí el teclado pertenece a su código, como en cualquier ventana. De lo que se encarga el componente es de su propio armazón — encabezados, pestañas, divisores:

TeclaEfecto
Flechas sobre una pestañaPasan al panel anterior / siguiente del grupo y lo seleccionan. Una banda de pestañas es una sola parada de tabulación
Inicio / Fin sobre una pestañaPrimer / último panel del grupo
Flechas sobre un divisorDesplazan la separación un 2 %, únicamente en el eje del divisor
Re Pág / Av Pág sobre un divisorLo mismo, en pasos del 10 %
EscCierra el panel deslizante abierto desde un botón de borde

Un divisor es un separator enfocable que anuncia su posición; los botones del encabezado (desacoplar, ocultar, cerrar) llevan un nombre, y el panel activo de un grupo está marcado con aria-selected. Un desplazamiento con el teclado se informa en ue_layout_changed exactamente igual que un arrastre con el ratón.


Ejemplos #

Una ventana al estilo de un IDE #

// event open : cada contenido es un control PB real colocado en la ventana
uo_dock.of_add_panel("document", "", "", 0, "Documento", uo_editeur)
uo_dock.of_add_panel("explorateur", uo_dock.POSITION_START,   "document", 260, "Explorador", uo_arbre)
uo_dock.of_add_panel("proprietes",  uo_dock.POSITION_END,  "document", 300, "Propiedades",  uo_props)
uo_dock.of_add_panel("sortie",      uo_dock.POSITION_BOTTOM, "document", 200, "Salida",      uo_console)

// Un segundo panel apilado como pestana sobre "proprietes"
uo_dock.of_add_panel("aide", uo_dock.POSITION_STACK, "proprietes", 0, "Ayuda", uo_aide)

uo_dock.is_main = "document"

Memorizar y restaurar la disposición del usuario #

// event close de la ventana : guardar lo que el usuario ha organizado
string ls_disposition
ls_disposition = uo_dock.of_get_layout()
of_enregistrer_preference("dock_principal", ls_disposition)
// event open : VOLVER A CREAR primero los paneles, restaurar despues
string ls_disposition

of_creer_les_panneaux()          // las llamadas of_add_panel anteriores

ls_disposition = of_lire_preference("dock_principal")
if ls_disposition <> "" then uo_dock.of_set_layout(ls_disposition)

El orden es obligatorio: of_set_layout no crea ningún panel, solo recoloca los que ya existen.

Seguir los cambios de forma continua #

// event ue_layout_changed de uo_dock : (string as_json)
// Guardado inmediato, sin esperar al cierre de la ventana.
of_enregistrer_preference("dock_principal", as_json)

Controlar un panel mediante su handle #

n_pbt_dock_panel lnv_panneau

lnv_panneau = uo_dock.of_panel("proprietes")
lnv_panneau.is_title  = "Propiedades (3 modificadas)"
lnv_panneau.ib_pinned = false        // se repliega en una lengueta sobre el borde
// Ocultar un panel reservado a los administradores
uo_dock.of_panel("audit").ib_visible = gb_administrateur

Llamar la atención sobre un panel en segundo plano #

// Un proceso en segundo plano ha escrito en la consola : avisar sin robar el foco
uo_dock.of_notify_panel("sortie")

Reorganizar desde el código #

// Mover un panel como si el usuario hubiera arrastrado su pestana
uo_dock.of_move_panel(/*clave*/ "sortie", /*destino*/ "document", /*posicion*/ "bottom")

// Apilarlo como pestana sobre otro panel
uo_dock.of_move_panel(/*clave*/ "aide", /*destino*/ "proprietes", /*posicion*/ "stack")

Desacoplar un panel en una segunda pantalla #

// Ventana flotante nativa : el usuario puede colocarla en otra pantalla
uo_dock.of_float_panel("proprietes")
// event ue_panel_docked de uo_dock : (string as_key)
// El usuario ha cerrado la ventana flotante : el panel ha vuelto.
of_journaliser("Panel reacoplado : " + as_key)

Cerrar correctamente un panel #

// event ue_panel_closed de uo_dock : (string as_key)
// Retirar tambien el panel del contenedor para liberar el control alojado.
uo_dock.of_remove_panel(as_key)

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_count · of_keys_at · of_hasRecorrer lo que el componente contiene3.2 Los items
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

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