PBToolboxAI v1 ← Site

messagebox — n_pbt_messagebox #

← Referência dos componentes · Índice do guia

Caixa de diálogo modal com tema, de retorno síncrono: o substituto direto do MessageBox() do PowerBuilder, com texto formatado, botões livres, ícones e caixa de verificação.

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


Em resumo #

Objeton_pbt_messageboxnão visual: nada a colocar na janela
Serve paraColocar uma questão ou anunciar um resultado, em vez do MessageBox() nativo, rígido e sem tema
RetornoSíncrono: of_show() bloqueia e devolve o índice do botão clicado

Ao contrário dos componentes visuais, este objeto não se insere numa janela: cria-se, configura-se, apresenta-se, destrói-se.

n_pbt_messagebox lnv_mb

lnv_mb = create n_pbt_messagebox
// ... configuracao ...
destroy lnv_mb

Início rápido #

n_pbt_messagebox lnv_mb

lnv_mb = create n_pbt_messagebox

lnv_mb.is_title   = "Eliminação"
lnv_mb.is_icon    = lnv_mb.ICON_WARNING
lnv_mb.is_message = "Eliminar definitivamente [b]12 processos[/b]?[br][br]Esta ação é irreversível."

lnv_mb.of_add_button(/*texto*/ "Eliminar", /*predefinido*/ true,  /*cancelamento*/ false)   // -> 1
lnv_mb.of_add_button(/*texto*/ "Cancelar", /*predefinido*/ false, /*cancelamento*/ true)    // -> 2

if lnv_mb.of_show(/*hwnd*/ Handle(this)) = 1 then
    of_supprimer()
end if

destroy lnv_mb

of_show aguarda a resposta do utilizador: a linha seguinte só é executada após o clique, exatamente como acontece com MessageBox().


Propriedades #

A definir antes de of_show.

PropriedadeTipoPredefiniçãoFunção
is_titlestring""Título apresentado no cabeçalho da caixa
is_messagestring""Corpo da mensagem. Aceita o texto formatado com etiquetas ([b], [i], [br], [accent], [picture=…]…)
is_instructionstring""Instrução principal: a pergunta em si, apresentada maior acima da mensagem. Título / instrução / mensagem é a anatomia que torna um diálogo legível de relance — «Eliminar 42 linhas?» e depois «Esta ação é definitiva» — em vez de um bloco uniforme. Aceita a marcação
is_iconstring""Ícone: uma constante ICON_*, ou uma imagem própria (caminho de ficheiro, ou recurso de DLL ma.dll:NOM)
is_checkboxstring""Texto de uma caixa de verificação opcional, do género «não voltar a perguntar» ("" = sem caixa)
ib_checkedbooleanfalseEstado inicial da caixa (o estado final lê-se com of_checked())
ib_inputbooleanfalseAcrescenta um campo de entrada com o tema aplicado (mudar o nome, motivo, comentário), para que uma aplicação já não precise de uma janela feita à mão que não segue nem o tema nem o sentido de leitura. Relê-se com of_input_value() após of_show. Tudo numa chamada: of_prompt
is_input_labelstring""Etiqueta por cima do campo ("" = nenhuma). Requer ib_input
is_input_valuestring""Conteúdo inicial do campo. Está selecionado na abertura: escrever substitui-o, como em qualquer diálogo de mudança de nome
is_input_placeholderstring""Indicação apresentada enquanto o campo estiver vazio. Não é um valor: se o utilizador nada escrever, nada é devolvido
ib_input_passwordbooleanfalseOculta os carateres escritos
ib_input_requiredbooleanfalseO botão predefinido mantém-se desativado enquanto o campo estiver vazio. Deixar submeter para depois repreender não serve a ninguém; o botão de cancelar continua acessível
ib_buttons_reversebooleanfalseOrdem dos botões: false = da esquerda para a direita, pela ordem de adição; true = invertida
is_positionstringPOSITION_OWNERCentragem: POSITION_OWNER (na janela chamadora) ou POSITION_SCREEN (no ecrã)
il_min_widthlong0Largura mínima em píxeis (0 = automática)
il_max_widthlong0Largura máxima em píxeis (0 = automática): o texto muda de linha dentro deste limite
il_max_heightlong0Altura máxima em píxeis (0 = automática): para além disso, o corpo da mensagem desloca-se em vez de aumentar a janela

Constantes #

ConstanteValorUtilização
ICON_INFORMATION"information"Informação neutra
ICON_WARNING"warning"Aviso, ação arriscada
ICON_ERROR"error"Falha, erro
ICON_QUESTION"question"Questão fechada
ICON_SUCCESS"success"Confirmação de um êxito
ICON_NONE"none"Nenhum ícone
POSITION_OWNER"owner"Centrada na janela chamadora
POSITION_SCREEN"screen"Centrada no ecrã

Métodos #

MétodoFunção
of_add_button (string as_texte) → longAdiciona um botão simples. Devolve o respetivo índice a partir de 1
of_add_button (string as_texte, boolean ab_defaut, boolean ab_annulation) → longO mesmo, marcando o botão predefinido (Enter) e/ou de cancelamento (Esc)
of_add_button (string as_texte, string as_icone, boolean ab_defaut, boolean ab_annulation) → longO mesmo, com um ícone no botão
of_add_button_timed (string as_texte, boolean ab_defaut, boolean ab_annulation, long al_secondes_actif, long al_secondes_clic) → longBotão com contagem decrescente: permanece desativado durante al_secondes_actif segundos (contador visível) e depois clica-se sozinho ao fim de al_secondes_clic segundos (0 = temporizador inativo)
of_show (long al_hwnd) → longApresenta a caixa modal e devolve o índice do botão clicado (0 = fecho por Esc ou pela cruz, sem botão de cancelamento)
of_checked ( ) → booleanEstado da caixa de verificação no momento do último of_show
of_input_value ( ) → stringTexto escrito no último of_show (vazio se ib_input estava desativado)
of_action ( ) → stringId da zona [action=id] clicada na mensagem, cadeia vazia caso contrário. Uma zona destas é uma escolha oferecida na própria frase: fecha o diálogo e of_show devolve 0. Já uma zona [hyperlink=url] abre no navegador e deixa o diálogo aberto — quem chamou está bloqueado em of_show, pelo que uma ligação não pode ser uma resposta
of_info (long al_hwnd, string as_title, string as_message) → longDiálogo numa linha, tal como MessageBox() o é: ícone de informação e um único botão OK, devolve 1. As etiquetas vêm das traduções da biblioteca (6 idiomas) em vez de serem escritas em cada aplicação — é toda a razão de ser destes atalhos
of_warning (long al_hwnd, string as_title, string as_message) → longÍcone de aviso, um botão OK. Devolve 1
of_error (long al_hwnd, string as_title, string as_message) → longÍcone de erro, um botão OK. Devolve 1
of_success (long al_hwnd, string as_title, string as_message) → longÍcone de êxito, um botão OK. Devolve 1
of_confirm (long al_hwnd, string as_title, string as_message) → longPergunta + OK / Cancelar. Devolve 1 = OK, 2 = Cancelar, 0 = fechado
of_yes_no (long al_hwnd, string as_title, string as_message) → longPergunta + Sim / Não. Devolve 1 = Sim, 2 = Não, 0 = fechado
of_yes_no_cancel (long al_hwnd, string as_title, string as_message) → longPergunta + Sim / Não / Cancelar. Devolve 1, 2, 3, ou 0 se fechado
of_prompt (long al_hwnd, string as_title, string as_message, string as_default) → stringPede um valor e devolve o que foi escrito, ou uma cadeia vazia se o utilizador cancelou. Para distinguir uma resposta vazia de um cancelamento, use of_show + of_input_value
of_reset ( )Limpa todas as propriedades e os botões adicionados: a mesma instância recomeça do zero

A etiqueta de um botão aceita o texto formatado com etiquetas e o mnemónico & ("&Guardar" sublinha o G e ativa-o com Alt+G); && apresenta um E comercial literal.


O teclado #

TeclaEfeito
EnterAciona o botão marcado como predefinido
EscAciona o botão marcado como cancelamento; sem botão de cancelamento, fecha a caixa e devolve 0
Alt + letraAciona o botão cuja etiqueta contém esse mnemónico
TabDesloca o foco de um botão para outro
Ctrl + CCopia o diálogo (título, instrução, mensagem, etiquetas dos botões) para a área de transferência, como qualquer caixa de diálogo do Windows — prático quando um erro tem de ser encaminhado para o suporte

Na abertura, nenhum botão tem contorno de foco: é intencional e corresponde ao comportamento das caixas de diálogo modernas do Windows. O contorno só aparece após uma primeira pressão em Tab, ou seja, quando o utilizador passa explicitamente para o teclado. Enter e Esc permanecem ativos desde o primeiro segundo, mesmo sem foco visível.


Exemplos #

Questão fechada com botão predefinido #

n_pbt_messagebox lnv_mb
long ll_reponse

lnv_mb = create n_pbt_messagebox

lnv_mb.is_title   = "Guardar as alterações"
lnv_mb.is_icon    = lnv_mb.ICON_QUESTION
lnv_mb.is_message = "O processo foi modificado. Pretende guardar antes de fechar?"

lnv_mb.of_add_button(/*texto*/ "&Guardar",     /*predefinido*/ true,  /*cancelamento*/ false)  // 1
lnv_mb.of_add_button(/*texto*/ "&Não guardar", /*predefinido*/ false, /*cancelamento*/ false) // 2
lnv_mb.of_add_button(/*texto*/ "Cancelar",          /*predefinido*/ false, /*cancelamento*/ true)   // 3

ll_reponse = lnv_mb.of_show(/*hwnd*/ Handle(this))
destroy lnv_mb

choose case ll_reponse
    case 1 ; of_enregistrer() ; Close(parent)
    case 2 ; Close(parent)
    case else ; // 3 ou 0: nao se fecha
end choose

Mensagem enriquecida e ícone #

lnv_mb.is_title   = "Importação concluída"
lnv_mb.is_icon    = lnv_mb.ICON_SUCCESS
lnv_mb.is_message = "[b]1 240 linhas[/b] integradas.[br][br]" &
                  + "[accent]18 duplicados[/accent] foram ignorados."

lnv_mb.of_add_button(/*texto*/ "OK", /*predefinido*/ true, /*cancelamento*/ false)
lnv_mb.of_show(/*hwnd*/ Handle(this))

Caixa «não voltar a perguntar» #

n_pbt_messagebox lnv_mb

lnv_mb = create n_pbt_messagebox

lnv_mb.is_title    = "Eliminação"
lnv_mb.is_icon     = lnv_mb.ICON_WARNING
lnv_mb.is_message  = "Eliminar as linhas selecionadas? Esta ação é irreversível."
lnv_mb.is_checkbox = "Não voltar a perguntar"
lnv_mb.ib_checked  = false

lnv_mb.of_add_button(/*texto*/ "Eliminar", /*predefinido*/ true,  /*cancelamento*/ false)
lnv_mb.of_add_button(/*texto*/ "Cancelar", /*predefinido*/ false, /*cancelamento*/ true)

if lnv_mb.of_show(/*hwnd*/ Handle(this)) = 1 then
    of_supprimer()
    // Memorizar a escolha do utilizador
    ib_confirmer_suppression = not lnv_mb.of_checked()
end if

destroy lnv_mb

Botão com contagem decrescente #

lnv_mb.is_title   = "Reinício"
lnv_mb.is_icon    = lnv_mb.ICON_INFORMATION
lnv_mb.is_message = "A aplicação vai reiniciar para aplicar a atualização."

// "Continuar" permanece esbatido durante 3 segundos (e apresentado um contador)
lnv_mb.of_add_button_timed(/*texto*/ "Continuar", /*predefinido*/ true, /*cancelamento*/ false, &
                           /*segundos_ativo*/ 3, /*segundos_clique*/ 0)

// "Mais tarde" clica-se sozinho ao fim de 10 segundos
lnv_mb.of_add_button_timed(/*texto*/ "Mais tarde", /*predefinido*/ false, /*cancelamento*/ true, &
                           /*segundos_ativo*/ 0, /*segundos_clique*/ 10)

lnv_mb.of_show(/*hwnd*/ Handle(this))

Mensagem longa: limitar o tamanho #

// Um texto volumoso: a caixa e limitada e o corpo desloca-se
lnv_mb.is_title      = "Notas de versão"
lnv_mb.is_message    = ls_notes
lnv_mb.il_max_width  = 480
lnv_mb.il_max_height = 320

lnv_mb.of_add_button(/*texto*/ "Fechar", /*predefinido*/ true, /*cancelamento*/ true)
lnv_mb.of_show(/*hwnd*/ Handle(this))

Reutilizar uma instância #

// Uma instancia de janela, varios dialogos: of_reset entre cada chamada
inv_mb.of_reset()      // limpa as propriedades E os botoes anteriores

inv_mb.is_title   = "Segundo diálogo"
inv_mb.is_message = "Cada of_reset recomeça a partir de uma caixa vazia."
inv_mb.of_add_button(/*texto*/ "OK", /*predefinido*/ true, /*cancelamento*/ false)
inv_mb.of_show(/*hwnd*/ Handle(this))

Boas práticas #


← Referência dos componentes · Índice do guia