PBToolboxAI v2 ← Site

commandpalette — n_pbt_commandpalette #

← Referência dos componentes · Índice do guia

Paleta de comandos: o utilizador prime um atalho, escreve três letras e alcança qualquer acção da sua aplicação — sem a procurar nos menus.

▶ Ver ao vivo — Aplicação de demonstração, mosaico Command palette: a pré-visualização, o código que o produz e esta página, lado a lado.


Em resumo #

Objecton_pbt_commandpalette — não visual: nada para colocar na janela
Serve paraTornar todas as acções da aplicação alcançáveis pelo teclado, em três letras
RetornoNão bloqueante: of_open() devolve o controlo de imediato; a escolha volta como evento

A paleta é uma janela destacada, sua: paira sobre a aplicação, toma o foco enquanto o utilizador escreve e devolve-o ao fechar-se.


Início rápido #

// Uma vez, no arranque : as accoes da sua aplicacao
inv_palette.ipo_owner    = this
inv_palette.ipo_receiver = 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_nouveau()
	case "open"; of_ouvrir()
	case "save"; of_enregistrer()
end choose

A ligação: o receptor #

Um objecto não visual não tem identificador de janela: o Windows não sabe a quem entregar as mensagens da paleta. É esse o papel de ipo_receiver — um objecto visual, a sua janela por exemplo, que escuta e recolhe.

Três linhas, uma só vez, ao abrir a janela:

inv_palette.ipo_owner    = this   // a janela a que a paleta pertence
inv_palette.ipo_receiver = this   // a que recebera os eventos
inv_palette.of_register_shortcut()  // a paleta tem de responder a sua tecla

Depois, no receptor, o evento que recolhe:

// event ue_palette_msg pbm_custom02
inv_palette.of_process_events()

Sem essa recolha a paleta abre e funciona, mas nada lhe volta: nem a escolha, nem a abertura, nem o fecho.


O atalho: é a DLL que o ouve #

O atalho que abre a paleta não é escutado pela página: é registado junto da DLL, a única que vê as teclas premidas enquanto o foco está noutro controlo. É toda a diferença entre uma paleta que se encontra e uma que só responde depois de se ter clicado nela.

A DLL ouve o atalho, mas não abre nada por si: avisa-o através de ue_shortcut, e é o senhor que decide. Uma paleta a abrir por cima de um diálogo modal não ajudaria ninguém.

// event ue_shortcut : a tecla caiu
if not ib_dialog_open then inv_palette.of_open()

is_shortcut escolhe o atalho; of_register_shortcut() entrega-o. Chame-o uma vez ao abrir a janela — caso contrário a paleta só responde à sua tecla depois de já ter sido aberta uma vez. of_open volta a entregá-lo de passagem, portanto um atalho alterado mais tarde não precisa de mais nada.

// O atalho do costume, o dos editores de codigo
inv_palette.is_shortcut = inv_palette.SHORTCUT_DEFAULT

// Ou o seu
inv_palette.is_shortcut = "ctrl+shift+p"

// Ou nenhum : a paleta so abre por of_open()
inv_palette.is_shortcut = inv_palette.SHORTCUT_NONE

Dois componentes a pedir o mesmo atalho: ganha o que tem o foco, senão o primeiro registado. O capítulo do teclado detalha-o.


Onde a paleta aparece #

is_position diz onde a janela assenta. É sempre trazida de volta para dentro do ecrã: uma paleta ancorada sob um campo no fundo da janela não desaparece atrás da barra de tarefas.

ConstanteOnde
POSITION_WINDOW_CENTERCentrada em ipo_owner — a predefinição, e o que o olho espera
POSITION_SCREEN_CENTERCentrada no ecrã, seja qual for a janela
POSITION_ABSOLUTEEm il_x / il_y, em píxeis de ecrã

O PowerBuilder trabalha em PBU: converta antes de preencher il_x / il_y.

A sua altura acompanha o número de comandos mostrados e diminui à medida que se filtra — sem que o canto superior se mexa, senão a caixa de pesquisa fugia debaixo dos dedos. Está limitada a meio ecrã: acima disso a lista desliza por dentro e a caixa de pesquisa fica em cima.

Um clique noutro sítio da aplicação fecha a paleta, e esse clique atinge na mesma o seu alvo — como ao sair de um menu. Nada a fazer para isso.


Propriedades #

PropriedadeTipoPredefiniçãoPapel
ipo_ownerpowerobject—A janela a que a paleta pertence: possui a janela de pop-up e serve-lhe de âncora. Defina-a antes de of_open
ipo_receiverpowerobject—O objecto visual que recebe os eventos. Declara event xxx pbm_custom02 e chama aí of_process_events
is_shortcutstring"ctrl+k"Atalho que abre a paleta, de qualquer sítio da janela. Constantes SHORTCUT_DEFAULT (ctrl+k) e SHORTCUT_NONE (nenhum). Produz efeito em of_register_shortcut
is_positionstringwindow-centerOnde a janela assenta (constantes POSITION_*)
il_x · il_ylong0Posição em píxeis de ecrã, lida apenas por POSITION_ABSOLUTE
is_placeholderstring""Texto cinzento na caixa de pesquisa enquanto nada foi escrito
is_recentstring""Memória de uso: os ids lançados mais recentemente, do mais recente, separados por vírgulas. A paleta sobe-os ao topo, e a recência desempata ao filtrar — nunca inverte a pertinência. Releia-a após o uso e persista-a, reponha-a no arranque. Uma paleta que começa em branco todas as manhãs não aprende nada
il_max_recentlong8Quantas o bloco « Usados recentemente » guarda. 8 por omissão. 0 desliga-o: uma aplicação cujos utilizadores preferem ver os seus grupos intactos pode dizê-lo. Uma entrada do bloco permanece no seu grupo e leva o nome dele — um atalho não desloca aquilo que abrevia

Métodos #

MétodoPapel
of_add_command (string as_key, string as_label, string as_group)Declara uma acção: o seu identificador, a sua etiqueta e o grupo sob o qual aparece. Devolve 0 depois de aplicado, -5 perante um argumento inválido (chave vazia, endereço errado), -2 se o componente não estiver criado
of_add_command (string as_key, string as_label, string as_group, string as_hint, string as_shortcut, string as_keywords)O mesmo, com a explicação à direita, o atalho a mostrar, que lança o seu comando enquanto a paleta está aberta — é assim que se aprende ; fora, a sua aplicação conserva os seus próprios aceleradores — e palavras-chave que a pesquisa lê sem as mostrar. Devolve 0 depois de aplicado, -5 perante um argumento inválido (chave vazia, endereço errado), -2 se o componente não estiver criado
of_remove_command (string as_key)Retira uma acção; as outras ficam. Devolve 0 depois de aplicado, -5 perante um argumento inválido (chave vazia, endereço errado), -2 se o componente não estiver criado
of_command (string as_key) → n_pbt_commandpalette_commandO handle de um comando, para o renomear, mudar o seu atalho, esbatê-lo ou escondê-lo pelas suas propriedades. Esbater em vez de retirar: retirar o que o utilizador não pode fazer agora retira-lhe também toda a hipótese de descobrir que existe. O estado viaja com os comandos: uma alteração feita com a paleta aberta vê-se na abertura seguinte
of_clear_commands ( )Esvazia a paleta. Devolve 0 depois de aplicado, -2 se o componente não estiver criado
of_count ( ) → integerQuantos comandos a paleta carrega
of_keys_at ( integer ai_index ) → stringO identificador do comando na posição ai_index (a partir de 1), ou "" para além de qualquer das extremidades. Com of_count, é o que permite percorrer uma paleta que não se preencheu — um módulo partilhado acrescenta os seus
of_has ( string as_key ) → booleanExiste um comando sob este identificador? Perguntar evita declarar um segundo sob um identificador já ocupado
of_open ( )Abre a paleta: uma janela sua, possuída por ipo_owner, colocada por is_position. Toma o foco e devolve-o ao fechar-se. Devolve 0 depois de aberta, -1 se faltar o runtime WebView2, -4 se a sua janela não pôde ser criada
of_is_open ( )VERDADEIRO enquanto a paleta está no ecrã. É isso que permite ao atalho alternar: premido uma segunda vez uma paleta fecha-se — voltar a chamar of_open destruiria a janela para a reconstruir idêntica, o que se vê como um tremeluzir, não como um fecho. A DLL continua a não decidir nada: informa
of_close ( )Fecha-a. Perder o foco também a fecha, como um menu. Devolve 0
of_register_shortcut ( )Entrega o atalho de is_shortcut à DLL. A chamar uma vez ao abrir a janela. Um só atalho por janela: voltar a chamá-lo depois de mudar is_shortcut substitui o anterior, que deixa logo de responder — nunca há nada a retirar antes. Devolve 0 se foi posto, 1 se substituiu um, 2 se um is_shortcut vazio o retirou
of_process_events ( )Recolhe os eventos em espera e levanta-os neste objecto. A chamar do pbm_custom02 de ipo_receiver — é o único caminho de volta
of_reset ( )Esvazia os comandos e repõe as propriedades nas predefinições. ipo_owner e ipo_receiver ficam intactos: são a ligação, não o conteúdo. Devolve 0 depois de aplicado, -2 se o componente não estiver criado

Propriedades de um comando — n_pbt_commandpalette_command #

Obtida com of_command(chave). A paleta reconstrói a sua janela a partir da sua lista a cada of_open: uma propriedade alterada enquanto está aberta vê-se na abertura seguinte.

PropriedadeTipoPredefiniçãoFunção
is_labelstring—O texto da linha
is_shortcutstring""O atalho mostrado à direita da linha, e honrado enquanto a paleta está aberta (Ctrl+Shift+S)
ib_enabledbooleantrueComando esbatido: visível, pesquisável e inerte — nem clique, nem Enter, nem o seu atalho
ib_visiblebooleantrueComando escondido: fora da lista e dos atalhos, sem ser eliminado; volta tal como estava

Eventos #

EventoAccionado quando
ue_command_selected (string as_key)O utilizador escolheu uma acção. A paleta já se fechou: fazer o que ela anuncia cabe-lhe a si
ue_shortcut ( )O atalho foi premido. A DLL transmite, o PB decide. Uma paleta alterna na sua própria tecla: if of_is_open() then of_close() else of_open(). Também pode recusar
ue_opened ( )A paleta está no ecrã — através de of_open
ue_closed ( )Acabou de se fechar, tenha sido escolhido algo ou não

A paleta não faz nada por si. Comunica o identificador escolhido e fecha-se. É a sua aplicação que age — a mesma acção, accionada a partir de um menu ou da paleta, passa pelo mesmo código.


Pelo teclado #

TeclaEfeito
O atalho de is_shortcutAvisa o seu código através de ue_shortcut; é ele que abre
EscritaFiltra à medida que se escreve: as letras não têm de se seguir, nfi encontra « Novo ficheiro »
Setas cima / baixoDeslocam a selecção na lista
EnterEscolhe a acção seleccionada (ue_command_selected)
O atalho mostrado numa linhaLança esse comando, sem ter de o seleccionar
EscapeFecha sem escolher nada

Exemplos #

Alimentar a paleta a partir do seu menu #

// As palavras-chave nao se veem, mas a pesquisa le-as :
// escrever "pdf" encontra a exportacao mesmo que a etiqueta nao o diga
inv_palette.of_add_command(/*key*/ "export", /*label*/ "E", /*group*/ "F", /*hint*/ "H", /*shortcut*/ "Ctrl+E", /*keywords*/ "pdf csv xlsx")

Escolher outro atalho #

// Ctrl+K ja usado pela sua aplicacao ? Escolha outro.
// of_register_shortcut entrega-o, e o anterior sai sozinho.
inv_palette.is_shortcut = "ctrl+shift+p"
inv_palette.of_register_shortcut()

Ancorá-la sob um campo #

// Ancorada sob um campo : o PB conta em PBU, a DLL em pixeis
// A paleta e trazida de volta para dentro do ecra se transbordasse
inv_palette.is_position = inv_palette.POSITION_ABSOLUTE
inv_palette.il_x = UnitsToPixels(sle_1.x, XUnitsToPixels!)
inv_palette.il_y = UnitsToPixels(sle_1.y + sle_1.height, YUnitsToPixels!)
inv_palette.is_placeholder = "P"
inv_palette.of_open()
inv_palette.of_remove_command(/*key*/ "print")
inv_palette.of_clear_commands()
inv_palette.of_close()

Boas práticas #


← Referência dos componentes · Índice do guia