12. Migrar da 4.0 para a 5.0 #
← Migrar da 3.0 para a 4.0 · Índice · Notas de versão →
A 5.0 não muda nenhuma assinatura dos trinta e sete componentes da 4.0, nem nenhum evento — exceto a barra de botões (buttonbar, 12.7) e o evento ue_link_clicked do visualizador Markdown (markdownview), que recebe um segundo argumento, as_kind (12.5). Três componentes mudam de palavras. A barra de progresso (progressbar) adota as dos indicadores — ib_label, il_color e is_label_format desaparecem a favor de ib_show_value, il_value_color, is_format e is_unit (12.1). O gráfico cartesiano (chartcartesian) escreve os seus números através de is_format, como os indicadores e o gráfico circular: of_set_value_format e of_clear_value_format desaparecem, e ii_point_count de uma série passa a il_point_count (12.4). A tabela dinâmica (crosstab) segue o mesmo caminho: of_set_value_format e of_clear_value_format desaparecem a favor de is_format — no campo, ou num só valor através de of_value — e de ib_negative_red (12.8). O compilador mostra-lhe cada linha a rever. A barra lateral (listbar) muda um evento: ue_item_rclicked recebe também o ponto do ecrã do clique, al_x e al_y (12.9). O painel de mosaicos (tilesbox) renomeia um evento: ue_tile_context(as_keys) passa a ue_tile_rclicked(as_keys, al_x, al_y), e a posição de of_move_tile e de of_insert_tile passa a long al_position (12.12). O menu radial (radialmenu) perde quatro propriedades de dica que nunca mostrou — is_tooltip, is_super_tooltip_title, is_super_tooltip_text e is_super_tooltip_image (12.5). O calendário (scheduler) muda três eventos de gesto: ue_appointment_changing recebe as_kind, ue_appointment_moved e ue_appointment_resized recebem os valores anteriores (12.10). O explorador da shell (shellexplorer) muda um evento: ue_error recebe também o caminho e um motivo constante, as_path e as_reason (12.11). O bloco de texto formatado (statictext) muda um evento: ue_hyperlink recebe também ab_opened, se a hiperligação se abriu de facto (12.5). O separador (tab) muda um evento: ue_tab_rclicked recebe também o ponto do ecrã do clique, al_x e al_y (12.13). O leitor de sons (soundplayer) muda três eventos: ue_started, ue_ended e ue_failed recebem também o número do som, al_sound (12.14). O toaster (toaster) muda um evento: ue_toast_dismissed recebe também o motivo do fecho, as_reason (12.15). O navegador web (webbrowser): of_go_back, of_go_forward e of_stop devolvem um long, e com ib_veto_navigation um endereço escrito pelo utilizador é perguntado a ue_navigating (12.17). A barra de ferramentas (toolbar) muda um evento: ue_item_rclicked recebe também o ponto do ecrã do clique, al_x e al_y (12.18). O leitor de vídeo (video) muda uma assinatura: of_stop passa a função que devolve um long (12.16) — uma chamada escrita como instrução continua a compilar. Três componentes mudam um evento de clique direito de um item, que recebe também o seu ponto do ecrã al_x, al_y: a barra de botões (ue_button_rclicked), o trilho de navegação (breadcrumb, ue_item_rclicked) e o gráfico cartesiano (ue_point_rclicked); a barra de estado (statusbar) dá esse ponto como os outros, sem o multiplicar pela escala do ecrã (12.19). A base (12.20): o motivo da falha de um componente não visual lê-se com of_get_last_error() — a propriedade is_last_error desaparece de crypto, restclient, soundplayer, speechout, xml, u_pbt_regex e u_pbt_zip —, e of_stop, of_close e of_reset dos componentes não visuais devolvem um long.
O resto não pede nada ao seu código: a grelha de dados (datagrid) e o friso (ribbon) ganham máscaras de entrada numéricas, e o editor de uma coluna numérica da grelha abre agora sobre o texto da máscara (12.2, 12.3). Os novos componentes da 5.0 são apresentados nas notas de versão.
12.1 progressbar: as palavras dos indicadores #
A 5.0 traz dois indicadores, linear (gauge) e de mostrador (angulargauge). Uma barra de progresso também mostra um valor numa escala: a biblioteca passa a falar uma só língua para isso, e a barra, que dizia o mesmo por outras palavras, adota as palavras dos indicadores. Nenhum nome antigo sobrevive: nem uma propriedade, nem um nome aceite por of_set_property.
| O quê | 4.0 | 5.0 |
|---|---|---|
| Mostrar a leitura | uo.ib_label = true | uo.ib_show_value = true |
| Cor do valor (-1 = o tema, inalterado) | uo.il_color = RGB(…) | uo.il_value_color = RGB(…) |
| Uma leitura que escreve o valor | uo.is_label_format = "{value} of {max} rows" | uo.is_format = "#,##0" + uo.is_unit = "of 500 rows" |
| A percentagem (predefinição, inalterada) | uo.is_label_format = "" | uo.is_format = "" |
| Comandar por nome | of_set_property("label", …), ("label_format", …), ("color", …) | ("show_value", …), ("format", …), ("unit", …), ("value_color", …) |
is_formaté um formato de apresentação PowerBuilder aplicado ao valor ("#,##0","$#,##0.00"), com os separadores do idioma de apresentação, exatamente como nos indicadores. Vazio, a barra mostra a percentagem, como antes.- Os marcadores
{percent},{value},{min}e{max}deixaram de existir. Uma etiqueta que misturava valor e percentagem ("{value} of {max} rows ({percent})") não tem equivalente exato: escolha o valor (formato e unidade) ou a percentagem (e uma unidade). O máximo, que o seu código conhece, escreve-se na unidade. is_unité novo: um texto simples escrito depois da leitura, separado por um espaço — depois do valor como depois da percentagem.of_resetesvazia-o.- Uma máscara que contém
%escreve a parte concluída, não o valor:is_format = "0.0%"dá «35.0%» para 1 687 linhas de 4 820, arredondada por defeito como a percentagem — a percentagem com casas decimais que{percent}não sabia escrever. - Uma espera em pausa ou em erro torna-se uma barra cheia. Na 4.0, uma barra de espera (
ib_indeterminate) que recebiaSTATE_PAUSEDouSTATE_ERRORficava parada a meio do deslize, muitas vezes fora da pista: a falha não se via. Na 5.0 para como barra (anel) cheia da cor do estado, como a barra de tarefas do Windows, e o leitor de ecrã já não a anuncia ocupada, diz o seu estado. of_set_property("tooltip", …)esuper_tooltip_*devolvem-5: a barra não publica tooltip, e a porta pelo nome, que punha um, está fechada como as propriedades.- Novidade, sem nada a rever:
is_orientation(ORIENTATION_VERTICAL: uma barra de pé, em vez de umaVProgressBar),is_accessible_name(o nome que o leitor de ecrã diz) e o texto de uma espera (sóis_unitenquanto a barra está em espera).
// 4.0 : the label wrote the value through placeholders
uo_progress.ib_label = true
uo_progress.il_color = RGB(/*red*/ 0, /*green*/ 120, /*blue*/ 215)
uo_progress.is_label_format = "{value} of {max} rows"
// 5.0 : the words of the gauges - a display format for the value, then a unit
uo_progress.ib_show_value = true
uo_progress.il_value_color = RGB(/*red*/ 0, /*green*/ 120, /*blue*/ 215)
uo_progress.is_format = "#,##0"
uo_progress.is_unit = "of 500 rows"
A receita: compile; cada ib_label, il_color e is_label_format de uma barra de progresso é assinalado. Substitua os dois primeiros por ib_show_value e il_value_color. Para o terceiro: um texto vazio continua vazio em is_format; uma etiqueta que escrevia o valor passa a um formato ("#,##0") e uma unidade; uma etiqueta que escrevia a percentagem deixa is_format vazio e põe o seu texto em is_unit. Um of_set_property que nomeava label, label_format ou color devolve agora -5 e não faz nada (of_get_last_error nomeia a propriedade): procure esses nomes no seu código.
12.2 datagrid: um editor numérico que escreve através de uma máscara #
Nenhuma assinatura muda, e ue_cell_edited continua a receber o número simples (1234.5). O que muda vê-se no ecrã: a escrita numa coluna numérica segue agora uma máscara de entrada, na sintaxe do DataWindow — a que indica pela nova propriedade is_mask da coluna, senão o seu formato de apresentação despojado dos literais.
| O quê | 4.0 | 5.0 |
|---|---|---|
O editor de uma célula mostrada $1,234.50 | abria com o número simples 1234.5; qualquer carácter era aceite | abre com 1,234.50; o agrupamento aparece à medida que chegam os algarismos, as casas decimais ficam limitadas à máscara, as letras são recusadas; um número colado é lido no idioma de apresentação |
| Um número de quatro algarismos com um formato numérico | não agrupado nalguns idiomas (1234 em espanhol) | agrupado em todos os idiomas (1.234 em espanhol) |
| Um negativo arredondado a zero | -0 | 0 |
| Abrir e fechar o editor sem escrever | podia alterar um valor que o formato arredonda | não muda nada |
Uma célula de classificação (rating) lida por um leitor de ecrã | cinco sinais de estrela | 4 / 5 |
// 5.0 : the input mask of a numeric column - the cell still receives the bare number
uo_grid.of_column(/*key*/ "revenue").is_mask = "#,##0.00"
A receita: nada a mudar. Um código que lia o texto escrito não o vê: ue_cell_edited continua a devolver o número. Uma coluna cuja escrita deve ficar livre (um código, um número de peça) é uma coluna de texto, não numérica.
12.3 ribbon: as máscaras de um contador #
Nada muda para um contador sem máscara. Duas novas propriedades do seu handle, na sintaxe do PowerBuilder: is_mask, a máscara de entrada ("#,##0.00", "0%"), e is_format, o formato de apresentação com os seus literais (0 "pt" mostra 11 pt, que se escreve 11). id_value e ue_value_changed mantêm o número simples, a troca entre os dois não levanta nenhum evento, e as máscaras seguem o contador no painel de um grupo recolhido.
// 5.0 : a font size shown "11 pt", typed "11"
uo_ribbon.of_item(/*keys*/ "home/font/size").is_format = "0 ~"pt~""
A receita: nada a mudar.
12.4 chartcartesian: o formato dos números através de is_format #
O gráfico cartesiano escrevia os seus números através de uma função de quatro argumentos (casas decimais, prefixo, sufixo, separador de milhares). A 5.0 põe gráficos e indicadores sob uma só língua: um formato de apresentação PowerBuilder, o de uma coluna de DataWindow, na propriedade is_format — do gráfico inteiro, e de um eixo através do seu handle. As secções positivo;negativo;zero, os literais e a percentagem vêm com ele, e os separadores continuam a ser os do idioma de apresentação. Nenhum nome antigo sobrevive.
| O quê | 4.0 | 5.0 |
|---|---|---|
| O formato do gráfico | uo.of_set_value_format(0, "$", "", true) | uo.is_format = "$#,##0" |
| O formato de um eixo | uo.of_set_value_format(AXIS_VALUE2, 1, "", " u", false) | uo.of_axis(AXIS_VALUE2).is_format = '0.0" u"' |
| Voltar ao número tal como está | uo.of_clear_value_format() | uo.is_format = "" (e "" em cada eixo que tenha o seu) |
| Comandar por nome | — | of_set_property("format", "#,##0") |
| O número de pontos de uma série (só leitura) | uo.of_item("k").ii_point_count (integer) | uo.of_item("k").il_point_count (long) |
- O formato de um eixo prevalece sobre o do gráfico, e mantém-no. Definir o formato do gráfico já não apaga o dos eixos (a forma de
of_set_value_formatsem eixo fazia-o): um eixo volta ao formato do gráfico comis_format = "". - Sem formato (vazio, ou um formato que não é numérico), o número escreve-se tal como está, à milésima, com o separador decimal do idioma de apresentação — como fazia o formato predefinido.
// 4.0 : decimals, prefix, suffix and thousands as four arguments
uo_chart.of_set_value_format(/*decimals*/ 0, /*prefix*/ "$", /*suffix*/ "K", /*thousands*/ true)
uo_chart.of_set_value_format(/*axis*/ u_pbt_chartcartesian.AXIS_VALUE2, /*decimals*/ 1, /*prefix*/ "", /*suffix*/ " u", /*thousands*/ false)
// 5.0 : a display format, written as in a DataWindow - for the chart, then for one axis
uo_chart.is_format = "$#,##0K"
uo_chart.of_axis(/*axis*/ u_pbt_chartcartesian.AXIS_VALUE2).is_format = '0.0" u"'
A receita: compile; cada of_set_value_format e of_clear_value_format é assinalado. Escreva o formato como numa DataWindow: decimals dá o número de 0 depois do ponto (-1 = #,##0.###), thousands a , do agrupamento, o prefixo e o sufixo escrevem-se antes e depois (entre aspas se contiverem algarismos ou espaços). O formato de um eixo vai para of_axis(<eixo>).is_format.
12.5 Outros comportamentos que pode ver #
| O quê | 4.0 | 5.0 | ||
|---|---|---|---|---|
Menus nativos de um componente com um acento próprio (il_theme_accent) | o acento só se via na caixa de uma entrada marcada | a entrada apontada também o mostra, com um filete na margem inicial (à direita em RTL) | ||
button: Ctrl, Alt ou Shift + Enter (e Ctrl / Alt + Espaço, Ctrl + Esc) no botão que tem o focus | clicavam esse botão | vão para a janela, como a partir de qualquer outro controlo: dispara o atalho de outro botão (is_shortcut = "Ctrl+Enter"), não o botão com o focus; Enter e Espaço sozinhos continuam a clicá-lo | ||
button esbatido com ib_default (ou ib_cancel), o mais próximo do focus, numa folha MDI | Enter (Esc) ia para o botão predefinido de outra folha | a tecla fica na sua folha: recebe-a o campo, ou o CommandButton PB predefinido | ||
breadcrumb: ii_max_visible definido | um número exacto de segmentos em OVERFLOW_COLLAPSE (a largura já não dobrava nada), ignorado em OVERFLOW_SCROLL e OVERFLOW_SHRINK | um tecto nos três modos; em OVERFLOW_COLLAPSE a largura dobra ainda mais quando a barra é demasiado estreita, e o local actual já não sai da barra | ||
breadcrumb: of_add_child com um texto vazio | uma linha vazia no menu | a chave do ramo, como of_add_children | ||
breadcrumb: Ctrl+S, F5 e os outros atalhos da janela durante a escrita do caminho | não disparavam | disparam, como a partir de um SingleLineEdit; Enter e Esc ficam no campo | ||
breadcrumb: ue_children_needed que nunca devolve o controlo | nenhum chevron abria até ao próximo of_reset | um clique noutro chevron abandona a pergunta, e o trilho larga-a ao fim de 10 segundos | ||
chartcartesian: uma faixa ou um limiar sem cor (-1 ou NULL) | um bloco cheio da cor do texto | uma aguada pálida do acento do tema (a linha de um limiar: o acento); um limite NULL é recusado (-5) | ||
chartcartesian: um peso NULL num mapa de calor | a célula pintada da cor mais quente, etiquetada « NaN » | uma célula vazia: aí nada é desenhado, etiquetado nem clicável; uma bolha sem peso mantém o tamanho predefinido, fora da escala | ||
chartcartesian: of_remove_series | as séries seguintes mudavam de cor; a tooltip da série retirada vestia a série seguinte com a mesma chave | cada série mantém a cor tomada ao ser acrescentada; a tooltip e as cores de item vão com a série | ||
chartcartesian: of_append_values / of_append_categories com ib_animated | o gráfico inteiro voltava a cair no eixo e subia a cada acrescento, enquanto a janela não estava cheia | só sobe a forma acrescentada, as outras deslizam; a chegada inteira só se repete ao acrescentar uma série | ||
chartcartesian: barras empilhadas nos dois eixos de valores | as duas pilhas sobrepunham-se | lado a lado na categoria | ||
chartcartesian: uma etiqueta de marcação numa categoria ou etiqueta de valor | escrita tal como está no eixo, interpretada no painel | texto em todo o lado: a etiqueta é retirada (o eixo, o painel, #x#, #label#) | ||
chartcartesian: Esc sem nada aberto, Enter num buraco | retidos pelo gráfico | vão para a janela: o seu botão Cancelar, o seu botão predefinido | ||
codeeditor: Ctrl+Tab ou Alt+Tab no editor | indentavam o código: o teclado já não saía do editor | vão para a janela (a página seguinte de um separador); Esc e depois Tab sai do editor, Ctrl+M ou ib_tab_moves_focus deixam sair Tab | ||
codeeditor: of_find numa expressão regular inválida | devolvia 0 | devolve -5, como of_replace | ||
codeeditor: um novo is_text durante uma pesquisa | a barra ficava aberta e lançava ue_find_result | a barra fecha-se, sem lançar nada (um valor é mudo) | ||
codeeditor: is_syntax = "SQL" relido | "sql" | "SQL", tal como foi escrito | ||
codeeditor dobrado: #regionopen, a cópia e of_selected_text | mostrado #region; a cópia devolvia o que se via, sem as linhas das regiões fechadas | mostrado tal como foi escrito; a cópia e of_selected_text devolvem a origem do intervalo, regiões fechadas incluídas | ||
codeeditor: marcadores e il_doc_line quando se acrescentam ou retiram linhas acima | ficavam no mesmo número de linha | acompanham a sua linha; uma linha eliminada leva os seus marcadores | ||
codeeditor: o cursor depois de «Substituir tudo» (of_replace_all) | na última substituição | fica onde estava, deslocado pelo que foi inserido antes | ||
codeeditor: Ctrl+Z, Ctrl+Y | o histórico do navegador, perdido quando o texto era escrito com o foco noutro sítio | o histórico do componente (of_undo, of_redo): também conta o que o seu código faz, um novo is_text esvazia-o | ||
crypto: of_totp_verify(secret, code, ref al_step) num código escrito com espaços («864 010») | recusado, passo 0 | aceite, como na forma de dois argumentos; os espaços são ignorados | ||
crypto: of_base64_encode_file de um ficheiro de 32 a 64 MB numa aplicação de 32 bits | prometido até 64 MB; a memória do processo podia esgotar-se | "" e of_get_last_error() (32 MB no máximo em 32 bits); of_base64_encode_file_to_file codifica um ficheiro de qualquer tamanho noutro ficheiro | ||
crypto: of_totp_uri de um segredo escrito à mão («gezd gnbv», um «0») | escrito tal como estava no URI | escrito em base32 maiúsculo, sem espaços nem =; outro carácter: "" e of_get_last_error() | ||
crypto: um argumento NULL | is_last_error podia voltar NULL | conta como vazio; of_get_last_error() nunca é NULL | ||
crypto: um destino \x ou C:x (of_base64_decode_to_file, of_encrypt_file, of_decrypt_file) | -5 e uma mensagem errada («not a base64 value», «all needed») | -5, e of_get_last_error() diz que o caminho depende da pasta atual de uma unidade | ||
commandpalette: uma pesquisa e os comandos usados recentemente (is_recent) | um comando recente ganhava até il_max_recent × 4 pontos: com um limite alto, passava à frente de uma correspondência melhor | só desempata resultados que correspondem mais ou menos igualmente bem | ||
commandpalette: um comando sem grupo (as_group = "") declarado entre dois grupos | listado sob o cabeçalho do grupo declarado antes dele | no início da lista, sem cabeçalho | ||
commandpalette: Home / End no campo com texto, Shift+Home | moviam a seleção na lista; Shift+Home não selecionava nada | movem o cursor no campo; Ctrl+Home / Ctrl+End chegam à lista; Shift seleciona no campo | ||
commandpalette: um clique direito ou do meio numa linha | lançava o comando | não faz nada | ||
commandpalette: of_command numa chave que nenhum comando tem | ib_enabled / ib_visible liam-se true, uma escrita perdia-se em silêncio | leem-se false; uma escrita perde-se e of_get_last_error di-lo | ||
commandpalette: um segundo objeto paleta que tinha retomado um atalho é destruído | a tecla não respondia a ninguém até o primeiro a voltar a registar | o atalho volta ao primeiro | ||
commandpalette: is_recent com espaços ou chaves repetidas, il_max_recent mais baixo | "a, b" só guardava a; um duplicado aparecia duas vezes; is_recent continuava longo | limpo, cortado ao limite e devolvido limpo a is_recent na abertura | ||
dockcontainer: construir o dock, repor uma disposição | ue_layout_changed a cada adição, o primeiro conhecia um só painel: uma disposição gravada no evento era substituída por uma construída a meio | uma vez para uma rajada enquadrada por of_set_redraw(false) … (true), na retoma (e para alterações a menos de 40 ms); of_set_layout lança-o uma vez. Leia a definição gravada antes de criar os painéis | ||
dockcontainer: o painel à frente de uma pilha muda sem clique no seu separador | nada era lançado (um painel empilhado por of_add_panel ou of_move_panel, o da frente fechado, destacado ou retirado, um painel reacoplado) | ue_panel_selected do painel que passou à frente, após ue_panel_closed, ue_panel_floated ou ue_panel_docked; uma disposição reposta não o lança. n_pbt_dock_panel.ib_front relê-o | ||
dockcontainer: ib_visible = true num painel fechado de uma pilha | voltava atrás do separador ativo | passa para a frente, e ue_panel_selected segue; num grupo recolhido fica na calha | ||
dockcontainer: of_move_panel para o próprio painel (as_target = as_key) | devolvia 0 sem fazer nada, ou dividia a sua pilha | devolve -5; para dividir uma pilha, aponte para outro painel da pilha (of_move_panel("b", "a", POSITION_BOTTOM)) | ||
dockcontainer: um painel movido para um grupo recolhido, ou para fora dele | ib_pinned mudava sem evento | ue_panel_pinned segue | ||
dockcontainer: um clique sem deslocação num divisor | lançava ue_layout_changed | não lança nada: nada mudou | ||
dockcontainer: of_keys_at com chaves numéricas | primeiro as chaves inteiras (2, 10, zeta) | a ordem de adição (zeta, 10, 2) | ||
dockcontainer destruído em execução (CloseUserObject) | os seus controlos voltavam à janela, ocultos | recuperam a visibilidade que tinham antes de of_add_panel | ||
dockcontainer: of_add_panel de um controlo que CONTÉM o dock | as janelas fechavam-se em ciclo | devolve -5, o controlo fica onde estava | ||
crosstab: AGG_COUNT | contava as linhas | conta os valores não vazios, como a Contagem do Excel; AGG_COUNT_ROWS, novo, conta as linhas | ||
crosstab: uma soma sem qualquer valor; uma « diferença face ao anterior » junto a uma célula vazia | 0 | uma célula vazia (of_get_cell_value devolve NULL) | ||
crosstab: Top N ou Bottom N (of_set_value_filter, ou o menu) num campo colocado sob outro da sua zona | classificados sobre toda a tabela | classificados dentro de cada pai (a melhor cidade de cada região); no primeiro nível, inalterado; os membros empatados com o N-ésimo ficam todos | ||
crosstab: nenhum campo em Colunas | uma coluna de total que duplicava a única coluna (`Nord | 650 | 650`) | deixa de haver coluna de total; ib_col_grand_total mantém o seu valor |
crosstab: várias medidas e campos em Colunas | uma coluna Total por medida, sem nome de medida, e que não se ordenava | um cabeçalho « Total » e depois um cabeçalho por medida, ordenável | ||
crosstab: ue_layout_changed | desencadeado pelos gestos do utilizador, e só por is_thousands e of_remove_field | desencadeado também por qualquer ordem do código que mude o que of_get_layout devolve (of_set_layout incluído), uma vez por ordem; uma só vez no fim de uma construção enquadrada por of_set_redraw(false) … (true); nunca se nada mudar, nem com of_reset | ||
crosstab: uma percentagem (SHOW_PCT_*) | 57.9 % em todas as línguas | escrita como a língua de apresentação a escreve: 57.9% em inglês, 57,9 % em francês | ||
crosstab: o filtro de etiqueta | proposto pelo menu do chip de um campo numérico apenas; numa data, of_set_label_filter comparava o ano (2025-03-15 valia 2025) | proposto para qualquer campo; numa data, a sobrecarga de texto recebe dias: LABEL_BEFORE, LABEL_AFTER, LABEL_BETWEEN ("yyyy-mm-dd", dias incluídos); a sobrecarga numérica, ou LABEL_CONTAINS / LABEL_BEGINS / LABEL_ENDS, numa data: -5 | ||
crosstab: of_group_date_field num campo que não contém datas | 0, e um único membro « (vazio) » | -5 | ||
crosstab: of_add_calc_field / of_add_calc_measure recusados pela grelha (nome já usado, fórmula que não compila) | 0; só ue_calc_field_error o dizia | -5 e o motivo em of_get_last_error (ue_calc_field_error continua a ser desencadeado); um nome que contém / ou ` | : -5; uma fórmula aceita .5 e 1e3` | |
crosstab: of_set_value_filter Top ou Bottom de menos de 1 membro; of_expand_to_level abaixo de 1 | trazidos para 1 | -5 | ||
crosstab: of_get_cell_value chamado a partir de um evento desencadeado durante uma ordem deste script | -2, como um componente não criado | -4, e of_get_last_error diz porquê: leia depois do evento | ||
crosstab: o menu Opções da grelha (a roda dentada) | « Total geral » e « Subtotais » alternavam os dois eixos segundo o das linhas | uma entrada por eixo: linha e coluna do total geral, subtotais das linhas e das colunas | ||
crosstab: of_from_datastore — uma coluna CHAR, um decimal, o Format de uma coluna | os espaços de preenchimento ficavam no membro; o Format era ignorado | os espaços de preenchimento são retirados; um decimal lê-se com o separador do posto; o Format da coluna é o formato predefinido dos seus valores | ||
datagrid: uma linha selecionada que a pesquisa ou um filtro oculta, ou que of_remove_row remove | ficava selecionada em silêncio (of_selected_keys e ue_row_menu_clicked levavam-na) | sai da seleção, e ue_selection_changed di-lo; of_select_rows não toma uma linha oculta | ||
datagrid: ib_hidden, is_pin, ii_index postos no valor que já têm; um clique na pega sem a arrastar | lançavam ue_layout_changed | não lançam nada: nada mudou | ||
datagrid: alterações da disposição entre of_set_redraw(false) e of_set_redraw(true) | um ue_layout_changed por alteração | um só, ao retomar, com a disposição final | ||
datagrid: um tipo ou um renderizador fora das constantes (of_add_column, is_renderer, is_selection_mode); of_add_row_menu_item sem componente criado | aceites e relidos tal como estavam, sem efeito; 0 | of_add_column devolve -5 (of_get_last_error diz qual); um renderizador desconhecido relê-se "", um modo desconhecido SELECT_NONE; -2 | ||
datagrid: of_reload_row ou of_update_row de uma célula modificada | a marca «modificada» ficava | desaparece: a linha volta a ter o que o DataStore tem | ||
datagrid: editar uma coluna com tabela de códigos, uma data; uma coluna time de um DataStore | o <select> e o campo de data do motor; uma hora era texto | a lista e o calendário da biblioteca (uma data também se ESCREVE, na ordem da língua); uma hora (TYPE_TIME): ordenação, filtro > 09:00, formato, escrita 9:5 | ||
datagrid: um filtro > 3 numa classificação sem tipo ou numa coluna com tabela de códigos | procurava o texto «> 3»: nenhuma linha | compara o dado (o número, o código) | ||
datagrid: uma árvore sob uma pesquisa; uma linha cujo pai não está na grelha | o filho encontrado ficava escondido; a linha nunca aparecia | os seus antepassados são mostrados, abertos; a linha fica na raiz | ||
datagrid: of_from_datastore / of_load_rows depois de of_open_source; of_append_rows sem chave depois de of_from_datastore; um valor CHAR | a grelha ficava em esqueletos; a linha era recusada (-5); mantinha o seu preenchimento de espaços | a origem é abandonada; a chave segue o maior RowID; aparado | ||
datagrid: of_export_xlsx | as datas eram escritas como texto; sem tecto | datas Excel verdadeiras; um livro demasiado pesado (além de cerca de 18 MB) é recusado, ue_xlsx_saved diz porquê | ||
messagebox: Esc ou Alt+F4 numa caixa sem botão de cancelamento | fechavam a caixa e devolviam 0 — também of_info, que prometia 1 | como no Windows: uma caixa com um só botão fecha por esse botão (of_info devolve 1), uma caixa Sim / Não não fecha — é preciso responder; ib_closable = true devolve o 0 da 4.0. Um teste = 2 migrado de um MessageBox já não deixa passar uma eliminação | ||
messagebox: um atalho (of_info, of_error, of_confirm, of_prompt…) depois de definir il_accent, is_position, ib_movable, um tamanho ou ib_input_password | tudo era apagado em silêncio: a palavra-passe de of_prompt aparecia em claro | o atalho só substitui o conteúdo (título, mensagem, ícone, botões, caixa, escolhas); a aparência e as definições do campo ficam. of_reset() apaga tudo | ||
messagebox: of_reset() depois de uma caixa | of_get_last_error, of_checked, of_action e of_input_value ainda falavam da caixa anterior | são repostos | ||
messagebox: um campo obrigatório preenchido com espaços | aceite | vazio: o botão predefinido espera (o valor escrito volta tal como está) | ||
messagebox: uma zona [action] no título, num rótulo ou no rodapé; uma ligação numa escolha; dois botões com a mesma mnemónica | a zona não fazia nada; a ligação abria o navegador E escolhia; Alt+letra respondia com o primeiro botão | a zona responde como na mensagem (of_action); a ligação abre sem escolher; Alt+letra passa o foco de um botão para o outro, Enter escolhe | ||
messagebox: Ctrl+C | perdia o & de &&, copiava as etiquetas de um botão, ignorava a entrada | os rótulos tal como aparecem, « rótulo: valor » do campo (nunca uma palavra-passe), os detalhes e o rodapé | ||
messagebox: um descendente que chamava xx_set_style_override ou xx_clear_style_override (protegidas) | substituía um token de tema da caixa | desapareceram: il_accent colore a caixa | ||
json e jsontree: um nível de caminho que contém ~0 ou ~1 | lido tal como está; uma chave que contém / não tinha caminho | ~1 é um / da chave, ~0 um ~ (JSON Pointer, RFC 6901): paths/~1users lê a chave /users; uma chave que contém um ~ escreve-se ~0 num caminho | ||
json: um nível de caminho vazio (a//b, a/) ou um caminho que começa por / | recusado com -5, lido como ausente | um nível vazio é a chave "", uma / inicial é a forma completa do ponteiro: /name vale name, / designa a chave "" da raiz | ||
json: of_get_number, of_get_decimal, of_get_longlong sobre uma cadeia como "12 kg" ou "1,5" | lia o início: 12, 1 | 0: uma cadeia só conta se for inteiramente um número JSON — "12.50" continua a valer 12,5 | ||
json: of_set_members de uma chave que o documento já tem | a chave era escrita uma segunda vez: n_pbt_json lia a primeira, um navegador ou um servidor a última | o valor é substituído no lugar; uma chave que o fragmento repete mantém o seu último valor | ||
json: of_pretty de um documento com um valor of_set_raw aninhado em mais de 512 níveis | outro documento, cortado em 512 níveis | um texto vazio | ||
jsontree: clique numa chave que contém /, numa chave vazia, ou sob uma chave duplicada | um caminho que lia OUTRO valor em n_pbt_json | x~1y para a chave x/y, a//b para uma chave vazia; of_selected_addressable devolve false sob a segunda de duas chaves idênticas | ||
jsontree: Ctrl+C com um pedaço de texto realçado com o rato | o nó inteiro | o pedaço realçado | ||
jsontree: um texto JSON que começa com um BOM | recusado (ue_error) | mostrado, como n_pbt_json o lê; is_json relê-se tal como foi posto | ||
jsontree: a mensagem de ue_error em inglês | Invalid JSON : … | Invalid JSON: … (cada língua mantém a sua pontuação); 01, 1., 1e dizem Bad number | ||
jsontree: of_expand_path durante uma pesquisa | dobrado de novo no passo seguinte da pesquisa, sem ue_node_toggled | fica aberto, com os blocos abertos acima dele | ||
jsontree: Espaço num valor selecionado | deslocava a árvore uma página | não faz nada (um bloco continua a dobrar) | ||
xmltree: um espaço entre dois filhos (<b>x</b> <i>y</i>) | não tinha linha: /p/text()[1] devolvia -5 | uma linha própria, mostrada ␠, com o seu caminho: os números de linha de um conteúdo misto mudam | ||
xmltree: um texto entre dois filhos (Hello <b>x</b> again) | Hello, again: espaços das margens cortados | Hello , again: só desaparecem as quebras de linha de paginação | ||
xmltree: of_select_path de um XPath cujo primeiro nó é um espaço de paginação (//text()) | -5 | é selecionado o primeiro nó que a árvore MOSTRA | ||
xmltree: of_selected_value de um elemento que só contém quebras de linha (mostrado <x/>) | "" | essas quebras de linha, como n_pbt_xml as lê | ||
xmltree: Ctrl+C com um pedaço de texto realçado com o rato | o XML do nó inteiro | o pedaço realçado | ||
xmltree: a mensagem de ue_error em inglês | Invalid XML : … | Invalid XML: … (cada língua mantém a sua pontuação) | ||
xmltree: of_expand_path durante uma pesquisa | dobrado de novo no passo seguinte da pesquisa, sem ue_node_toggled | fica aberto, com os elementos abertos acima dele | ||
xmltree: Espaço numa folha selecionada | deslocava a árvore uma página | não faz nada (um elemento com filhos continua a dobrar) | ||
jsontree, xmltree: uma pesquisa que se fecha (Esc na caixa, of_clear_search, of_reset, ib_search_enabled = false) | nenhum evento: uma linha « 3 / 12 » da aplicação ficava errada | ue_search_result(0, 0), uma vez; nada quando nenhuma pesquisa estava em curso | ||
PBT_SetDefaultFont com um tamanho: codeeditor, jsontree, xmltree, ribbon, toolbar, crosstab, datagrid, tilesbox, stepbar, listbar, dockcontainer, video, picture, menus e dicas | o código, o documento, o friso (o seu tamanho do tema) e muitos textos secundários mantinham o seu tamanho | seguem o tamanho da aplicação, nas suas proporções; o tamanho da aplicação prevalece sobre o do friso do tema; um ii_font_size do codeeditor prevalece sobre ambos | ||
markdownview: ue_link_clicked | (string as_url) | (string as_url, string as_kind): um script já escrito para o evento continua válido; as_kind (LINK_WEB, LINK_MAIL, LINK_DOCUMENT, LINK_FILE, LINK_OTHER) diz o que é a ligação — faça a triagem por ele em vez do texto do endereço | ||
markdownview: uma imagem de um documento numa partilha de rede | carregada | recusada, exceto se estiver na partilha de onde o documento foi lido, ou com ib_network_pictures; um documento lido da Web não mostra nenhum ficheiro do posto | ||
markdownview: um novo is_markdown do mesmo documento, of_refresh | a vista voltava ao topo | a posição de leitura é mantida; um novo is_source continua a começar no topo | ||
markdownview: of_toc, of_scroll_to e uma pesquisa logo após is_source | atuavam sobre o documento anterior | o ficheiro lê-se em segundo plano: of_toc devolve 0, of_scroll_to e a pesquisa esperam por ele; leia o índice em ue_loaded | ||
markdownview: uma coluna alinhada pelo autor (:--, --:) numa aplicação da direita para a esquerda | mudava de lado | mantém o seu lado; só o alinhamento predefinido segue o sentido | ||
markdownview: ue_load_failed para um texto definido por is_markdown | nunca levantado | levantado (REASON_FAILED, as_source vazio) para um texto que o componente não sabe ler; o documento anterior continua mostrado | ||
menubar: o atalho de uma entrada (is_shortcut) | agia sobre o estado deixado pela última abertura do menu | lança primeiro ue_menu_opening do seu menu, como o Windows: uma entrada que esse evento esbate não responde, e ue_menu_closed di-lo | ||
menubar: uma abertura abandonada antes de aparecer (deslize rápido, Esc ou Alt durante ue_menu_opening, perda do foco) | ue_menu_opening sem ue_menu_closed; depois de Esc a lista abria-se mesmo assim | nada abre, e segue-se ue_menu_closed: cada ue_menu_opening recebe exatamente um ue_item_selected ou um ue_menu_closed | ||
menubar: Alt e depois Esc, F10 e depois Esc | Esc ia também para a janela: o seu botão Cancelar | Esc sai do modo de menu e fica na barra | ||
menubar: um menu aberto pelo teclado (Alt+letra, F10 e depois Enter) | nenhuma entrada realçada: Enter não escolhia nada | a primeira entrada está realçada, Enter escolhe-a | ||
menubar: Alt quando a barra já tem o foco | o modo de menu mudava ao premir: Alt+Shift (esquema do teclado) ligava-o | ao soltar um Alt sozinho, como o Windows | ||
menubar: um clique num título esbatido ou na parte vazia da barra | a barra ficava com o teclado, o campo em edição perdia-o | o teclado fica no controlo onde se escrevia | ||
menubar: is_shortcut num endereço que não designa nenhuma entrada | a tecla ficava tomada em toda a janela, mesmo depois de of_clear | nada é armado: defina-o depois de of_add_item | ||
pdfviewer: ib_allow_save / ib_allow_print de um visualizador | valiam para todos os visualizadores da aplicação; um of_reset noutro lado devolvia Guardar a um documento confidencial | cada visualizador mantém a sua própria definição | ||
pdfviewer: ib_allow_save / ib_allow_print definidos antes de is_source | três carregamentos, três ue_load_completed; um documento em falha era repetido a cada alteração | um único carregamento; um documento em falha não é repetido | ||
pdfviewer: ii_page definido enquanto um documento é apresentado, depois outro is_source | o documento seguinte abria nessa página | a página era a do documento apresentado: o seguinte abre na sua primeira página; para abrir um documento numa página, defina is_source e depois ii_page | ||
pdfviewer: o mesmo valor definido de novo (ii_page, ii_zoom, is_fit, ib_viewer_toolbar) | recarregava o documento e acionava ue_load_completed | não faz nada | ||
pdfviewer: ii_zoom fora de 25 a 500 | passado tal como está ao leitor | trazido para 25 a 500, relido tal como aplicado | ||
pdfviewer: um endereço https://nome:segredo@…; uma origem feita de espaços | passado ao leitor, que o recusava com um motivo vago, o segredo voltava nos eventos; relida tal como está, of_refresh devolvia 0 | recusado de imediato por ue_load_failed (REASON_UNSUPPORTED): descarregue o documento com o restclient; relida "", of_refresh devolve -4 | ||
picture: id_max_zoom numa imagem maior do que a sua moldura | a roda, + e id_zoom subiam até ao tamanho real | param no limite; só a tecla 1 vai além | ||
picture: uma nova is_source, ou ib_zoomable = false, numa imagem ampliada | o zoom voltava a 1.0 sem dizer nada | é emitido ue_zoom_changed(1.0) (of_reset continua mudo); defina id_zoom depois de is_source | ||
picture: um caminho rodeado de espaços (uma coluna CHAR) | recusado, REASON_UNSUPPORTED | apresentado; is_source relê-se tal como foi escrito | ||
picture: as teclas do zoom com Ctrl, Alt ou Windows premido | Ctrl++ ampliava, Alt+1 mostrava o tamanho real | deixadas à sua aplicação (atalhos, mnemónicas) | ||
picture: uma imagem recolorida (mono:, tint:) de outro sítio cujo servidor recusa pedidos de outra origem | ue_loaded e uma moldura vazia | ue_error com REASON_FAILED, a mensagem diz porquê | ||
radialmenu: is_tooltip, is_super_tooltip_title, is_super_tooltip_text, is_super_tooltip_image | existiam, nunca mostravam nada: o lançador não tem superfície | retiradas: o compilador mostra a linha, apague-a | ||
radialmenu: of_close, um segundo of_show, of_clear ou of_reset enquanto uma roda está aberta | ue_dismissed chegava quando a roda saía do ecrã; of_is_open ficava verdadeiro até lá | ue_dismissed de imediato, uma vez por abertura; of_is_open falso assim que a chamada regressa | ||
radialmenu: of_remove_item de um ramo que a roda aberta não mostra (oculto) | a roda fechava (ue_dismissed) | a roda fica aberta; só fecha se mostrava o ramo | ||
radialmenu: of_remove_item com uma chave simples ("csv") | -5 | resolvida como faz of_item (o único ramo que a tem); -5 se dois ramos a partilham | ||
radialmenu: of_show de uma roda sem nada para mostrar enquanto outra está aberta | ue_dismissed, e a roda anterior ficava no ecrã | a roda anterior também fecha: um ue_dismissed por cada abertura | ||
radialmenu: il_back_color_hover de um ramo sem il_text_color_hover | o rótulo apontado mantinha o texto do tema (branco sobre rosa-pálido num tema escuro) | é escolhido um texto legível sobre essa tonalidade; uma cor que defina nunca é mudada | ||
restclient: ib_windows_auth ou is_client_certificate, e um redirecionamento para outro anfitrião | as credenciais Windows e o certificado seguiam o redirecionamento | só o anfitrião e a porta do pedido os recebem: o outro anfitrião recebe o pedido sem eles | ||
restclient: um valor de cabeçalho para além do Latin-1 (grego, japonês…) | aceite por of_set_header (0), depois cada pedido do objeto devolvia -5 | recusado logo por of_set_header (-5, of_get_last_error() diz porquê); of_set_basic aceita-os: o seu par parte como base64 do seu UTF-8 | ||
restclient: um método mal formado ("GE T"), credenciais no URL (https://user:pwd@…), um nome de campo de of_upload com aspas | -4 «request failed: 0»; as credenciais desapareciam sem uma palavra; o corpo multipart ficava partido | -5, e o motivo em of_get_last_error() (para credenciais: use of_set_basic) | ||
restclient: uma 303, ou uma 301 ou 302 após um POST, que segue como GET | mantinha o Content-Type do corpo de partida | parte sem Content-Type | ||
restclient: ue_progress | lançado para todo o corpo assíncrono, sem nunca atingir o total: uma barra ficava nos 39 % | lançado para todo o corpo assíncrono (a documentação di-lo), e o último, mesmo antes de ue_response, vale o total | ||
restclient: of_response_header de um cabeçalho enviado várias vezes (Link, Set-Cookie) | só o primeiro valor | todos, unidos por , — Set-Cookie por uma quebra de linha | ||
restclient: o User-Agent enviado | PBToolboxAI/4.0, escrito no código | a versão da biblioteca; of_set_header("User-Agent", …) continua a substituí-lo | ||
restclient: um pedido quando o cliente HTTP não pôde ser criado | partia numa sessão descartável, sem autenticação Windows, certificado de cliente nem cookies | -2, e il_status di-lo | ||
restclient: of_set_header("Authorization", …) após of_set_basic | partiam as duas autenticações | uma só autenticação: o Authorization definido substitui o Basic | ||
ribbon: um valor escrito pelo código (is_text, id_value) enquanto o campo de uma caixa de combinação ou de um contador tem o foco | o campo mantinha o texto antigo; ao sair era levantado ue_combo_changed / ue_value_changed com o valor antigo, que substituía o seu | o campo mostra-o de imediato, a não ser que o utilizador esteja a escrever (ganha o que escreve); sair do campo sem escrever não levanta nada | ||
ribbon: um rótulo com etiquetas (is_label, título de um separador, de um grupo, de uma faixa, botão da aplicação) | mostrado tal como escrito, etiquetas incluídas (o painel de um grupo recolhido interpretava-as) | a formatação com etiquetas é interpretada em todo o lado; um texto do utilizador passa por of_escape_markup | ||
ribbon: a roda sobre a faixa | cada pequeno movimento de um touchpad mudava de separador; uma faixa recolhida também mudava de separador sem mostrar nada | um separador por entalhe da roda (os pequenos movimentos somam-se); nada numa faixa recolhida | ||
ribbon: of_add_spinner com um incremento de 0 ou menos, ou um mínimo acima do máximo; id_min / id_max / id_step incoerentes | aceites: setas mortas ou invertidas, um valor fora do intervalo mostrado | of_add_spinner devolve -5 e mantém o valor dentro do intervalo; um incremento de 0 ou menos é recusado (of_get_last_error diz porquê); um limite escrito para além do outro leva-o consigo, como num NumericUpDown — a ordem das duas escritas já não conta | ||
ribbon: um is_keytip que não é feito de letras A-Z e algarismos ("É", "-") | guardado e lido, nunca alcançável pelo teclado | recusado: nada muda, of_get_last_error diz porquê | ||
ribbon: Esc no segundo nível das teclas de acesso (os comandos de um separador) | fechava todas as teclas | volta às letras dos separadores, como no Office; um segundo Esc fecha | ||
speechout: of_speak_from(0) ou um número negativo | lia a partir da primeira frase | -5, nada é lido (as posições contam a partir de 1) | ||
speechout: ii_rate, ii_pitch, ii_volume definidos fora do seu intervalo (ii_rate = 1000) | reliam-se tal como definidos (1000) enquanto a voz aplicava o limite | relêem-se tal como aplicados (400) | ||
speechout: um pedaço [rate]…[/rate] numa frase | uma frase própria: o seu ue_sentence, o seu número, e um ponto após [/rate] tornava-se uma «frase» | fica na sua frase: um único ue_sentence com o texto inteiro, um único número, ue_word conta nesse texto, of_spoken_text uma linha por frase; a pontuação vai com o pedaço | ||
speechout: [rate=0] | lido a 100 % | a velocidade mais lenta, 10 % | ||
speechout: uma regra de of_add_replacement sobre uma palavra que é também o nome ou o valor de uma etiqueta (total com [mark=total], rate, uma palavra em [spell]) | reescrevia a etiqueta: a marca mudava de nome, a etiqueta era lida em voz alta, o texto soletrado mudava | a regra só reescreve o texto entre as etiquetas | ||
speechout: um posto sem nenhuma voz | ue_error, depois uma leitura «em curso»: ue_started, cada ue_sentence, ue_stopped; of_speak_sync devolvia 0 | ue_error e mais nada: nenhuma leitura, nenhum ue_started; of_speak_sync devolve -4 | ||
speechout: is_lang sem região ("fr", "en") | ue_voice_fallback em cada leitura | nenhum recurso alternativo para uma voz desse idioma, seja qual for a região | ||
speechout: of_clear_queue depois de um of_speak (a leitura em curso não é um texto da fila) | ue_queue_done no fim da leitura | nenhum ue_queue_done: nenhum texto da fila foi lido | ||
speechout: uma inicial (John F. Kennedy), um mês abreviado (Oct. 10), uma sigla com pontos (U.S.) | terminava a frase | fica na frase (um mês ou uma sigla termina-a antes de uma maiúscula, como etc.): os números de frase podem mudar | ||
statusbar: um painel clicável desativado com uma dica | a dica nunca aparecia | aparece, para dizer porque o painel está desativado | ||
statusbar: of_count, of_keys_at, of_has no endereço de um painel ("enc") | 0, "", false: as entradas da sua lista não eram vistas | as entradas da sua lista, sem os separadores | ||
statusbar: uma posição numa lista pendente (of_insert_menu_item, of_move_menu_item) | contava os separadores | conta só as entradas, como as posições dos painéis | ||
statusbar: uma chave de painel ou de entrada que começa por __ | aceite | recusada, -5: está reservada ao componente | ||
statusbar: is_tooltip e as cinco cores numa entrada de lista (of_menu_item) | guardados e relidos, sem efeito | ignorados, relidos vazios (-1 para uma cor): o menu nativo não os mostra | ||
statusbar: a pega (ib_show_resize_grip) numa folha MDI, ou uma barra que não está no fundo da sua janela | redimensionava a moldura, a partir do seu canto | redimensiona a folha; sem pega quando a barra não ocupa o canto inferior | ||
statusbar: a tecla Menu ou Shift+F10 num painel com o foco | nada | ue_panel_rclicked, no canto inferior esquerdo do painel | ||
stepbar: Enter ou Espaço numa etapa, numa janela que tem um botão predefinido | ue_step_clicked e o botão predefinido («Seguinte») era acionado | só ue_step_clicked: a tecla fica na barra | ||
stepbar: of_clear_steps enquanto a barra está numa etapa | não lançava nada | ue_step_changed(número deixado, chave deixada, 1, ""), como a remoção da etapa atual; of_reset não lança nada | ||
stepbar: ii_current para lá de «tudo concluído» (mais do que o número de etapas + 1) | ue_step_changed anunciava logo um número que não existia; a chegada da etapa era muda | nada é lançado enquanto a barra espera; ue_step_changed é lançado quando a etapa chega | ||
stepbar: of_move_step numa barra «tudo concluído» | podia reabrir a barra: uma etapa voltava a estar em curso, com ue_step_changed | a barra fica em «tudo concluído», nada é lançado | ||
stepbar: NAV_VISITED, uma etapa inserida ou deslocada para a frente da etapa atual | clicável | mostrada concluída, mas não clicável: nunca foi alcançada | ||
stepbar: uma etapa com aviso (STATE_WARNING) | um marcador âmbar | um marcador âmbar e um segundo anel âmbar: já não se parece com uma etapa concluída onde o acento é âmbar | ||
statictext: ue_hyperlink | (string as_url) | (string as_url, boolean ab_opened): um script já escrito para o evento continua válido; ab_opened vale FALSE quando a hiperligação não se abriu (um esquema diferente de http, https, mailto — of_get_last_error() diz porquê —, ou mantida fechada por ue_hyperlink_opening) | ||
statictext desativado sobre um fundo próprio (il_back_color, uma porção [bk]) | o texto tomava o cinzento do tema, ilegível sobre um fundo escuro ou colorido | as suas cores são mantidas e atenuadas; na superfície do tema, o cinzento do tema, como antes | ||
statictext: PBT_SetDefaultFont com um tamanho | o tamanho ficava em 11 pt | o tamanho dado aplica-se (11 pt sem ele, sem alteração) | ||
statictext: ii_font_size fora de 6 a 200 | aplicado tal como estava | trazido para o limite mais próximo, como a etiqueta [size], e relido tal como aplicado | ||
statictext: duplo clique numa palavra com ib_selectable | um só ue_clicked antes de ue_double_clicked | dois ue_clicked e depois ue_double_clicked, como o StaticText do PowerBuilder; soltar depois de um arrasto que seleciona continua sem clique | ||
statictext: of_reset de um texto anunciado como cortado | nada | ue_text_overflow(false) | ||
statictext: is_text relido depois de of_append_text, quando uma linha deixava uma etiqueta aberta | [b]Start[br]two: reposto, o negrito continuava na linha seguinte | [b]Start[/b][br]two, o que o ecrã mostra; uma linha vazia mantém a sua altura; com ib_marquee, as linhas deslizam como uma só linha | ||
statictext: ib_auto_width e um texto esvaziado | mantinha a largura do texto anterior | encolhe até à sua margem; uma mudança de tema também volta a medir a largura | ||
xml: of_count, of_get_values, of_get_attrs, of_get_attr_names quando nada está carregado, um elemento construído ainda está aberto ou o motor recusa o XPath | devolviam 0, como uma pesquisa sem resultado | devolvem -4 (-2 se a página não responder), of_get_last_error() diz porquê; 0 é sempre um zero verdadeiro. Um teste > 0 não muda; um teste = 0 que queria dizer «nada encontrado» vê agora a recusa à parte | ||
xml: of_get_attr e of_remove_attr de um atributo ausente, of_get_attrs com um nome vazio | vazio sem motivo, 0 («feito»), 0 | vazio e «no such attribute» em of_get_last_error() (um atributo escrito vazio fica sem motivo), -4, -5 | ||
xml: of_set_value, of_set_attr, of_add_child de um texto com um carácter de controlo (Char(1)) ou um CR | escrito tal como estava: o documento já não se recarregava, o CR voltava como LF | o carácter proibido é retirado, como faz o builder; o CR escreve-se e relê-se | ||
xml: builder — um segundo elemento no topo, um texto sem elemento aberto, um atributo depois de um filho | escrito (duas raízes) ou ignorado sem uma palavra | deixado de fora, e of_get_last_error() diz porquê | ||
xml: of_get_value("sum(//qty)") sobre um texto não numérico; of_get_value("/") | o texto NaN; vazio | vazio e «the expression is not a number»; o texto do documento |
A receita: nada a mudar.
12.6 O que foi acrescentado #
Nada do que se segue pede para alterar o seu código. Os oito novos componentes da 5.0 são apresentados nas notas de versão.
| Objeto | Acrescentado |
|---|---|
| progressbar | is_unit: um texto escrito depois da leitura ("of 500 rows", "MB") |
| datagrid | is_mask de uma coluna (n_pbt_datagrid_column): a máscara de entrada de uma coluna numérica; uma coluna sem formato de apresentação mostra a sua is_mask |
| datagrid | o teclado dos cabeçalhos (Seta para cima a partir da primeira linha; Enter ordena, Shift+Enter acrescenta à ordenação; Alt+Baixo ou a tecla Menu abre o menu da coluna; Ctrl+Shift+setas movem-na, Alt+setas mudam a sua largura); TYPE_TIME; of_get_last_error diz porque uma chamada devolveu -5 |
| ribbon | is_mask e is_format de um contador (n_pbt_ribbon_item); is_group: alternadores exclusivos de um grupo (n_pbt_ribbon_item) e entradas de opção de um menu (n_pbt_ribbon_menu_item); ue_item_rclicked (clique direito num controlo, num grupo, num separador ou num botão da barra de acesso rápido, com o ponto do ecrã al_x, al_y; também tecla Menu e Shift+F10) e ue_rclicked (fora de qualquer item); is_title de um grupo contextual (n_pbt_ribbon_ctx_group), cuja dica aparece na faixa; teclas de acesso dos botões da barra de acesso rápido; cores de item das entradas de menu e dos botões da barra de acesso rápido; nomes acessíveis de todos os controlos |
| breadcrumb | escrever o caminho torna-se uma barra de endereço: ib_auto_complete, ue_path_typing e of_add_suggestion (conclusão durante a escrita), ib_veto_path, ue_path_entering e is_path_error (um caminho recusado mantém o que foi escrito) |
| chartcartesian | of_from_datastore (DataStore, DataWindow, DataWindowChild), of_map e as constantes ROLE_*, of_reload: o gráfico de um DataWindow (linhas somadas por categoria e série, relidas no lugar); of_set_point_color / of_get_point_color; ue_point_rclicked, ue_rclicked; of_get_categories; of_remove_axis_section |
| codeeditor | of_undo, of_redo, ib_can_undo, ib_can_redo e ue_undo_state_changed (o histórico de anulação controlável); ue_modified_changed; of_toggle_comment (Ctrl+/); of_next_marker (F8); ib_match_brackets; ib_tab_moves_focus (Ctrl+M) |
| crypto | os blobs (of_base64_encode_blob, of_base64_decode_blob, of_hash_blob, of_hmac_blob, of_crc32_blob, of_encrypt_blob, of_decrypt_blob); of_base64_encode_file_to_file; of_jwt_verify_jwks, of_jwk_to_pem, of_pem_to_jwk; os claims esperados de of_jwt_verify e il_jwt_leeway_seconds; JWT_HS384/HS512, JWT_RS384/RS512, JWT_PS256/PS384/PS512, JWT_ES384 e KEY_EC_P384; o esquema e o hash de of_sign / of_verify (SIGN_PKCS1, SIGN_PSS); os dados adicionais de of_encrypt_with_key / of_decrypt_with_key; o hash de of_rsa_encrypt / of_rsa_decrypt; as definições de of_totp_code, of_totp_verify, of_totp_uri e of_hotp_code; of_password_needs_rehash |
| buttonbar | is_style de um botão (STYLE_PRIMARY, STYLE_FLAT, STYLE_DANGER), is_badge (um emblema de texto), il_badge_color, is_mnemonic, ii_image_size e ii_badge_size da barra, ib_enabled da barra inteira, ue_button_rclicked e ue_rclicked, of_clear_shortcuts |
| commandpalette | of_load_menu(menu): a paleta preenchida a partir de um menu PowerBuilder, relido a cada abertura; of_loaded_item(as_key) devolve o item de um comando; of_get_last_error() |
| dockcontainer | ib_front de um painel (n_pbt_dock_panel, só leitura): o painel que a sua pilha mostra; a entrada Ocultar automaticamente do menu do painel, também na patilha da calha; Shift+F10 e a tecla Menu abrem esse menu sob o separador; o painel ativo, o que tem o teclado: of_active_panel() e ue_active_panel_changed(as_key) |
| crosstab | of_value(position) e o seu handle n_pbt_crosstab_value (um valor da zona Valores: is_agg, is_show, is_conditional_formatting, is_format, ib_negative_red, is_label, of_field()); of_value_count, of_remove_value, of_move_value; of_get_cell_rows (as linhas do DataStore por trás de uma célula); is_format de um campo; AGG_COUNT_ROWS, LABEL_BEFORE, LABEL_AFTER |
| messagebox | of_messagebox (os argumentos de MessageBox(), Question! e YesNo! incluídos) e as constantes BUTTONS_*; of_retry_cancel; o botão predefinido de of_confirm, of_yes_no, of_yes_no_cancel (al_default); Repetir, Abortar, Ignorar, Fechar traduzidos; ib_closable, ib_sound; is_details, is_details_label; is_footer, is_footer_icon; ib_input_multiline, il_input_max_length, is_input_pattern, is_input_error; of_prompt que mascara e exige; uma escolha desativada (of_add_choice, ab_enabled) |
| jsontree | of_get_layout, of_set_layout e ue_layout_changed (as dobras, a seleção, a linha do topo); of_selected_addressable, of_selected_type, of_selected_count, of_copy_path; ue_node_rclicked (clique direito, tecla Menu); ib_find_decoded (a pesquisa nos valores descodificados, botão &) |
| xmltree | of_find_xpath (cada nó de um XPath, percorrido com of_search_next); of_get_layout, of_set_layout e ue_layout_changed (as dobras, a seleção, a linha do topo); of_selected_kind (constantes KIND_*), of_selected_name, of_selected_namespace, of_copy_path; ue_node_rclicked (clique direito, tecla Menu); ib_find_decoded (a pesquisa nos valores descodificados, botão &) |
| json | of_from_datastore e of_to_datastore (DataStore, DataWindow, DataWindowChild): um DataStore como array de objetos tipados, e volta; datas ISO 8601 (of_set_date, of_set_datetime, of_set_time, of_add_date, of_add_datetime, of_add_time, of_get_date, of_get_datetime, of_get_time); of_get_last_error e of_error_position (onde um texto não é JSON); of_escape_key |
| listbar | ue_item_invoked (um clique na entrada, incluindo a já selecionada); ib_search, is_filter, ue_filter_changed (uma pesquisa); of_from_datastore (DataStore, DataWindow, DataWindowChild), of_map e as constantes ROLE_* (uma linha = uma entrada) |
| markdownview | is_base_path, ib_allow_html (uma lista curta de etiquetas HTML inertes), ib_network_pictures, ib_remote_pictures, ib_tasks_editable e ue_task_toggled, ib_track_heading e ue_heading_visible, is_position, ii_zoom, of_selected_text, of_copy e Ctrl+Insert, as constantes LINK_*; os alertas do GitHub, os endereços de e-mail soltos e os emojis |
| menubar | of_load_menu(menu): toda a barra a partir do menu PowerBuilder de uma janela, relido a cada abertura, os seus Clicked executados; of_loaded_item; of_insert_item (uma entrada numa posição) e of_clear_items (esvaziar uma cascata mantendo a entrada); of_open, of_close, of_is_open |
| pdfviewer | of_load_blob(blob) e of_load_blob(blob, string): um PDF guardado num blob (lido com SELECTBLOB), apresentado sem ficheiro, seja qual for o tamanho; is_find (um texto realçado na abertura); ib_navigation_pane (o painel lateral do leitor); is_destination (abrir num destino com nome do PDF); ib_allow_search, ib_allow_rotate e ib_allow_fullscreen (os comandos Procurar, Rodar e Ecrã inteiro da barra do leitor) |
| picture | of_set_picture(blob): uma imagem guardada em memória (SelectBlob), como SetPicture do Picture nativo; ib_clickable: a imagem torna-se um botão para o teclado (Tab, Enter, Espaço); os formatos TIFF, WMF, EMF e RLE, convertidos em tempo real; um nome para os leitores de ecrã que diz o emblema e a falha |
| radialmenu | of_show_over(dragobject ado_control {, boolean ab_keyboard}): a roda centrada num controlo, o seu primeiro ramo aceso quando vem do teclado; no manípulo de ramo, is_image (ícone mudado no lugar), is_tone (constantes TONE_* de u_pbt_radialmenu) e is_group (grupo de opção) |
| restclient | of_url e of_url_encode (uma consulta de URL codificada); of_post_form e of_post_form_async (um formulário HTML); of_oauth_client_credentials (um token OAuth2 renovado sozinho); of_retrieve (DataStore, DataWindow, DataWindowChild: um array JSON em linhas); os cabeçalhos de um só pedido (of_request e of_request_async, quarto argumento as_headers); is_last_request; ib_check_revocation |
| statusbar | ib_spring (e uma largura de -1 em of_add_panel, of_insert_panel): um painel que ocupa o espaço livre; of_dock_bottom (a barra no fundo da sua janela); is_help e is_help_panel (a MicroHelp de uma moldura PowerBuilder); ib_announce (leitores de ecrã); a dica de um texto cortado |
| tilesbox | of_move_tile(as_keys, as_to_key, al_position): um mosaico enviado pelo código para outro grupo, com as cores, o emblema e as faces; Esc cancela um arrastar, o painel desloca-se quando o ponteiro se aproxima do seu bordo; um leitor de ecrã ouve o emblema e a banda de um mosaico; um ícone SVG mantém-se nítido num mosaico grande; o cabeçalho de um grupo ilumina-se sob o ponteiro; a definição «menos animações» do Windows é respeitada |
| statictext | ib_mnemonic (o & de uma etiqueta PowerBuilder), ii_max_lines (no máximo N linhas, «…»), il_max_log_lines e of_clear (um registo limitado, esvaziado), ii_max_width (teto de ib_auto_width), ib_veto_links e ue_hyperlink_opening (decidir se uma hiperligação se abre); um registo é anunciado linha a linha aos leitores de ecrã; desativado, as zonas da marcação saem da ordem de Tab |
| xml | of_get_number, of_get_decimal, of_get_longlong, of_get_boolean, of_get_date, of_get_datetime: o valor no XPath verificado contra o seu tipo XML Schema e lido da mesma forma em qualquer máquina (NULL e of_get_last_error() se não for desse tipo) |
| xml | sobrecargas decimal, date, datetime, boolean de of_leaf, of_element_attr e of_set_value: escritas com um ponto e em ISO 8601 em qualquer máquina |
12.7 buttonbar: chave, rótulo e depois ícone; o « & » e o atalho #
A barra de botões falava de forma diferente do resto da biblioteca: o ícone antes do rótulo, a posição como segundo argumento, e um is_shortcut que queria dizer « letra Alt » onde em todo o lado quer dizer « atalho » — is_shortcut = "Ctrl+S" armava Alt+C. A 5.0 alinha-a com button, a barra de ferramentas e o CommandButton do PowerBuilder.
| O quê | 4.0 | 5.0 |
|---|---|---|
| Adicionar um botão | uo.of_add_button("save", "img\save.png", "Save") | uo.of_add_button("save", "&Save", "img\save.png") |
| Um botão só com texto | uo.of_add_button("ok", "", "OK") | uo.of_add_button("ok", "OK") |
| Inserir um botão | uo.of_insert_button("mid", 2, "", "Mid") | uo.of_insert_button("mid", "Mid", "", 2) |
| A letra Alt de um botão | is_shortcut ← "S" (Alt+S) | o rótulo "&Save", ou uo.of_button("save").is_mnemonic = "S" |
| Um atalho num botão | uo.of_register_shortcut("Ctrl+S", "save") | o mesmo, ou uo.of_button("save").is_shortcut = "Ctrl+S" — mostrado no tooltip |
| Um « & » num rótulo | mostrado tal como está | marca a letra Alt; && para um « & » escrito |
| O emblema | uo.of_button("inbox").il_badge = 3 | uo.of_button("inbox").is_badge = "3" (um texto: "New", "!"); il_badge continua aceite |
O botão com o foco, sem is_default | pintado com o acento cheio | apenas o seu anel de foco |
is_shortcutde um botão é um atalho. Durante a 5.0, uma letra sozinha ainda é lida aí como a letra Alt da 4.0 (passa parais_mnemonic); escreva antes o « & » no rótulo. Um atalho que a janela nunca pode lançar (uma letra sozinha,Ctrl+Shift) é recusado:is_shortcutrelê-se vazio,of_register_shortcutdevolve-5.- Um botão desativado já não rouba uma tecla. O botão predefinido desativado de uma barra, ou a letra Alt de um botão desativado, deixa o Enter e a letra para a janela — já não vão para o botão de OUTRA barra (duas folhas MDI); o atalho de um botão desativado deixa a sua tecla para a janela (um acelerador de menu, por exemplo). As setas saltam um botão desativado.
// 4.0 : the icon before the label
uo_bar.of_add_button(/*key*/ "save", /*image_file*/ "img\save.png", /*text*/ "Save")
// The Alt letter went to is_shortcut (the letter S alone), the chord to of_register_shortcut
uo_bar.of_register_shortcut(/*chord*/ "Ctrl+S", /*key*/ "save")
// 5.0 : key, label, icon - the "&" of the label gives Alt+S
uo_bar.of_add_button(/*key*/ "save", /*text*/ "&Save", /*image*/ "img\save.png")
// The chord is a property of the button, shown in its tooltip
uo_bar.of_button(/*key*/ "save").is_shortcut = "Ctrl+S"
A receita: compile; uma chamada de of_insert_button é assinalada (a posição passa para o fim). Um of_add_button de três argumentos continua a compilar: troque os dois últimos (o rótulo e depois o ícone) — um botão cujo rótulo é um caminho de ficheiro mostra-lhe os que faltam. Substitua cada is_shortcut de uma letra por um « & » no rótulo, e duplique todo o « & » que deva ser mostrado (R&&D).
12.8 crosstab: o formato dos valores através de is_format #
A tabela dinâmica escrevia os números de uma medida através de uma função de quatro ou cinco argumentos (casas decimais, separador de milhares, símbolo, símbolo antes), que valia para todos os valores de um campo: o mesmo campo duas vezes em Valores — o montante, e a sua parte do total — não podia ter dois formatos. A 5.0 põe-no sob a língua dos gráficos e dos indicadores: um formato de apresentação PowerBuilder em is_format, no handle do campo (of_field) para todos os seus valores, ou no handle de um valor (of_value(position), novo) só para ele. Vazio, um valor recebe o Format da coluna do DataWindow. Nenhum nome antigo sobrevive.
| O quê | 4.0 | 5.0 |
|---|---|---|
| O formato de todos os valores de um campo | uo.of_set_value_format("amount", 2, "locale", "$", true) | uo.of_field("amount").is_format = "$#,##0.00" |
| Um símbolo depois do número | uo.of_set_value_format("amount", 0, "", " EUR") | uo.of_field("amount").is_format = '#,##0" EUR"' |
| O formato de um valor (o mesmo campo duas vezes) | — | uo.of_value(2).is_format = "#,##0.00" |
| Os negativos a vermelho | só o menu do chip | uo.of_value(1).ib_negative_red = true |
| Voltar ao formato predefinido | uo.of_clear_value_format("amount") | uo.of_field("amount").is_format = "" (o Format da coluna do DataWindow) |
- O separador de milhares de um valor sem formato continua a ser
is_thousands, como o menu Opções da grelha: é o que fazia umof_set_value_formatcom separador vazio. A moeda que o menu do chip propõe continua a seris_currency_symbol. - Um valor sem formato mostra agora o Format da sua coluna do DataWindow, lido por
of_from_datastore: um montante cuja coluna tem#,##0.00aparece com duas casas decimais sem uma linha de código.
// 4.0 : decimals, thousands, symbol and its side as arguments - for every value of the field
uo_cross.of_set_value_format(/*field*/ "amount", /*decimals*/ 2, /*thousands*/ "locale", /*suffix*/ "$", /*symbol_before*/ true)
// 5.0 : a display format, written as in a DataWindow - for the field, then for its second value alone
uo_cross.of_field(/*field*/ "amount").is_format = "$#,##0.00"
uo_cross.of_value(/*position*/ 2).is_format = "#,##0"
A receita: compile; cada of_set_value_format e of_clear_value_format é assinalado. Escreva o formato como numa DataWindow: ai_decimals dá o número de 0 depois do ponto, um separador de milhares dá a , do agrupamento ("none": nenhum), o símbolo escreve-se antes ou depois (entre aspas se contiver algarismos ou espaços). O formato de um só valor vai para of_value(<posição>).is_format.
12.9 listbar: o clique direito traz o seu ponto, uma disposição anuncia-se #
A barra lateral junta-se à biblioteca em três pontos: o clique direito de uma entrada dá o seu ponto do ecrã como o das árvores, das grelhas e do kanban; uma ordem do código que muda a disposição anuncia-a como um gesto; uma entrada desativada já não se torna a seleção. Ganha também um evento para o clique na entrada já selecionada, uma pesquisa e a construção a partir de um DataStore (12.6).
| O quê | 4.0 | 5.0 |
|---|---|---|
ue_item_rclicked | (string as_keys) | (string as_keys, long al_x, long al_y): o ponto em píxeis do ecrã; a tecla Menu e Shift+F10 também o disparam |
of_set_layout que muda a disposição | nenhum evento | um ue_layout_changed (nunca ue_section_toggled) |
of_move_item / of_move_section para o lugar já ocupado | ue_layout_changed | nada: nada se moveu |
of_select_item de uma entrada desativada | 0, tornava-se a seleção | -5, sem perguntar ue_selection_changing; desativar a entrada já selecionada mantém-na |
ib_auto_width lido enquanto a barra está em calha | true | o que a aplicação definiu |
of_item de um endereço de um só nível ("nav") | alcançava a secção | um handle que não nomeia nada; uma secção alcança-se com of_section |
| A mesma letra escrita duas vezes | um prefixo dd, muitas vezes sem correspondência | a linha seguinte que começa por ela; um Espaço a meio de um prefixo pertence-lhe |
| Uma entrada desativada sob o ponteiro | sem dica | a sua dica aparece; o clique continua a não fazer nada |
// 4.0 : PointerX() of the userobject - the menu opened too high under a ribbon
m_entry.PopMenu(PointerX(), PointerY())
// 5.0 : the pointer of the WINDOW for a PowerBuilder menu (al_x, al_y serve a menu of the library)
m_entry.PopMenu(parent.PointerX(), parent.PointerY())
A receita: nada se recusa a compilar — um script de ue_item_rclicked mantém as_keys. Abra o seu menu no ponteiro da janela (parent.PointerX()), ou passe al_x, al_y a of_show de um contextmenu. Defina a seleção inicial antes de ativar ib_veto_selection, e verifique que o seu ue_layout_changed aceita a chamada que of_set_layout dispara agora.
12.10 scheduler: a natureza de uma alteração e os valores anteriores #
O calendário junta-se ao diagrama de Gantt: a pergunta feita antes de um gesto diz se se trata de uma deslocação ou de um redimensionamento, e os eventos que se seguem dão os valores anteriores — um registo, uma anulação ou uma confirmação já não têm de guardar a sua própria cópia de cada compromisso. Uma seleção que o seu código retira é anunciada, e quatro chamadas recusam agora o que aceitavam em silêncio.
| O quê | 4.0 | 5.0 |
|---|---|---|
ue_appointment_changing | (string as_key, string as_start, string as_end, string as_resource) | (string as_key, string as_kind, string as_start, string as_end, string as_resource): as_kind vale CHANGE_MOVE ou CHANGE_RESIZE |
ue_appointment_moved | (string as_key, string as_start, string as_end, string as_resource) | (string as_key, string as_start, string as_end, string as_resource, string as_old_start, string as_old_end, string as_old_resource) |
ue_appointment_resized | (string as_key, string as_start, string as_end) | (string as_key, string as_start, string as_end, string as_old_start, string as_old_end) |
| O seu código retira, esvazia ou recarrega o compromisso selecionado | nenhum evento | ue_selection_changed(""); of_reset fica mudo |
of_add_appointment cujo fim precede o início | 0, o fim passava a ser início + 30 min | -5, of_get_last_error diz porquê |
of_scroll_to_time("abc") | 0, nada se deslocava | -5 |
of_set_field na coluna que desempenha ROLE_KEY | 0, dois compromissos com a mesma chave | -5: uma chave muda recarregando |
of_show_appointment de um compromisso oculto, filtrado ou num recurso oculto | 0, a vista ia para um dia onde nada se via | -5, nada se move |
is_now definido após uma navegação do utilizador | trazia a vista de volta ao seu dia | a vista fica onde o utilizador foi |
of_clear_appointments | guardava as colunas do DataStore para of_map | esquece o DataStore: of_map aceita as colunas do seguinte |
// 5.0 : ue_appointment_changing event of uo_sched : (string as_key, string as_kind, string as_start, string as_end, string as_resource) returns boolean
// A resize keeps the day : only a move is checked
if as_kind = u_pbt_scheduler.CHANGE_RESIZE then return true
// Nothing on a Saturday or a Sunday : returning false puts the appointment back
if DayNumber(Date(Left(as_start, 10))) = 1 or DayNumber(Date(Left(as_start, 10))) = 7 then return false
return true
A receita: nada se recusa a compilar — um script de ue_appointment_changing, ue_appointment_moved ou ue_appointment_resized mantém os seus argumentos, os novos acrescentam-se. Se o seu ue_selection_changed ativa botões, recebe agora "" quando o compromisso selecionado desaparece; reveja os códigos de retorno de of_add_appointment, of_scroll_to_time, of_set_field e of_show_appointment, que podem agora devolver -5. Para gravar os gestos sem código, veja ib_write_back.
12.11 shellexplorer: o erro diz o seu motivo #
O explorador da shell dá agora, em ue_error como em ue_path_not_found, um motivo que o seu código pode testar — uma constante REASON_* de u_pbt_shellexplorer, a mesma em todas as línguas do Windows. Já não dispara ue_selected para a pasta já seleccionada, e anuncia com ue_collapsed um ramo que fecha por si. Ganha também o clique direito numa pasta (ue_node_rclicked) e o endereço da raiz.
| O quê | 4.0 | 5.0 |
|---|---|---|
ue_error | (string as_message) | (string as_path, string as_reason, string as_message): o caminho ("" para o Ambiente de trabalho), uma constante REASON_*, o texto da shell |
as_reason de ue_path_not_found | uma frase em inglês (not found, outside the root, not a branch…) | uma constante REASON_* (not_found, outside_root, not_a_branch…); not_shown para um caminho que existe mas que a árvore não mostra |
| Voltar a seleccionar a pasta já seleccionada (clique, Home na primeira linha) | ue_selected | nada |
| Um ramo que a árvore fecha por si (voltou vazio, recusado pela shell) | nenhum evento | ue_collapsed |
ib_show_files, ib_show_hidden, is_file_filter, is_root escritos com o seu valor | a árvore é relida | nada é relido; is_file_filter definido sem os ficheiros espera por eles |
of_collapse de um caminho desenhado duas vezes | cada linha, um ue_collapsed cada | a linha que of_select alcança, um ue_collapsed |
of_count(""), of_keys_at("", i) | as linhas mostradas, como of_count() | o primeiro nível (a raiz), como of_count(is_root) |
// 5.0 : ue_error event of uo_tree : (string as_path, string as_reason, string as_message)
// Test the reason, never the text of the shell
if as_reason = u_pbt_shellexplorer.REASON_TIMEOUT then
st_status.text = "The network folder " + as_path + " does not answer"
else
st_status.text = as_message
end if
A receita: nada se recusa a compilar — um script de ue_error mantém as_message, os novos argumentos acrescentam-se. Um teste sobre o TEXTO de as_reason em ue_path_not_found ("not found", "outside the root") reescreve-se com uma constante REASON_*; uma aplicação que recarregava um painel em cada ue_selected fá-lo agora uma vez por mudança.
12.12 tilesbox: o clique direito traz o seu ponto, uma ordem do código anuncia-se, a disposição deixa os direitos à aplicação #
O painel de mosaicos junta-se à biblioteca: o seu clique direito dá o ponto do ecrã como o das árvores, das grelhas e do kanban; uma ordem do código que desloca um mosaico, recolhe um grupo ou muda um tamanho lança os mesmos eventos que um gesto; a disposição já não transporta a visibilidade, que continua a ser assunto da aplicação. Ganha também o deslocamento de um mosaico para outro grupo a partir do código (12.6).
| O quê | 4.0 | 5.0 |
|---|---|---|
ue_tile_context | (string as_keys) | ue_tile_rclicked (string as_keys, long al_x, long al_y): o ponto em píxeis do ecrã; a tecla Menu e Shift+F10 também o lançam, no canto inferior esquerdo do mosaico |
of_move_tile, of_insert_tile | integer ai_index | long al_position; uma sobrecarga of_move_tile(as_keys, as_to_key, al_position) envia o mosaico para outro grupo |
of_move_tile para outro lugar | nada | ue_tile_moved, ue_layout_changed |
ib_collapsed de um grupo definido pelo código | ue_group_toggled | ue_group_toggled, ue_layout_changed |
is_size definido pelo código | nada | ue_layout_changed (nunca ue_tile_resized, que diz que o utilizador o escolheu) |
is_size de um tamanho desconhecido ("huge") | o mosaico passava a medium | recusado: nada é escrito, of_get_last_error diz porquê; of_add_tile / of_insert_tile devolvem -5 |
A disposição (of_get_layout, ue_layout_changed) | transportava a visibilidade dos grupos e dos mosaicos | já não a transporta: of_set_layout nunca volta a mostrar o que o seu código ocultou; uma disposição 4.0 lê-se sem ela |
of_set_layout que muda a disposição | nenhum evento | um ue_layout_changed; -5 perante um JSON que não seja uma disposição ({}) |
of_tile / of_group de um endereço que não nomeia nada | um handle por chamada, guardado | o handle inerte, o mesmo para todas: não escreve nada e relê-se vazio |
// 4.0 : the right click of a tile
// ue_tile_context event of uo_tiles : (string as_keys)
// 5.0 : the same script, under the new name, with the screen point
// ue_tile_rclicked event of uo_tiles : (string as_keys, long al_x, long al_y)
A receita: compile; o seu script de ue_tile_context fica num evento que já não existe — mova-o para ue_tile_rclicked, que mantém as_keys. Se o seu ue_layout_changed guarda a disposição, vê agora também o que o seu código muda; um ue_tile_moved que só deve reagir ao utilizador ignora os deslocamentos que o seu código acabou de fazer. Se guardava a visibilidade na disposição, defina-a pelo código na abertura (ib_visible), segundo os direitos.
12.13 tab: o clique direito traz o seu ponto, uma disposição aplicada anuncia-se #
O separador junta-se à biblioteca: o clique direito de um separador, com o menu integrado desligado, dá o seu ponto do ecrã como o das árvores, das grelhas e do kanban, e of_set_layout que muda a disposição anuncia-a como um gesto. Um arrasto devolvido ao seu lugar já não anuncia nada. Ganha também páginas criadas a pedido (ue_page_needed, of_supply_page), o duplo clique (ue_tab_double_clicked), ib_cycle_keys, is_close_mode, ii_strip_width e, numa página, ib_modified e is_badge — ver a página do separador.
| O quê | 4.0 | 5.0 |
|---|---|---|
ue_tab_rclicked | (string as_key) | (string as_key, long al_x, long al_y): o ponto em píxeis do ecrã; a tecla Menu e Shift+F10 também o disparam, no canto inferior esquerdo do separador |
of_set_layout que muda a disposição | nenhum evento | ue_layout_changed, uma vez |
um arrasto devolvido ao seu lugar, of_move_page para o seu próprio lugar | ue_tab_reordered e ue_layout_changed | nada: a ordem não mudou |
várias deslocações sob of_set_redraw(false) | um ue_layout_changed por deslocação | um só, ao retomar |
| Shift+F10 num separador, menu integrado | o menu abria-se sob o rato | sob o separador |
| faixa vertical e título longo | a faixa tomava a largura do título | no máximo 40 % do componente, reticências; ii_strip_width fixa-a |
il_accent de uma página | apenas o anel de foco | sublinha também o separador ativo |
is_shortcut no handle de uma chave sem página | registado: a tecla era tomada para nada | nada é registado, of_get_last_error diz porquê |
of_insert_page cuja deslocação falha | código negativo, a página ficava | código negativo, a página é retirada |
// 4.0 : the right click of a tab, built-in menu off
// ue_tab_rclicked event of uo_tabs : (string as_key)
// 5.0 : the same script, with the screen point
// ue_tab_rclicked event of uo_tabs : (string as_key, long al_x, long al_y)
A receita: nada se recusa a compilar — um script de ue_tab_rclicked mantém as_key. Abra o seu menu no ponteiro da janela (parent.PointerX()), ou passe al_x, al_y a of_show de um contextmenu. Verifique que o seu ue_layout_changed aceita a chamada que of_set_layout agora lhe faz.
12.14 soundplayer: o número de um som, uma recusa devolvida de imediato #
O leitor de sons muda três coisas que o seu código pode ver. Os seus eventos transportam o número do som: ue_started, ue_ended e ue_failed recebem um último argumento, al_sound — o número que of_play_over e of_enqueue devolvem agora (devolviam 0), e que o novo of_stop_sound aceita. Uma fonte recusada de imediato é um código: of_play, of_play_over, of_crossfade e of_preload devolvem -5, a razão em of_get_last_error(), para uma fonte vazia, um endereço http://, um endereço file:// mal formado ou um formato recusado pelo nome — e já não disparam ue_failed; o som em curso continua. Na fila (of_enqueue), a recusa chega sempre por ue_failed, na sua vez. Outros -5: of_pause e of_resume sem nada a suspender ou retomar, of_beep e of_beep_sync a 0 Hz ou 0 ms, of_meter fora de 1 a 64 barras.
// Local variables
string ls_url
long ll_rc
// The address of the sound, typed by the user
ls_url = sle_url.text
// 4.0 : of_play returned 0, and an http:// address came back later through ue_failed
// 5.0 : the refusal is a code, at once ; of_get_last_error() gives the reason
ll_rc = inv_sound.of_play(/*source*/ ls_url)
if ll_rc = -5 then
MessageBox("Sound", inv_sound.of_get_last_error())
end if
O que muda sem pedir nada ao seu código: of_stop apaga-se agora sobre il_fade_ms, como a documentação prometia (ue_stopped continua a chegar de imediato); no fim de il_timeout_ms, só o som da chamada síncrona é cortado — o fundo, as sobreposições e a fila continuam; of_crossfade para uma fonte recusada mantém a faixa em curso; of_level vale 0 e of_spectrum não devolve nenhuma barra, com o medidor desligado; of_equalizer(ab_on, ai_gains[]) repõe a 0 uma banda que o array não alcança; of_clear_queue esquece também os sons que a fila já tocou; as mensagens de ue_failed seguem a língua de apresentação (as_reason continua a ser a palavra a testar). O leitor ganha também a fila navegável (of_next, of_previous, of_queue_index, ue_source_changed, ib_queue_repeat), o ciclo sem interrupções (ib_gapless_loop, REASON_TOO_LONG), o segmento (of_play_range), o silêncio (ib_muted) e o armazenamento em memória tampão (ue_buffering, of_is_buffering) — ver a página do leitor de sons.
A receita: nada se recusa a compilar — um script de ue_started, ue_ended ou ue_failed mantém os seus argumentos, al_sound acrescenta-se. Reveja os testes do código de retorno de of_play_over e of_enqueue (um = 0 passa a > 0), e o código que esperava ue_failed para um endereço http:// ou uma fonte vazia: testa agora o -5 da chamada.
12.15 toaster: o motivo de um fecho, um toast fechado pelo código anuncia-se sempre #
O toaster diz porque é que um toast se fechou: ue_toast_dismissed recebe um último argumento, as_reason — REASON_TIMEOUT, REASON_USER (a sua cruz), REASON_CODE (of_close, of_close_all) ou REASON_OWNER_CLOSED (a sua window fechou-se). E todo o toast fechado pelo código o anuncia, mesmo fechado logo após of_show, antes de ser desenhado, ou enquanto esperava o seu lugar: uma aplicação que esperava ue_toast_dismissed para libertar o seu estado já não depende de uma corrida.
| O quê | 4.0 | 5.0 |
|---|---|---|
ue_toast_dismissed | (long al_id, string as_key) | (long al_id, string as_key, string as_reason), constants REASON_* |
of_close de um toast ainda não desenhado, ou à espera de lugar | nada era desencadeado | ue_toast_dismissed, REASON_CODE |
of_close de um toast de outro toaster | fechava-o, o aviso ia para o outro | -5, nada é fechado, of_get_last_error diz porquê |
a window de ipo_owner fecha-se | os seus toasts desapareciam sem dizer nada | ue_toast_dismissed, REASON_OWNER_CLOSED |
| um toaster destruído, toasts no ecrã | ficavam, mudos | os persistentes e os que têm botões fecham-se com ele; os outros terminam sozinhos |
of_show antes de o motor de apresentação estar pronto | -6: «runtime em falta» | -4: tentar de novo; of_get_last_error diz porquê |
| canto de um toast ancorado à window | a window inteira: o toast cobria a barra de título e os seus botões | a área cliente (a da moldura em MDI) |
| um título muito longo | empurrava a cruz e os botões para fora da window | limitado, desloca-se |
// 4.0
// event ue_toast_dismissed de inv_toaster : (long al_id, string as_key)
// 5.0 : o mesmo script, com o motivo
// event ue_toast_dismissed de inv_toaster : (long al_id, string as_key, string as_reason)
A receita: nada se recusa a compilar — um script de ue_toast_dismissed mantém al_id e as_key, as_reason acrescenta-se. Reveja o código que supunha que um toast fechado de imediato por of_close não diria nada: agora anuncia-o. Os toasts continuam ligados ao toaster que os mostrou: um of_close sobre o identificador de outro toaster devolve -5. O toaster ganha também of_close_all (fechar todos os seus toasts) e of_get_last_error — ver a página do toaster.
12.16 video: uma recusa devolvida de imediato, um filme e as suas legendas numa chamada, o mesmo filme retomado #
O leitor de vídeo muda cinco coisas que o seu código pode ver. Uma recusa é devolvida de imediato, como no leitor de sons (12.14): of_play(), of_play(source) e of_play_range devolvem -5, a razão em of_get_last_error(), para uma fonte vazia, um endereço http:// ou um formato recusado pelo nome (avi, wmv, flv) — e já não levantam ue_failed; o filme em curso continua. A propriedade is_source mantém o seu ue_failed: uma propriedade não tem código de retorno. O mesmo filme não é recarregado: of_play(source) ou is_source sobre o filme já carregado retoma-o onde está (ue_resumed) em vez de o recomeçar; of_seek(0) recomeça-o. Uma procura fica no segmento de of_play_range, a do utilizador como of_seek: Início leva ao começo do segmento, um clique além do seu fim ao seu fim — antes, Início saía do excerto e um clique além parava o filme. Uma entrada da lista que não pode tocar levanta primeiro ue_source_changed, depois um só ue_failed — vinha antes, e duas vezes. of_stop passa a função: não devolvia nada (subrotina), devolve 0, ou -2 quando o componente não está criado — como of_stop do navegador web.
// Local variables
string ls_path
long ll_rc
// The film chosen by the user
ls_path = sle_film.text
// 4.0 : of_play returned 0, and an http:// address or an .avi came back later through ue_failed
// 5.0 : the refusal is a code, at once ; the reason is in of_get_last_error
ll_rc = uo_video.of_play(/*source*/ ls_path)
if ll_rc = -5 then
MessageBox("Video", uo_video.of_get_last_error())
end if
O que muda sem pedir nada ao seu código: um marcador atingido por uma procura EM PAUSA já não levanta ue_marker_reached (só ue_seeked); Espaço e o botão Reproduzir de um leitor sem filme já não fazem nada (levantavam ue_failed(REASON_NO_SOURCE)); a língua de legendas escolhida pelo utilizador segue para o filme seguinte da lista; um cartaz http:// é recusado e is_poster relê-se vazio; um is_subtitles recusado relê-se vazio; um ficheiro de legendas do posto que não se encontra levanta ue_subtitles_failed(REASON_NOT_FOUND); o menu de velocidade usa-se pelo teclado e as suas setas já não mudam o volume; em ecrã inteiro a barra mostra-se pelo teclado; a posição lembrada (ib_remember_position) já não depende da escrita do caminho, e só os 200 últimos filmes são guardados (uma posição da 4.0 é relida uma vez). O leitor ganha of_play(source, subtitles) (o filme e as SUAS legendas: definidas antes de um segundo filme, iam-se com o primeiro), ib_forward_seek, of_watched_ms, of_watched_percent, ue_watched_completely e ib_skip_failed — veja a página do leitor de vídeo.
A receita: nada se recusa a compilar. Releia o código que esperava ue_failed depois de of_play para um endereço http://, uma fonte vazia ou um .avi: testa agora o -5 da chamada. Releia também um botão « Reproduzir » que contava com of_play(source) para recomeçar: acrescente of_seek(0).
12.17 webbrowser: um gesto do utilizador é perguntado, uma página de of_show_html não tem endereço #
Com ib_veto_navigation = true, ue_navigating é agora perguntado também para um gesto do utilizador: um endereço escrito na barra, Abrir link do menu de contexto, uma nova janela aberta por um clique. Na 4.0 estes três caminhos não perguntavam. Só um endereço definido pelo seu código nunca é perguntado, e também não um redirecionamento do servidor: para uma lista de servidores que valha também para os redirecionamentos, defina a nova propriedade is_allowed_hosts.
| O quê | 4.0 | 5.0 |
|---|---|---|
ue_navigating com o veto: endereço escrito, Abrir link, nova janela | a página abria-se sem pergunta | a pergunta é feita; false mantém a página |
is_address, a barra, ue_load_completed após of_show_html | a página inteira codificada (data:text/html;charset=utf-8,…, até 2 MB) | "" |
is_title de uma página sem <title> | o seu endereço | "" |
of_go_back, of_go_forward, of_stop | sem valor de retorno | long: 0 uma vez pedido, -2 componente não criado |
ib_private alterado após uma página | is_address, is_title, a barra e as setas mantinham a página anterior | tudo se relê vazio: a vista é nova |
| Enter numa barra de endereço vazia | a página ficava em branco | nada |
| Uma página do site carrega, barra de endereço visível | Recarregar continua Recarregar | Recarregar passa a Parar, e volta quando a página termina |
A receita: nada se recusa a compilar, um long ignorado compila. Um script de ue_navigating escrito para as ligações do site vê agora também os endereços escritos pelo utilizador: se decide pelo endereço, que compare o seu anfitrião, como o exemplo da página do componente — ou confie a lista a is_allowed_hosts. O código que lia as_url de ue_load_completed, ou is_address, após of_show_html recebe uma cadeia vazia.
12.18 toolbar: o clique direito traz o seu ponto, uma ordem do código anuncia-se #
A barra de ferramentas junta-se à biblioteca: o clique direito de uma ferramenta dá o seu ponto de ecrã, como o das árvores, das grelhas e do separador, e deslocar uma barra por ii_band / ii_index despoleta ue_bar_reordered como o gesto. Duas adições recusam o que aceitavam em silêncio, e um atalho definido onde nada vive deixa de ser registado. Ganha também is_text numa barra, um nome para cada ferramenta e cada campo lido por um leitor de ecrã, e um teclado que atravessa os campos — ver a página da barra de ferramentas.
| O quê | 4.0 | 5.0 |
|---|---|---|
ue_item_rclicked | (string as_keys) | (string as_keys, long al_x, long al_y): o ponto em píxeis de ecrã; a tecla Menu e Shift+F10 também o despoletam, no canto inferior esquerdo da ferramenta, e também o clique direito de um campo |
ii_band / ii_index que deslocam uma barra | ue_layout_changed | ue_bar_reordered, ue_layout_changed |
of_add_datepicker com uma data que não é aaaa-mm-dd ("31/12/2026") | 0, a data mostrada tal como estava | -5, nada é acrescentado |
of_add_menu_separator numa entrada sem subentradas | 0: a entrada ficava cinzenta e já não se escolhia | -5 |
is_shortcut ou of_register_shortcut num endereço onde nada vive, uma entrada com cascata ou a opção de uma lista | registado: a tecla era apanhada em toda a janela | nada registado; of_register_shortcut devolve -5, of_get_last_error diz porquê |
| Ctrl+A, Ctrl+C, Ctrl+V, Ctrl+X, Ctrl+Z, Ctrl+Y num campo da barra | a ferramenta que tinha o atalho era despoletada | o campo edita o seu texto |
is_text de um seletor de data | guardado e relido, nunca mostrado | ignorado, relê "" |
// 4.0 : the right click of a tool
// ue_item_rclicked event of uo_toolbar : (string as_keys)
// 5.0 : the same script, with the screen point
// ue_item_rclicked event of uo_toolbar : (string as_keys, long al_x, long al_y)
A receita: nada se recusa a compilar — um script de ue_item_rclicked mantém as_keys. Abra o seu menu no ponto al_x, al_y (passe-o a of_show de um contextmenu). Verifique que um script de ue_bar_reordered aceita também as deslocações feitas pelo seu código, teste o código de retorno de of_add_datepicker se a data vier de um campo regional, e defina is_shortcut depois de acrescentar a ferramenta ou a entrada.
12.19 O clique direito de um item traz o seu ponto: buttonbar, breadcrumb, chartcartesian, statusbar #
Uma só regra para todo o clique direito sobre um item da biblioteca: o evento recebe a chave (ou o endereço) do item, depois al_x, al_y, o ponto onde abrir um menu, em píxeis de ecrã — o ponteiro, ou, pelo teclado (tecla Menu, Shift+F10), o canto inferior esquerdo do item (inferior direito numa leitura da direita para a esquerda; o meio de uma forma que não é um retângulo: um ponto de um gráfico). Um contextmenu da biblioteca abre-se aí tal como estão: uo_menu.of_show(al_x, al_y). Três eventos que não o traziam recebem-no; a barra de estado multiplicava o seu pela escala do ecrã, e um menu aberto nesse ponto caía longe do ponteiro num ecrã a 125 % ou 150 %.
| O quê | 4.0 | 5.0 |
|---|---|---|
buttonbar · ue_button_rclicked | (string as_key) | (string as_key, long al_x, long al_y) |
breadcrumb · ue_item_rclicked | (string as_keys) | (string as_keys, long al_x, long al_y) |
chartcartesian · ue_point_rclicked | (string as_key, long al_index, double ad_value) | (string as_key, long al_index, double ad_value, long al_x, long al_y) |
statusbar · al_x, al_y de ue_panel_rclicked | multiplicados pela escala do ecrã | o ponto tal como a página o lê, como todos os cliques direitos |
// 5.0 : the menu of a button, opened where the user right-clicked it
// ue_button_rclicked event of uo_buttons : (string as_key, long al_x, long al_y)
is_menu_button = as_key
uo_menu.of_show(/*x*/ al_x, /*y*/ al_y)
A receita: nada se recusa a compilar — um script destes eventos mantém os seus argumentos. Abra o seu menu no ponto al_x, al_y (passe-o a of_show de um contextmenu); um menu PowerBuilder mantém PopMenu(PointerX(), PointerY()) da sua janela. Um script que corrigia ele próprio a escala das coordenadas de ue_panel_rclicked já não o deve fazer.
12.20 A base: o erro de um componente é o seu, cada verbo devolve um código #
Cinco alterações tocam toda a biblioteca, ou toda uma família de componentes. Só uma se recusa a compilar: is_last_error de um componente não visual, agora of_get_last_error().
| O quê | 4.0 | 5.0 |
|---|---|---|
of_get_last_error() de um componente visual | a última mensagem da DLL, uma só para todo o processo — muitas vezes a de outro componente | o que aconteceu a este componente: um nome recusado, ou uma chamada deste componente à DLL, cujo motivo é lido no momento da falha; senão, vazio |
O motivo da falha de um componente não visual (crypto, restclient, soundplayer, speechout, xml, u_pbt_regex, u_pbt_zip) | inv.is_last_error | inv.of_get_last_error() |
of_stop, of_close, of_reset dos componentes não visuais (commandpalette, crypto, messagebox, restclient, soundplayer, speechout, toaster, xml) | sem valor devolvido | um long, 0 uma vez feito — como os componentes visuais |
of_set_property("tooltip", …) e super_tooltip_* num componente sem dica (webbrowser, pdfviewer, radialmenu, progressbar) | definia uma dica que a documentação diz inexistente | -5, e of_get_last_error() diz porquê |
O atalho de um menu PowerBuilder retomado (of_load_menu de menubar e commandpalette) | Ctrl++, PageUp, Insert (menubar); nada para lá de F12 (paleta) | uma só escrita, a do contextmenu: Ctrl+Plus, PgUp, Ins, de F13 a F24, de Num 0 a Num 9, Num + |
// Local variables
string ls_why
// 4.0 : ls_why = inv_crypto.is_last_error
// 5.0 : the reason of a failure, by the same method as every component
ls_why = inv_crypto.of_get_last_error()
A receita: o compilador mostra cada .is_last_error a substituir por .of_get_last_error(). Uma chamada a of_stop, of_close ou of_reset escrita como instrução continua a compilar. Um script que lia of_get_last_error() de um componente para saber da falha de outra chamada (um export da DLL chamado diretamente, outro componente) lê agora o motivo desse componente, ou nada: pergunte-o a quem falhou.
Acrescentado, nada a refazer: is_accessible_name e is_accessible_description em todos os componentes visuais — o nome e a descrição que um leitor de ecrã diz (3.4); of_from_datastore de um DataWindow ou de um DataWindowChild em crosstab e datagrid, como nos outros componentes ligados a dados; a forma completa de of_insert_command (commandpalette), que recebe a explicação, o atalho e as palavras-chave como of_add_command, com uma posição em long.