PBToolboxAI v4 ← Site

commandpalette — n_pbt_commandpalette #

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

Paleta de comandos: el usuario pulsa un atajo, escribe tres letras y alcanza cualquier acción de su aplicación — sin buscarla en los menús.

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


En resumen #

Objeton_pbt_commandpalette — no visual: nada que colocar en la ventana
Sirve paraHacer que toda acción de la aplicación sea alcanzable desde el teclado, en tres letras
RetornoNo bloqueante: of_open() devuelve el control de inmediato; la elección vuelve como evento

La paleta es una ventana desprendida, suya: flota sobre su aplicación, toma el foco mientras el usuario escribe y lo devuelve al cerrarse.


Inicio rápido #

// Una vez, al arrancar : las acciones de su aplicacion
inv_palette.ipo_owner = this
inv_palette.of_add_command(/*key*/ "new",  /*label*/ "N", /*group*/ "F")
inv_palette.of_add_command(/*key*/ "open", /*label*/ "O", /*group*/ "F")
inv_palette.of_add_command(/*key*/ "save", /*label*/ "S", /*group*/ "F")
inv_palette.of_register_shortcut()
// event ue_command_selected : (string as_key)
choose case as_key
	case "new";  of_new()
	case "open"; of_open()
	case "save"; of_save()
end choose

La conexión: la ventana anfitriona #

La paleta es un objeto no visual, pero no tiene ningún receptor ni mensaje que cablear: fije ipo_owner en su ventana, y la paleta recoge ella misma sus eventos y los lanza en ese objeto.

Dos líneas, una sola vez, al abrir la ventana:

// La ventana a la que la paleta pertenece
inv_palette.ipo_owner = this

// La paleta debe responder a su tecla
inv_palette.of_register_shortcut()

Eso es todo lo que hay que conectar. La elección del usuario, la apertura y el cierre le vuelven después como simples eventos en ipo_owner — sin receptor, sin mensaje que mapear, sin temporizador.


El atajo: es la DLL quien lo oye #

El atajo que abre la paleta no lo escucha la página: se registra en la DLL, la única que ve las teclas pulsadas mientras el foco está en otro control. Ahí está toda la diferencia entre una paleta que se encuentra y una que solo responde si ya se ha hecho clic en ella.

La DLL oye el atajo, pero no abre nada por sí misma: se lo avisa con ue_shortcut, y decide usted. Una paleta que se abre sobre un diálogo modal no ayudaría a nadie.

// event ue_shortcut : la tecla ha caido
if not ib_dialog_open then inv_palette.of_open()

is_shortcut elige el atajo; of_register_shortcut() lo entrega. Llámelo una vez al abrir la ventana — de lo contrario la paleta solo responde a su tecla después de haberse abierto una vez. of_open lo vuelve a entregar de paso, así que un atajo cambiado más tarde no necesita nada más.

// El atajo de siempre, el de los editores de codigo
inv_palette.is_shortcut = inv_palette.SHORTCUT_DEFAULT

// O el suyo
inv_palette.is_shortcut = "ctrl+shift+p"

// O ninguno : la paleta solo se abre con of_open()
inv_palette.is_shortcut = inv_palette.SHORTCUT_NONE

El atajo de la paleta solo se consulta después de los atajos de los demás componentes de la ventana, con foco o sin él: un botón de barra de herramientas con el mismo atajo gana. El atajo de esta ventana pasa antes que uno registrado sin ipo_owner (toda la aplicación). Solo se aceptan las teclas que el gancho sabe nombrar — letras, dígitos, F1 a F24, Intro, Esc, Supr, Insert, Inicio, Fin, RePág, AvPág y, con Ctrl o Alt, las flechas, Espacio, Tab, Retroceso, + - , .; cualquier otra devuelve -5. El capítulo del teclado lo detalla.


Dónde aparece la paleta #

is_position dice dónde se posa la ventana. Siempre se la trae de vuelta a la pantalla: una paleta anclada bajo un campo al pie de la ventana no desaparece tras la barra de tareas.

ConstanteDónde
POSITION_WINDOW_CENTERCentrada en ipo_owner — el valor predeterminado, y lo que el ojo espera
POSITION_SCREEN_CENTERCentrada en la pantalla, sea cual sea la ventana
POSITION_ABSOLUTEEn il_x / il_y, en píxeles de pantalla

PowerBuilder trabaja en PBU, y la posición de un control es relativa a su ventana: para anclar la paleta bajo un control, of_anchor_under(control) hace la conversión y pone las tres propiedades. Con dos pantallas, se abre en la pantalla del punto pedido.

Su altura sigue al número de comandos mostrados y se reduce a medida que se filtra — sin que su esquina superior se mueva, o el cuadro de búsqueda se escaparía bajo los dedos. Está limitada a media pantalla: más allá, la lista se desplaza por dentro y el cuadro de búsqueda queda arriba.

Un clic en otro sitio de la aplicación cierra la paleta, y ese clic alcanza igualmente su objetivo — como al salir de un menú. No hay nada que hacer.


Propiedades #

PropiedadTipoPredeterminadoFunción
ipo_ownerpowerobject—La ventana a la que la paleta pertenece: posee la ventana emergente y le sirve de ancla, su atajo responde en esa ventana, y es en ella donde se lanzan los eventos de la paleta. Póngala antes de of_open — es la única conexión que hacer. Si se deja vacía, el atajo responde en todas las ventanas de la aplicación. Dos objetos paleta sobre la misma ventana conservan cada uno su atajo y sus eventos: ninguno recibe los del otro
ipo_receiverpowerobject—Opcional, heredado: un objeto visual distinto en el que entregar los eventos, en lugar de ipo_owner — es también la única ventana cuyo pbm_custom02 se dispara en cada evento. Déjelo vacío — la paleta ahora entrega sus eventos ella misma mediante ipo_owner
is_shortcutstring"ctrl+k"Atajo que abre la paleta, desde cualquier sitio de la ventana. Constantes SHORTCUT_DEFAULT (ctrl+k) y SHORTCUT_NONE (ninguno). Surte efecto en of_register_shortcut
is_positionstringwindow-centerDónde se posa la ventana (constantes POSITION_*)
il_x · il_ylong0Posición en píxeles de pantalla, leída solo por POSITION_ABSOLUTE
is_placeholderstring""Texto gris en el cuadro de búsqueda mientras no se escribe nada
is_recentstring""Memoria de uso: los id lanzados más recientemente, el más reciente primero, separados por comas. La paleta los sube arriba, y la recencia desempata al filtrar — nunca invierte la pertinencia. Reléala tras el uso y persístela, devuélvela al arrancar. Una paleta que empieza en blanco cada mañana no aprende nada
il_max_recentlong8Cuántas guarda el bloque « Usados recientemente ». 8 por defecto. 0 lo apaga: una aplicación cuyos usuarios prefieren ver sus grupos intactos puede decirlo. Una entrada del bloque permanece en su grupo y lleva su nombre — un atajo no mueve aquello que abrevia

Métodos #

MétodoFunción
of_add_command (string as_key, string as_label, string as_group)Declara una acción: su identificador, su etiqueta y el grupo bajo el que aparece. Devuelve 0 una vez añadida, -5 si la clave está vacía, contiene /, ` o una coma (is_recent` es una lista separada por comas), o ya está ocupada. Decenas de miles de comandos siguen fluidos: la paleta solo dibuja las líneas visibles
of_add_command (string as_key, string as_label, string as_group, string as_hint, string as_shortcut, string as_keywords)Lo mismo, con la explicación a la derecha, el atajo a mostrar, que lanza su comando mientras la paleta está abierta — así es como se aprende ; fuera, su aplicación conserva sus propios aceleradores, y al escribir Ctrl+C, Ctrl+V, Ctrl+Z y Ctrl+A siguen siendo del cuadro de búsqueda — y palabras clave que la búsqueda lee sin mostrarlas. Devuelve 0 una vez añadida, -5 si la clave está vacía, contiene /, ` o una coma (is_recent` es una lista separada por comas), o ya está ocupada
of_insert_command (string as_key, string as_label, string as_group, integer ai_index)Declara una acción en una posición elegida (1 = la primera) en lugar de al final: un módulo compartido coloca sus comandos donde corresponde. 0 o menos, o más allá del final, añade al final. Explicación, atajo, palabras clave e icono se ponen después con of_command. Devuelve 0 una vez añadida, -5 para las mismas claves que of_add_command
of_remove_command (string as_key)Quita una acción; las demás quedan. Devuelve 0 una vez quitada, -5 si ningún comando tiene esa clave
of_command (string as_key) → n_pbt_commandpalette_commandEl handle de un comando, para renombrarlo, cambiar su atajo, atenuarlo u ocultarlo mediante sus propiedades. Atenuar en lugar de quitar: quitar lo que el usuario no puede hacer ahora le quita también toda posibilidad de descubrir que existe. El estado viaja con los comandos: un cambio hecho con la paleta abierta se ve en la siguiente apertura
of_key ( ) → stringEn el handle que devuelve of_command: la clave del comando que designa — lo que of_command recibió para obtenerlo, y lo que se guarda cuando el handle pasa de mano en mano
of_clear_commands ( )Vacía la paleta. Devuelve 0
of_count ( ) → longDevuelve el número de comandos que lleva la paleta
of_keys_at ( long al_index ) → stringEl identificador del comando en la posición al_index (desde 1), o "" más allá de cualquiera de los extremos. Con of_count, esto permite recorrer una paleta que uno no ha llenado — un módulo compartido añade los suyos
of_has ( string as_key ) → boolean¿Existe un comando bajo este identificador? Preguntar es mejor que adivinar: of_add_command rechaza (-5) un identificador ya ocupado
of_anchor_under ( dragobject ado_control )Ancla la paleta bajo un control — un campo, un botón: pone is_position en POSITION_ABSOLUTE e il_x / il_y en la esquina inferior izquierda del control, en píxeles de pantalla. Llámelo antes de of_open; la paleta sigue trayéndose de vuelta a la pantalla. Devuelve 0, o -5 si el control no es válido
of_open ( )Abre la paleta: una ventana propia, poseída por ipo_owner, colocada por is_position. Toma el foco y lo devuelve al cerrarse. Devuelve 0 una vez pedida — le sigue siempre ue_opened (en pantalla) o ue_closed (con el motivo por el que no apareció) —, -6 si falta el runtime WebView2, -4 si su ventana no pudo crearse
of_is_open ( )VERDADERO mientras la paleta está en pantalla. Es lo que permite al atajo alternar: pulsado una segunda vez una paleta se cierra — volver a llamar a of_open destruiría la ventana para reconstruirla idéntica, lo que se ve como un parpadeo, no como un cierre. La DLL sigue sin decidir nada: informa. Una vez abierta, la paleta tiene el foco en su propia ventana: el atajo pulsado allí la cierra por sí solo. Responde por la paleta de este objeto: cuando otro objeto paleta abre la suya, sustituye a esta y of_is_open responde FALSO aquí
of_close ( )Cierra la paleta que este objeto abrió — nunca la que otro objeto paleta abrió después. Perder el foco también la cierra, como un menú. Devuelve 0
of_register_shortcut ( )Entrega el atajo de is_shortcut a la DLL. Llámelo una vez al abrir la ventana. Un solo atajo por objeto paleta: volver a llamarlo tras cambiar is_shortcut sustituye al anterior, que deja de responder de inmediato — nunca hay nada que quitar antes. Devuelve 0 si se puso, 1 si sustituyó a uno, 2 si un is_shortcut vacío no deja ningún atajo (quitado, o no había), -5 si la tecla es de las que el gancho no ve (véase arriba) — el atajo anterior se conserva entonces. Sin ipo_owner, el atajo responde en todas las ventanas de la aplicación. Dos objetos paleta de una misma ventana conservan cada uno el suyo; el mismo atajo registrado por un segundo objeto pasa a este (1). Destruir el objeto quita su atajo — nunca el que tiene otro objeto paleta
of_process_events ( )Recoge los eventos en espera y los lanza en ipo_owner. El componente la llama él mismo mientras la paleta vive: normalmente no tiene que hacerlo
of_reset ( )Vacía los comandos y la memoria de uso (is_recent), devuelve las propiedades a sus valores predeterminados, cierra una paleta abierta y devuelve un atajo registrado a SHORTCUT_DEFAULT. ipo_owner e ipo_receiver quedan intactos: son el cableado, no el contenido

Propiedades de un comando — n_pbt_commandpalette_command #

Obtenida con of_command(clave). La paleta reconstruye su ventana desde su lista en cada of_open: una propiedad cambiada mientras está abierta se ve en la siguiente apertura.

PropiedadTipoPredeterminadoFunción
is_labelstring—El texto de la fila
is_shortcutstring""El atajo mostrado a la derecha de la fila, y activo mientras la paleta está abierta (Ctrl+Shift+S)
is_groupstring—El grupo bajo el que figura el comando; cambiarlo lo mueve sin quitarlo (conserva su posición entre los comandos)
is_hintstring""La pequeña línea bajo la etiqueta
is_keywordsstring""Las palabras que la búsqueda lee sin mostrarlas — las palabras del usuario
is_iconstring""Un icono a la izquierda de la fila: un archivo, una imagen de biblioteca, o mono: / tint: para uno que sigue el tema
ib_enabledbooleantrueComando atenuado: visible, buscable e inerte — ni clic, ni Intro, ni su atajo
ib_visiblebooleantrueComando oculto: fuera de la lista y de los atajos, sin ser eliminado; vuelve tal cual

Eventos #

EventoSe dispara cuando
ue_command_selected (string as_key)El usuario ha elegido una acción. La paleta ya se ha cerrado: hacer lo que anuncia le toca a usted
ue_shortcut ( )Se ha pulsado el atajo. La DLL avisa, PB decide. Una paleta alterna con su propia tecla: if of_is_open() then of_close() else of_open() — pulsado dentro de la paleta abierta, el atajo la cierra por sí solo. También puede negarse
ue_opened ( )La paleta está en pantalla — mediante of_open
ue_closed (string as_reason)Acaba de cerrarse, se haya elegido algo o no. Sigue a cada of_open que devolvió 0: as_reason está vacío para una paleta que estaba en pantalla, cancelled si se cerró — o fue sustituida por otra paleta — antes de aparecer, failed si su ventana no pudo nacer, blocked bajo depuración remota sin licencia

La paleta no hace nada por sí misma. Informa del identificador elegido y se cierra. Es su aplicación la que actúa — la misma acción, lanzada desde un menú o desde la paleta, pasa por el mismo código.


Desde el teclado #

TeclaEfecto
El atajo de is_shortcutAvisa a su código con ue_shortcut; es él quien abre
EscrituraFiltra sobre la marcha: las letras no tienen por qué seguirse, nva encuentra « Nuevo archivo », y los acentos no cuentan (preferences encuentra « Préférences »)
Flechas arriba / abajoMueven la selección por la lista
IntroElige la acción seleccionada (ue_command_selected)
El atajo mostrado en una filaLanza ese comando, sin tener que seleccionarlo
EscapeCierra sin elegir nada

Ejemplos #

Alimentar la paleta desde su menú #

// Las palabras clave no se ven, pero la busqueda las lee :
// escribir "pdf" encuentra la exportacion aunque la etiqueta no lo diga
inv_palette.of_add_command(/*key*/ "export", /*label*/ "E", /*group*/ "F", /*hint*/ "H", /*shortcut*/ "Ctrl+E", /*keywords*/ "pdf csv xlsx")

Elegir otro atajo #

// Ctrl+K ya lo usa su aplicacion ? Elija otro.
// of_register_shortcut lo entrega, y el anterior se va solo.
inv_palette.is_shortcut = "ctrl+shift+p"
inv_palette.of_register_shortcut()

Anclarla bajo un campo #

// Anclada bajo un campo, en pixeles de pantalla
// La paleta se trae de vuelta a la pantalla si se salia
inv_palette.of_anchor_under(/*control*/ sle_1)
inv_palette.is_placeholder = "P"
inv_palette.of_open()
// Remove one command, empty the list, close the palette
inv_palette.of_remove_command(/*key*/ "print")
inv_palette.of_clear_commands()
inv_palette.of_close()

Buenas prácticas #


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