PBToolboxAI v5 ← Site

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.05.0
Mostrar a leiturauo.ib_label = trueuo.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 valoruo.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 nomeof_set_property("label", …), ("label_format", …), ("color", …)("show_value", …), ("format", …), ("unit", …), ("value_color", …)
// 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.05.0
O editor de uma célula mostrada $1,234.50abria com o número simples 1234.5; qualquer carácter era aceiteabre 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ériconão agrupado nalguns idiomas (1234 em espanhol)agrupado em todos os idiomas (1.234 em espanhol)
Um negativo arredondado a zero-00
Abrir e fechar o editor sem escreverpodia alterar um valor que o formato arredondanão muda nada
Uma célula de classificação (rating) lida por um leitor de ecrãcinco sinais de estrela4 / 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.05.0
O formato do gráficouo.of_set_value_format(0, "$", "", true)uo.is_format = "$#,##0"
O formato de um eixouo.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)
// 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.05.0
Menus nativos de um componente com um acento próprio (il_theme_accent)o acento só se via na caixa de uma entrada marcadaa 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 focusclicavam esse botãovã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 MDIEnter (Esc) ia para o botão predefinido de outra folhaa tecla fica na sua folha: recebe-a o campo, ou o CommandButton PB predefinido
breadcrumb: ii_max_visible definidoum número exacto de segmentos em OVERFLOW_COLLAPSE (a largura já não dobrava nada), ignorado em OVERFLOW_SCROLL e OVERFLOW_SHRINKum 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 vaziouma linha vazia no menua chave do ramo, como of_add_children
breadcrumb: Ctrl+S, F5 e os outros atalhos da janela durante a escrita do caminhonão disparavamdisparam, como a partir de um SingleLineEdit; Enter e Esc ficam no campo
breadcrumb: ue_children_needed que nunca devolve o controlonenhum chevron abria até ao próximo of_resetum 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 textouma 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 calora 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_seriesas séries seguintes mudavam de cor; a tooltip da série retirada vestia a série seguinte com a mesma chavecada 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_animatedo gráfico inteiro voltava a cair no eixo e subia a cada acrescento, enquanto a janela não estava cheiasó 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 valoresas duas pilhas sobrepunham-selado a lado na categoria
chartcartesian: uma etiqueta de marcação numa categoria ou etiqueta de valorescrita tal como está no eixo, interpretada no paineltexto em todo o lado: a etiqueta é retirada (o eixo, o painel, #x#, #label#)
chartcartesian: Esc sem nada aberto, Enter num buracoretidos pelo gráficovão para a janela: o seu botão Cancelar, o seu botão predefinido
codeeditor: Ctrl+Tab ou Alt+Tab no editorindentavam o código: o teclado já não saía do editorvã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álidadevolvia 0devolve -5, como of_replace
codeeditor: um novo is_text durante uma pesquisaa barra ficava aberta e lançava ue_find_resulta 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_textmostrado #region; a cópia devolvia o que se via, sem as linhas das regiões fechadasmostrado 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 acimaficavam no mesmo número de linhaacompanham a sua linha; uma linha eliminada leva os seus marcadores
codeeditor: o cursor depois de «Substituir tudo» (of_replace_all)na última substituiçãofica onde estava, deslocado pelo que foi inserido antes
codeeditor: Ctrl+Z, Ctrl+Yo histórico do navegador, perdido quando o texto era escrito com o foco noutro sítioo 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 0aceite, 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 bitsprometido 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 URIescrito em base32 maiúsculo, sem espaços nem =; outro carácter: "" e of_get_last_error()
crypto: um argumento NULLis_last_error podia voltar NULLconta 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 melhorsó desempata resultados que correspondem mais ou menos igualmente bem
commandpalette: um comando sem grupo (as_group = "") declarado entre dois gruposlistado sob o cabeçalho do grupo declarado antes deleno início da lista, sem cabeçalho
commandpalette: Home / End no campo com texto, Shift+Homemoviam a seleção na lista; Shift+Home não selecionava nadamovem o cursor no campo; Ctrl+Home / Ctrl+End chegam à lista; Shift seleciona no campo
commandpalette: um clique direito ou do meio numa linhalançava o comandonão faz nada
commandpalette: of_command numa chave que nenhum comando temib_enabled / ib_visible liam-se true, uma escrita perdia-se em silêncioleem-se false; uma escrita perde-se e of_get_last_error di-lo
commandpalette: um segundo objeto paleta que tinha retomado um atalho é destruídoa tecla não respondia a ninguém até o primeiro a voltar a registaro 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 longolimpo, cortado ao limite e devolvido limpo a is_recent na abertura
dockcontainer: construir o dock, repor uma disposiçãoue_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 meiouma 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 separadornada 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 pilhavoltava atrás do separador ativopassa 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 pilhadevolve -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 deleib_pinned mudava sem eventoue_panel_pinned segue
dockcontainer: um clique sem deslocação num divisorlançava ue_layout_changednão lança nada: nada mudou
dockcontainer: of_keys_at com chaves numéricasprimeiro 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, ocultosrecuperam a visibilidade que tinham antes de of_add_panel
dockcontainer: of_add_panel de um controlo que CONTÉM o dockas janelas fechavam-se em ciclodevolve -5, o controlo fica onde estava
crosstab: AGG_COUNTcontava as linhasconta 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 vazia0uma 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 zonaclassificados sobre toda a tabelaclassificados 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 Colunasuma coluna de total que duplicava a única coluna (`Nord650650`)deixa de haver coluna de total; ib_col_grand_total mantém o seu valor
crosstab: várias medidas e campos em Colunasuma coluna Total por medida, sem nome de medida, e que não se ordenavaum cabeçalho « Total » e depois um cabeçalho por medida, ordenável
crosstab: ue_layout_changeddesencadeado pelos gestos do utilizador, e só por is_thousands e of_remove_fielddesencadeado 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ínguasescrita como a língua de apresentação a escreve: 57.9% em inglês, 57,9 % em francês
crosstab: o filtro de etiquetaproposto 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 datas0, 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 1trazidos 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 linhasuma 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 colunaos espaços de preenchimento ficavam no membro; o Format era ignoradoos 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 removeficava 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 arrastarlançavam ue_layout_changednã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çãoum 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 criadoaceites e relidos tal como estavam, sem efeito; 0of_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 modificadaa marca «modificada» ficavadesaparece: 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 DataStoreo <select> e o campo de data do motor; uma hora era textoa 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ódigosprocurava o texto «> 3»: nenhuma linhacompara o dado (o número, o código)
datagrid: uma árvore sob uma pesquisa; uma linha cujo pai não está na grelhao filho encontrado ficava escondido; a linha nunca apareciaos 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 CHARa grelha ficava em esqueletos; a linha era recusada (-5); mantinha o seu preenchimento de espaçosa origem é abandonada; a chave segue o maior RowID; aparado
datagrid: of_export_xlsxas datas eram escritas como texto; sem tectodatas 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 cancelamentofechavam a caixa e devolviam 0 — também of_info, que prometia 1como 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_passwordtudo era apagado em silêncio: a palavra-passe de of_prompt aparecia em claroo 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 caixaof_get_last_error, of_checked, of_action e of_input_value ainda falavam da caixa anteriorsão repostos
messagebox: um campo obrigatório preenchido com espaçosaceitevazio: 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ónicaa zona não fazia nada; a ligação abria o navegador E escolhia; Alt+letra respondia com o primeiro botãoa 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+Cperdia o & de &&, copiava as etiquetas de um botão, ignorava a entradaos 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 caixadesapareceram: il_accent colore a caixa
json e jsontree: um nível de caminho que contém ~0 ou ~1lido 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 ausenteum 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, 10: 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á tema chave era escrita uma segunda vez: n_pbt_json lia a primeira, um navegador ou um servidor a últimao 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íveisoutro documento, cortado em 512 níveisum texto vazio
jsontree: clique numa chave que contém /, numa chave vazia, ou sob uma chave duplicadaum caminho que lia OUTRO valor em n_pbt_jsonx~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 ratoo nó inteiroo pedaço realçado
jsontree: um texto JSON que começa com um BOMrecusado (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êsInvalid JSON : …Invalid JSON: … (cada língua mantém a sua pontuação); 01, 1., 1e dizem Bad number
jsontree: of_expand_path durante uma pesquisadobrado de novo no passo seguinte da pesquisa, sem ue_node_toggledfica aberto, com os blocos abertos acima dele
jsontree: Espaço num valor selecionadodeslocava a árvore uma páginanã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 -5uma 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 cortadosHello , 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 ratoo XML do nó inteiroo pedaço realçado
xmltree: a mensagem de ue_error em inglêsInvalid XML : …Invalid XML: … (cada língua mantém a sua pontuação)
xmltree: of_expand_path durante uma pesquisadobrado de novo no passo seguinte da pesquisa, sem ue_node_toggledfica aberto, com os elementos abertos acima dele
xmltree: Espaço numa folha selecionadadeslocava a árvore uma páginanã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 erradaue_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 dicaso código, o documento, o friso (o seu tamanho do tema) e muitos textos secundários mantinham o seu tamanhoseguem 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 redecarregadarecusada, 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_refresha vista voltava ao topoa 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_sourceatuavam sobre o documento anterioro 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 esquerdamudava de ladomantém o seu lado; só o alinhamento predefinido segue o sentido
markdownview: ue_load_failed para um texto definido por is_markdownnunca levantadolevantado (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 menulanç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 assimnada 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 EscEsc ia também para a janela: o seu botão CancelarEsc 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 nadaa primeira entrada está realçada, Enter escolhe-a
menubar: Alt quando a barra já tem o focoo modo de menu mudava ao premir: Alt+Shift (esquema do teclado) ligava-oao soltar um Alt sozinho, como o Windows
menubar: um clique num título esbatido ou na parte vazia da barraa barra ficava com o teclado, o campo em edição perdia-oo teclado fica no controlo onde se escrevia
menubar: is_shortcut num endereço que não designa nenhuma entradaa tecla ficava tomada em toda a janela, mesmo depois de of_clearnada é armado: defina-o depois de of_add_item
pdfviewer: ib_allow_save / ib_allow_print de um visualizadorvaliam para todos os visualizadores da aplicação; um of_reset noutro lado devolvia Guardar a um documento confidencialcada visualizador mantém a sua própria definição
pdfviewer: ib_allow_save / ib_allow_print definidos antes de is_sourcetrês carregamentos, três ue_load_completed; um documento em falha era repetido a cada alteraçãoum único carregamento; um documento em falha não é repetido
pdfviewer: ii_page definido enquanto um documento é apresentado, depois outro is_sourceo documento seguinte abria nessa páginaa 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_completednão faz nada
pdfviewer: ii_zoom fora de 25 a 500passado tal como está ao leitortrazido para 25 a 500, relido tal como aplicado
pdfviewer: um endereço https://nome:segredo@…; uma origem feita de espaçospassado ao leitor, que o recusava com um motivo vago, o segredo voltava nos eventos; relida tal como está, of_refresh devolvia 0recusado 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 molduraa roda, + e id_zoom subiam até ao tamanho realparam no limite; só a tecla 1 vai além
picture: uma nova is_source, ou ib_zoomable = false, numa imagem ampliadao 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_UNSUPPORTEDapresentado; is_source relê-se tal como foi escrito
picture: as teclas do zoom com Ctrl, Alt ou Windows premidoCtrl++ ampliava, Alt+1 mostrava o tamanho realdeixadas à sua aplicação (atalhos, mnemónicas)
picture: uma imagem recolorida (mono:, tint:) de outro sítio cujo servidor recusa pedidos de outra origemue_loaded e uma moldura vaziaue_error com REASON_FAILED, a mensagem diz porquê
radialmenu: is_tooltip, is_super_tooltip_title, is_super_tooltip_text, is_super_tooltip_imageexistiam, nunca mostravam nada: o lançador não tem superfícieretiradas: o compilador mostra a linha, apague-a
radialmenu: of_close, um segundo of_show, of_clear ou of_reset enquanto uma roda está abertaue_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")-5resolvida 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á abertaue_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_hovero 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ãoas credenciais Windows e o certificado seguiam o redirecionamentosó 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 -5recusado 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 GETmantinha o Content-Type do corpo de partidaparte sem Content-Type
restclient: ue_progresslanç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 valortodos, unidos por , — Set-Cookie por uma quebra de linha
restclient: o User-Agent enviadoPBToolboxAI/4.0, escrito no códigoa 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 criadopartia 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_basicpartiam as duas autenticaçõesuma 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 focoo campo mantinha o texto antigo; ao sair era levantado ue_combo_changed / ue_value_changed com o valor antigo, que substituía o seuo 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 faixacada pequeno movimento de um touchpad mudava de separador; uma faixa recolhida também mudava de separador sem mostrar nadaum 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 incoerentesaceites: setas mortas ou invertidas, um valor fora do intervalo mostradoof_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 tecladorecusado: 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 teclasvolta às letras dos separadores, como no Office; um segundo Esc fecha
speechout: of_speak_from(0) ou um número negativolia 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 limiterelêem-se tal como aplicados (400)
speechout: um pedaço [rate]…[/rate] numa fraseuma 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 mudavaa regra só reescreve o texto entre as etiquetas
speechout: um posto sem nenhuma vozue_error, depois uma leitura «em curso»: ue_started, cada ue_sentence, ue_stopped; of_speak_sync devolvia 0ue_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 leituranenhum 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 leituranenhum 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 frasefica 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 dicaa dica nunca apareciaaparece, 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 vistasas entradas da sua lista, sem os separadores
statusbar: uma posição numa lista pendente (of_insert_menu_item, of_move_menu_item)contava os separadoresconta só as entradas, como as posições dos painéis
statusbar: uma chave de painel ou de entrada que começa por __aceiterecusada, -5: está reservada ao componente
statusbar: is_tooltip e as cinco cores numa entrada de lista (of_menu_item)guardados e relidos, sem efeitoignorados, 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 janelaredimensionava a moldura, a partir do seu cantoredimensiona a folha; sem pega quando a barra não ocupa o canto inferior
statusbar: a tecla Menu ou Shift+F10 num painel com o foconadaue_panel_rclicked, no canto inferior esquerdo do painel
stepbar: Enter ou Espaço numa etapa, numa janela que tem um botão predefinidoue_step_clicked e o botão predefinido («Seguinte») era acionadosó ue_step_clicked: a tecla fica na barra
stepbar: of_clear_steps enquanto a barra está numa etapanão lançava nadaue_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 mudanada é 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_changeda barra fica em «tudo concluído», nada é lançado
stepbar: NAV_VISITED, uma etapa inserida ou deslocada para a frente da etapa atualclicávelmostrada concluída, mas não clicável: nunca foi alcançada
stepbar: uma etapa com aviso (STATE_WARNING)um marcador âmbarum 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 coloridoas suas cores são mantidas e atenuadas; na superfície do tema, o cinzento do tema, como antes
statictext: PBT_SetDefaultFont com um tamanhoo tamanho ficava em 11 pto tamanho dado aplica-se (11 pt sem ele, sem alteração)
statictext: ii_font_size fora de 6 a 200aplicado tal como estavatrazido para o limite mais próximo, como a etiqueta [size], e relido tal como aplicado
statictext: duplo clique numa palavra com ib_selectableum só ue_clicked antes de ue_double_clickeddois 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 cortadonadaue_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 esvaziadomantinha a largura do texto anteriorencolhe 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 XPathdevolviam 0, como uma pesquisa sem resultadodevolvem -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 vaziovazio sem motivo, 0 («feito»), 0vazio 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 CRescrito tal como estava: o documento já não se recarregava, o CR voltava como LFo carácter proibido é retirado, como faz o builder; o CR escreve-se &#13; e relê-se
xml: builder — um segundo elemento no topo, um texto sem elemento aberto, um atributo depois de um filhoescrito (duas raízes) ou ignorado sem uma palavradeixado 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; vaziovazio 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.

ObjetoAcrescentado
progressbaris_unit: um texto escrito depois da leitura ("of 500 rows", "MB")
datagridis_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
datagrido 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
ribbonis_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
breadcrumbescrever 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)
chartcartesianof_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
codeeditorof_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)
cryptoos 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
buttonbaris_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
commandpaletteof_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()
dockcontainerib_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)
crosstabof_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
messageboxof_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)
jsontreeof_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 &)
xmltreeof_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 &)
jsonof_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
listbarue_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)
markdownviewis_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
menubarof_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
pdfviewerof_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)
pictureof_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
radialmenuof_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)
restclientof_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
statusbarib_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
tilesboxof_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
statictextib_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
xmlof_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)
xmlsobrecargas 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.05.0
Adicionar um botãouo.of_add_button("save", "img\save.png", "Save")uo.of_add_button("save", "&Save", "img\save.png")
Um botão só com textouo.of_add_button("ok", "", "OK")uo.of_add_button("ok", "OK")
Inserir um botãouo.of_insert_button("mid", 2, "", "Mid")uo.of_insert_button("mid", "Mid", "", 2)
A letra Alt de um botãois_shortcut ← "S" (Alt+S)o rótulo "&Save", ou uo.of_button("save").is_mnemonic = "S"
Um atalho num botãouo.of_register_shortcut("Ctrl+S", "save")o mesmo, ou uo.of_button("save").is_shortcut = "Ctrl+S" — mostrado no tooltip
Um « & » num rótulomostrado tal como estámarca a letra Alt; && para um « & » escrito
O emblemauo.of_button("inbox").il_badge = 3uo.of_button("inbox").is_badge = "3" (um texto: "New", "!"); il_badge continua aceite
O botão com o foco, sem is_defaultpintado com o acento cheioapenas o seu anel de foco
// 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.05.0
O formato de todos os valores de um campouo.of_set_value_format("amount", 2, "locale", "$", true)uo.of_field("amount").is_format = "$#,##0.00"
Um símbolo depois do númerouo.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 vermelhosó o menu do chipuo.of_value(1).ib_negative_red = true
Voltar ao formato predefinidouo.of_clear_value_format("amount")uo.of_field("amount").is_format = "" (o Format da coluna do DataWindow)
// 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.05.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çãonenhum eventoum ue_layout_changed (nunca ue_section_toggled)
of_move_item / of_move_section para o lugar já ocupadoue_layout_changednada: nada se moveu
of_select_item de uma entrada desativada0, 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 calhatrueo que a aplicação definiu
of_item de um endereço de um só nível ("nav")alcançava a secçãoum handle que não nomeia nada; uma secção alcança-se com of_section
A mesma letra escrita duas vezesum prefixo dd, muitas vezes sem correspondênciaa linha seguinte que começa por ela; um Espaço a meio de um prefixo pertence-lhe
Uma entrada desativada sob o ponteirosem dicaa 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.05.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 selecionadonenhum eventoue_selection_changed(""); of_reset fica mudo
of_add_appointment cujo fim precede o início0, 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_KEY0, dois compromissos com a mesma chave-5: uma chave muda recarregando
of_show_appointment de um compromisso oculto, filtrado ou num recurso oculto0, a vista ia para um dia onde nada se via-5, nada se move
is_now definido após uma navegação do utilizadortrazia a vista de volta ao seu diaa vista fica onde o utilizador foi
of_clear_appointmentsguardava as colunas do DataStore para of_mapesquece 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.05.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_founduma 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_selectednada
Um ramo que a árvore fecha por si (voltou vazio, recusado pela shell)nenhum eventoue_collapsed
ib_show_files, ib_show_hidden, is_file_filter, is_root escritos com o seu valora árvore é relidanada é relido; is_file_filter definido sem os ficheiros espera por eles
of_collapse de um caminho desenhado duas vezescada linha, um ue_collapsed cadaa 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.05.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_tileinteger ai_indexlong 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 lugarnadaue_tile_moved, ue_layout_changed
ib_collapsed de um grupo definido pelo códigoue_group_toggledue_group_toggled, ue_layout_changed
is_size definido pelo códigonadaue_layout_changed (nunca ue_tile_resized, que diz que o utilizador o escolheu)
is_size de um tamanho desconhecido ("huge")o mosaico passava a mediumrecusado: 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 mosaicosjá 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çãonenhum eventoum 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 nadaum handle por chamada, guardadoo 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.05.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çãonenhum eventoue_layout_changed, uma vez
um arrasto devolvido ao seu lugar, of_move_page para o seu próprio lugarue_tab_reordered e ue_layout_changednada: a ordem não mudou
várias deslocações sob of_set_redraw(false)um ue_layout_changed por deslocaçãoum só, ao retomar
Shift+F10 num separador, menu integradoo menu abria-se sob o ratosob o separador
faixa vertical e título longoa faixa tomava a largura do títulono máximo 40 % do componente, reticências; ii_strip_width fixa-a
il_accent de uma páginaapenas o anel de focosublinha também o separador ativo
is_shortcut no handle de uma chave sem páginaregistado: a tecla era tomada para nadanada é registado, of_get_last_error diz porquê
of_insert_page cuja deslocação falhacódigo negativo, a página ficavacó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.05.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 lugarnada era desencadeadoue_toast_dismissed, REASON_CODE
of_close de um toast de outro toasterfechava-o, o aviso ia para o outro-5, nada é fechado, of_get_last_error diz porquê
a window de ipo_owner fecha-seos seus toasts desapareciam sem dizer nadaue_toast_dismissed, REASON_OWNER_CLOSED
um toaster destruído, toasts no ecrãficavam, mudosos 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 à windowa window inteira: o toast cobria a barra de título e os seus botõesa área cliente (a da moldura em MDI)
um título muito longoempurrava a cruz e os botões para fora da windowlimitado, 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.05.0
ue_navigating com o veto: endereço escrito, Abrir link, nova janelaa página abria-se sem perguntaa pergunta é feita; false mantém a página
is_address, a barra, ue_load_completed após of_show_htmla 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_stopsem valor de retornolong: 0 uma vez pedido, -2 componente não criado
ib_private alterado após uma páginais_address, is_title, a barra e as setas mantinham a página anteriortudo se relê vazio: a vista é nova
Enter numa barra de endereço vaziaa página ficava em branconada
Uma página do site carrega, barra de endereço visívelRecarregar continua RecarregarRecarregar 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.05.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 barraue_layout_changedue_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 subentradas0: 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 listaregistado: a tecla era apanhada em toda a janelanada 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 barraa ferramenta que tinha o atalho era despoletadao campo edita o seu texto
is_text de um seletor de dataguardado e relido, nunca mostradoignorado, 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.05.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_rclickedmultiplicados 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.05.0
of_get_last_error() de um componente visuala última mensagem da DLL, uma só para todo o processo — muitas vezes a de outro componenteo 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_errorinv.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 devolvidoum 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.


← Migrar da 3.0 para a 4.0 · Índice · Notas de versão →