PBToolboxAI v5 ← Site

12. Migrare dalla 4.0 alla 5.0 #

← Migrare dalla 3.0 alla 4.0 · Sommario · Note di versione →


La 5.0 non cambia alcuna firma dei trentasette componenti della 4.0, né alcun evento — tranne la barra di pulsanti (buttonbar, 12.7) e l'evento ue_link_clicked del visualizzatore Markdown (markdownview), che riceve un secondo argomento, as_kind (12.5). Tre componenti cambiano parole. La barra di avanzamento (progressbar) prende quelle degli indicatori — ib_label, il_color e is_label_format scompaiono a favore di ib_show_value, il_value_color, is_format e is_unit (12.1). Il grafico cartesiano (chartcartesian) scrive i suoi numeri tramite is_format, come gli indicatori e il grafico a torta: of_set_value_format e of_clear_value_format scompaiono, e ii_point_count di una serie diventa il_point_count (12.4). La tabella pivot (crosstab) segue la stessa strada: of_set_value_format e of_clear_value_format scompaiono a favore di is_format — sul campo, o su un solo valore tramite of_value — e di ib_negative_red (12.8). Il compilatore Le mostra ogni riga da riprendere. La barra laterale (listbar) cambia un evento: ue_item_rclicked riceve in più il punto dello schermo del clic, al_x e al_y (12.9). Il pannello di riquadri (tilesbox) rinomina un evento: ue_tile_context(as_keys) diventa ue_tile_rclicked(as_keys, al_x, al_y), e la posizione di of_move_tile e di of_insert_tile diventa long al_position (12.12). Il menu radiale (radialmenu) perde quattro proprietà di descrizione comando che non ha mai mostrato — is_tooltip, is_super_tooltip_title, is_super_tooltip_text e is_super_tooltip_image (12.5). Il calendario (scheduler) cambia tre eventi di gesto: ue_appointment_changing riceve as_kind, ue_appointment_moved e ue_appointment_resized ricevono i valori precedenti (12.10). L'esploratore della shell (shellexplorer) cambia un evento: ue_error riceve in più il percorso e un motivo costante, as_path e as_reason (12.11). Il blocco di testo formattato (statictext) cambia un evento: ue_hyperlink riceve in più ab_opened, se il collegamento si è davvero aperto (12.5). La scheda (tab) cambia un evento: ue_tab_rclicked riceve in più il punto dello schermo del clic, al_x e al_y (12.13). Il lettore di suoni (soundplayer) cambia tre eventi: ue_started, ue_ended e ue_failed ricevono in più il numero del suono, al_sound (12.14). Il toaster (toaster) cambia un evento: ue_toast_dismissed riceve in più il motivo della chiusura, as_reason (12.15). Il browser web (webbrowser): of_go_back, of_go_forward e of_stop restituiscono un long, e con ib_veto_navigation un indirizzo digitato dall'utente viene chiesto a ue_navigating (12.17). La barra degli strumenti (toolbar) cambia un evento: ue_item_rclicked riceve in più il punto dello schermo del clic, al_x e al_y (12.18). Il lettore video (video) cambia una firma: of_stop diventa una funzione che rende un long (12.16) — una chiamata scritta come istruzione compila ancora. Tre componenti cambiano un evento di clic destro di un elemento, che riceve in più il suo punto dello schermo al_x, al_y: la barra di pulsanti (ue_button_rclicked), il percorso (breadcrumb, ue_item_rclicked) e il grafico cartesiano (ue_point_rclicked); la barra di stato (statusbar) dà quel punto come gli altri, senza più moltiplicarlo per la scala dello schermo (12.19). La base (12.20): il motivo del fallimento di un componente non visuale si legge con of_get_last_error() — la proprietà is_last_error scompare da crypto, restclient, soundplayer, speechout, xml, u_pbt_regex e u_pbt_zip —, e of_stop, of_close e of_reset dei componenti non visuali restituiscono un long.

Il resto non chiede nulla al Suo codice: la griglia dati (datagrid) e la barra multifunzione (ribbon) ottengono maschere di input numeriche, e l'editor di una colonna numerica della griglia si apre ora sul testo della maschera (12.2, 12.3). I nuovi componenti della 5.0 sono presentati nelle note di versione.

12.1 progressbar: le parole degli indicatori #

La 5.0 porta due indicatori, lineare (gauge) e a quadrante (angulargauge). Anche una barra di avanzamento mostra un valore su una scala: la libreria parla ormai una sola lingua per questo, e la barra, che diceva la stessa cosa con altre parole, prende le parole degli indicatori. Nessun vecchio nome sopravvive: né una proprietà, né un nome accettato da of_set_property.

Cosa4.05.0
Mostrare la letturauo.ib_label = trueuo.ib_show_value = true
Colore del valore (-1 = il tema, invariato)uo.il_color = RGB(…)uo.il_value_color = RGB(…)
Una lettura che scrive il valoreuo.is_label_format = "{value} of {max} rows"uo.is_format = "#,##0" + uo.is_unit = "of 500 rows"
La percentuale (predefinito, invariato)uo.is_label_format = ""uo.is_format = ""
Pilotare per 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"

La ricetta: compili; ogni ib_label, il_color e is_label_format di una barra di avanzamento viene segnalato. Sostituisca i primi due con ib_show_value e il_value_color. Per il terzo: un testo vuoto resta vuoto in is_format; un'etichetta che scriveva il valore diventa un formato ("#,##0") e un'unità; un'etichetta che scriveva la percentuale lascia is_format vuoto e mette il suo testo in is_unit. Un of_set_property che nominava label, label_format o color ora restituisce -5 e non fa nulla (of_get_last_error nomina la proprietà): cerchi questi nomi nel Suo codice.

12.2 datagrid: un editor numerico che digita attraverso una maschera #

Nessuna firma cambia, e ue_cell_edited riceve sempre il numero nudo (1234.5). Ciò che cambia si vede sullo schermo: la digitazione in una colonna numerica segue ora una maschera di input, nella sintassi della DataWindow — quella che indica con la nuova proprietà is_mask della colonna, altrimenti il suo formato di visualizzazione privato dei letterali.

Cosa4.05.0
L'editor di una cella mostrata $1,234.50si apriva sul numero nudo 1234.5; ogni carattere era accettatosi apre su 1,234.50; il raggruppamento appare man mano che arrivano le cifre, i decimali sono limitati alla maschera, le lettere rifiutate; un numero incollato è letto nella lingua di visualizzazione
Un numero di quattro cifre con un formato numericonon raggruppato in alcune lingue (1234 in spagnolo)raggruppato in tutte le lingue (1.234 in spagnolo)
Un negativo arrotondato a zero-00
Aprire e chiudere l'editor senza digitarepoteva cambiare un valore che il formato arrotondanon cambia nulla
Una cella di valutazione (rating) letta da un lettore di schermocinque segni di stella4 / 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"

La ricetta: niente da cambiare. Un codice che leggeva il testo digitato non lo vede: ue_cell_edited restituisce sempre il numero. Una colonna la cui digitazione deve restare libera (un codice, un numero di pezzo) è una colonna di testo, non numerica.

12.3 ribbon: le maschere di un contatore #

Nulla cambia per un contatore senza maschera. Due nuove proprietà del suo handle, nella sintassi di PowerBuilder: is_mask, la maschera di input ("#,##0.00", "0%"), e is_format, il formato di visualizzazione con i suoi letterali (0 "pt" mostra 11 pt, digitato 11). id_value e ue_value_changed mantengono il numero nudo, il passaggio dall'uno all'altro non solleva alcun evento, e le maschere seguono il contatore nel pannello di un gruppo compresso.

// 5.0 : a font size shown "11 pt", typed "11"
uo_ribbon.of_item(/*keys*/ "home/font/size").is_format = "0 ~"pt~""

La ricetta: niente da cambiare.

12.4 chartcartesian: il formato dei numeri tramite is_format #

Il grafico cartesiano scriveva i suoi numeri con una funzione a quattro argomenti (decimali, prefisso, suffisso, separatore delle migliaia). La 5.0 mette grafici e indicatori sotto una sola lingua: un formato di visualizzazione PowerBuilder, quello di una colonna DataWindow, nella proprietà is_format — del grafico intero, e di un asse tramite il suo handle. Le sezioni positivo;negativo;zero, i letterali e la percentuale vengono con esso, e i separatori restano quelli della lingua di visualizzazione. Nessun vecchio nome sopravvive.

Cosa4.05.0
Il formato del graficouo.of_set_value_format(0, "$", "", true)uo.is_format = "$#,##0"
Il formato di un asseuo.of_set_value_format(AXIS_VALUE2, 1, "", " u", false)uo.of_axis(AXIS_VALUE2).is_format = '0.0" u"'
Tornare al numero così com'èuo.of_clear_value_format()uo.is_format = "" (e "" su ogni asse che ha il suo)
Pilotare per nome—of_set_property("format", "#,##0")
Il numero di punti di una serie (sola lettura)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"'

La ricetta: compili; ogni of_set_value_format e of_clear_value_format viene segnalato. Scriva il formato come in una DataWindow: decimals dà il numero di 0 dopo il punto (-1 = #,##0.###), thousands la , del raggruppamento, prefisso e suffisso si scrivono davanti e dietro (tra virgolette se contengono cifre o spazi). Il formato di un asse va in of_axis(<asse>).is_format.

12.5 Altri comportamenti che può notare #

Cosa4.05.0
Menu nativi di un componente che ha un accento proprio (il_theme_accent)l'accento si vedeva solo nella casella di una voce selezionataanche la voce puntata lo mostra, con un bordino sul lato iniziale (a destra in RTL)
button: Ctrl, Alt o Maiusc + Invio (e Ctrl / Alt + Spazio, Ctrl + Esc) sul pulsante che ha il focuscliccavano quel pulsantevanno alla finestra, come da qualsiasi altro controllo: parte la scorciatoia di un altro pulsante (is_shortcut = "Ctrl+Enter"), non il pulsante con il focus; Invio e Spazio da soli lo cliccano ancora
button disattivato con ib_default (o ib_cancel), il più vicino al focus, in un foglio MDIInvio (Esc) andava al pulsante predefinito di un altro foglioil tasto resta nel suo foglio: lo riceve il campo, o il CommandButton PB predefinito
breadcrumb: ii_max_visible impostatoun numero esatto di segmenti in OVERFLOW_COLLAPSE (la larghezza non ripiegava più nulla), ignorato in OVERFLOW_SCROLL e OVERFLOW_SHRINKun tetto in tutti e tre i modi; in OVERFLOW_COLLAPSE la larghezza ripiega ancora di più quando la barra è troppo stretta, e il luogo corrente non esce più dalla barra
breadcrumb: of_add_child con un testo vuotouna riga vuota nel menula chiave del ramo, come of_add_children
breadcrumb: Ctrl+S, F5 e le altre scorciatoie della finestra durante la digitazione del percorsonon partivanopartono, come da un SingleLineEdit; Invio ed Esc restano al campo
breadcrumb: ue_children_needed che non restituisce mai il controllonessun chevron si apriva più fino al prossimo of_resetun clic su un altro chevron abbandona la domanda, e il filo la lascia cadere dopo 10 secondi
chartcartesian: una fascia o una soglia senza colore (-1 o NULL)un blocco pieno del colore del testouna velatura pallida dell'accento del tema (la linea di una soglia: l'accento); un limite NULL è rifiutato (-5)
chartcartesian: un peso NULL in una mappa di calorela cella dipinta del colore più caldo, etichettata « NaN »una cella vuota: lì nulla è disegnato, etichettato o cliccabile; una bolla senza peso mantiene la dimensione predefinita, fuori scala
chartcartesian: of_remove_seriesle serie seguenti cambiavano colore; il tooltip della serie rimossa vestiva la serie successiva con la stessa chiaveogni serie conserva il colore preso alla sua aggiunta; il tooltip e i colori di elemento se ne vanno con la serie
chartcartesian: of_append_values / of_append_categories con ib_animatedl'intero grafico ricadeva sull'asse e risaliva a ogni aggiunta, finché la finestra non era pienasale solo la forma aggiunta, le altre scivolano; l'arrivo intero si ripete solo all'aggiunta di una serie
chartcartesian: barre impilate su entrambi gli assi dei valorile due pile si sovrapponevanoaffiancate nella categoria
chartcartesian: un tag di markup in una categoria o un'etichetta di valorescritta così com'è sull'asse, interpretata nel pannellotesto ovunque: il tag è tolto (l'asse, il pannello, #x#, #label#)
chartcartesian: Esc senza nulla di aperto, Invio su un bucotrattenuti dal graficovanno alla finestra: il suo pulsante Annulla, il suo pulsante predefinito
codeeditor: Ctrl+Tab o Alt+Tab nell'editorfacevano rientrare il codice: la tastiera non usciva più dall'editorvanno alla finestra (la pagina successiva di una scheda); Esc poi Tab esce dall'editor, Ctrl+M o ib_tab_moves_focus fanno uscire Tab
codeeditor: of_find su un'espressione regolare non validarestituiva 0restituisce -5, come of_replace
codeeditor: un nuovo is_text durante una ricercala barra restava aperta e sollevava ue_find_resultla barra si chiude, senza sollevare nulla (un valore è muto)
codeeditor: is_syntax = "SQL" riletto"sql""SQL", come scritto
codeeditor compresso: #regionopen, la copia e of_selected_textmostrato #region; la copia restituiva la visualizzazione, senza le righe delle regioni chiusemostrato come scritto; la copia e of_selected_text restituiscono la sorgente dell'intervallo, regioni chiuse comprese
codeeditor: indicatori e il_doc_line quando si aggiungono o tolgono righe soprarestavano sullo stesso numero di rigaseguono la loro riga; una riga eliminata porta via i suoi indicatori
codeeditor: il cursore dopo «Sostituisci tutto» (of_replace_all)sull'ultima sostituzioneresta dov'era, spostato di quanto inserito prima
codeeditor: Ctrl+Z, Ctrl+Yla cronologia del browser, persa quando il testo veniva scritto con il focus altrovela cronologia del componente (of_undo, of_redo): conta anche ciò che fa il Suo codice, un nuovo is_text la svuota
crypto: of_totp_verify(secret, code, ref al_step) su un codice digitato con spazi («864 010»)rifiutato, passo 0accettato, come dalla forma a due argomenti; gli spazi sono ignorati
crypto: of_base64_encode_file di un file da 32 a 64 MB in un'applicazione a 32 bitpromesso fino a 64 MB; la memoria del processo poteva esaurirsi"" e of_get_last_error() (32 MB al massimo a 32 bit); of_base64_encode_file_to_file codifica un file di qualunque dimensione in un altro file
crypto: of_totp_uri di un segreto digitato a mano («gezd gnbv», uno «0»)scritto così com'era nell'URIscritto in base32 maiuscolo, senza spazi né =; un altro carattere: "" e of_get_last_error()
crypto: un argomento NULLis_last_error poteva tornare NULLvale come vuoto; of_get_last_error() non è mai NULL
crypto: una destinazione \x o C:x (of_base64_decode_to_file, of_encrypt_file, of_decrypt_file)-5 e un messaggio sbagliato («not a base64 value», «all needed»)-5, e of_get_last_error() dice che il percorso dipende dalla cartella corrente di un'unità
commandpalette: una ricerca e i comandi usati di recente (is_recent)un comando recente guadagnava fino a il_max_recent × 4 punti: con un limite alto passava davanti a una corrispondenza migliorespareggia soltanto risultati che corrispondono più o meno allo stesso modo
commandpalette: un comando senza gruppo (as_group = "") dichiarato tra due gruppielencato sotto l'intestazione del gruppo dichiarato primain testa all'elenco, senza intestazione
commandpalette: Home / Fine nel campo che contiene testo, Maiusc+Homespostavano la selezione nell'elenco; Maiusc+Home non selezionava nullaspostano il cursore nel campo; Ctrl+Home / Ctrl+Fine raggiungono l'elenco; Maiusc seleziona nel campo
commandpalette: un clic destro o centrale su una rigalanciava il comandonon fa nulla
commandpalette: of_command su una chiave che nessun comando portaib_enabled / ib_visible si rileggevano true, una scrittura andava persa in silenziosi rileggono false; una scrittura va persa e of_get_last_error lo dice
commandpalette: un secondo oggetto palette che aveva ripreso una combinazione viene distruttoil tasto non rispondeva più a nessuno finché il primo non lo registrava di nuovola combinazione torna al primo
commandpalette: is_recent con spazi o chiavi ripetute, il_max_recent abbassato"a, b" teneva solo a; un doppione appariva due volte; is_recent restava lungoripulito, tagliato al limite e restituito pulito a is_recent all'apertura
dockcontainer: costruire il dock, ripristinare una disposizioneue_layout_changed a ogni aggiunta, il primo conosceva un solo pannello: una disposizione salvata nell'evento veniva sovrascritta da una costruita a metàuna volta per una raffica racchiusa tra of_set_redraw(false) … (true), alla ripresa (e per modifiche a meno di 40 ms); of_set_layout lo solleva una volta. Leggete l'impostazione salvata prima di creare i pannelli
dockcontainer: il pannello in primo piano di una pila cambia senza clic sulla sua schedanulla veniva sollevato (un pannello impilato da of_add_panel o of_move_panel, quello davanti chiuso, staccato o rimosso, un pannello riagganciato)ue_panel_selected del pannello passato davanti, dopo ue_panel_closed, ue_panel_floated o ue_panel_docked; una disposizione ripristinata non ne solleva. n_pbt_dock_panel.ib_front lo rilegge
dockcontainer: ib_visible = true su un pannello chiuso di una pilatornava dietro la scheda attivapassa davanti, e ue_panel_selected segue; in un gruppo ripiegato resta sulla guida
dockcontainer: of_move_panel verso il pannello stesso (as_target = as_key)restituiva 0 senza fare nulla, o divideva la sua pilarestituisce -5; per dividere una pila, mirate a un altro pannello della pila (of_move_panel("b", "a", POSITION_BOTTOM))
dockcontainer: un pannello spostato in un gruppo ripiegato, o fuori da essoib_pinned cambiava senza eventoue_panel_pinned segue
dockcontainer: un clic senza spostamento su un separatoresollevava ue_layout_changednon solleva nulla: nulla è cambiato
dockcontainer: of_keys_at con chiavi numericheprima le chiavi intere (2, 10, zeta)l'ordine di aggiunta (zeta, 10, 2)
dockcontainer distrutto in esecuzione (CloseUserObject)i suoi controlli tornavano sulla finestra, nascostiritrovano la visibilità che avevano prima di of_add_panel
dockcontainer: of_add_panel di un controllo che CONTIENE il dockle finestre si chiudevano ad anellorestituisce -5, il controllo resta dov'era
crosstab: AGG_COUNTcontava le righeconta i valori non vuoti, come il Conteggio di Excel; AGG_COUNT_ROWS, nuovo, conta le righe
crosstab: una somma senza alcun valore; uno « scarto rispetto al precedente » accanto a una cella vuota0una cella vuota (of_get_cell_value restituisce NULL)
crosstab: Top N o Bottom N (of_set_value_filter, o il menu) su un campo posto sotto un altro della sua areaclassificati su tutta la tabellaclassificati all'interno di ciascun genitore (la città migliore di ogni regione); al primo livello, invariato; i membri a pari merito con l'N-esimo restano tutti
crosstab: nessun campo in Colonneuna colonna di totale che raddoppiava l'unica colonna (`Nord650650`)niente più colonna di totale; ib_col_grand_total conserva il suo valore
crosstab: più misure e campi in Colonneuna colonna Totale per misura, senza nome di misura, e non ordinabileun'intestazione « Totale » poi un'intestazione per misura, ordinabile
crosstab: ue_layout_changedattivato dai gesti dell'utente, e solo da is_thousands e of_remove_fieldattivato anche da ogni ordine del codice che cambia ciò che of_get_layout restituisce (of_set_layout compreso), una volta per ordine; una sola volta alla fine di una costruzione racchiusa da of_set_redraw(false) … (true); mai se nulla cambia, né per of_reset
crosstab: una percentuale (SHOW_PCT_*)57.9 % in tutte le linguescritta come la scrive la lingua di visualizzazione: 57.9% in inglese, 57,9 % in francese
crosstab: il filtro di etichettaproposto dal menu del chip di un campo numerico soltanto; su una data, of_set_label_filter confrontava l'anno (2025-03-15 valeva 2025)proposto per ogni campo; su una data, l'overload testo prende dei giorni: LABEL_BEFORE, LABEL_AFTER, LABEL_BETWEEN ("yyyy-mm-dd", giorni inclusi); l'overload numerico, o LABEL_CONTAINS / LABEL_BEGINS / LABEL_ENDS, su una data: -5
crosstab: of_group_date_field su un campo che non contiene date0, e un solo membro « (vuoto) »-5
crosstab: of_add_calc_field / of_add_calc_measure rifiutati dalla griglia (nome già preso, formula che non si compila)0; solo ue_calc_field_error lo diceva-5 e il motivo in of_get_last_error (ue_calc_field_error è sempre attivato); un nome che contiene / o `: -5; una formula accetta .5 e 1e3`
crosstab: of_set_value_filter Top o Bottom di meno di 1 membro; of_expand_to_level sotto 1riportati a 1-5
crosstab: of_get_cell_value chiamato da un evento attivato durante un ordine di questo script-2, come un componente non creato-4, e of_get_last_error dice perché: legga dopo l'evento
crosstab: il menu Opzioni della griglia (l'ingranaggio)« Totale generale » e « Subtotali » commutavano i due assi in base a quello delle righeuna voce per asse: riga e colonna del totale generale, subtotali delle righe e delle colonne
crosstab: of_from_datastore — una colonna CHAR, un decimale, il Format di una colonnagli spazi di riempimento restavano nel membro; il Format era ignoratogli spazi di riempimento sono rimossi; un decimale si legge con il separatore della postazione; il Format della colonna è il formato predefinito dei suoi valori
datagrid: una riga selezionata che la ricerca o un filtro nasconde, o che of_remove_row rimuoverestava selezionata in silenzio (of_selected_keys e ue_row_menu_clicked la portavano)esce dalla selezione, e ue_selection_changed lo dice; of_select_rows non prende una riga nascosta
datagrid: ib_hidden, is_pin, ii_index posti al valore che hanno già; un clic sulla maniglia senza trascinarlasollevavano ue_layout_changednon sollevano nulla: nulla è cambiato
datagrid: modifiche del layout tra of_set_redraw(false) e of_set_redraw(true)un ue_layout_changed per modificauno solo, alla ripresa, con il layout finale
datagrid: un tipo o un renderer fuori dalle costanti (of_add_column, is_renderer, is_selection_mode); of_add_row_menu_item senza componente creatoaccettati e riletti così com'erano, senza effetto; 0of_add_column restituisce -5 (of_get_last_error dice quale); un renderer sconosciuto si rilegge "", una modalità sconosciuta SELECT_NONE; -2
datagrid: of_reload_row o of_update_row di una cella modificatail segno «modificata» restavase ne va: la riga tiene di nuovo ciò che tiene il DataStore
datagrid: modificare una colonna con tabella di codici, una data; una colonna time di un DataStoreil <select> e il campo data del motore; un'ora era testol'elenco e il calendario della libreria (una data si può anche DIGITARE, nell'ordine della lingua); un'ora (TYPE_TIME): ordinamento, filtro > 09:00, formato, digitata 9:5
datagrid: un filtro > 3 su una valutazione senza tipo o su una colonna con tabella di codicicercava il testo «> 3»: nessuna rigaconfronta il dato (il numero, il codice)
datagrid: un albero sotto una ricerca; una riga il cui padre non è nella grigliail figlio trovato restava nascosto; la riga non appariva maii suoi antenati sono mostrati, aperti; la riga sta alla radice
datagrid: of_from_datastore / of_load_rows dopo of_open_source; of_append_rows senza chiave dopo of_from_datastore; un valore CHARla griglia restava sugli scheletri; la riga era rifiutata (-5); manteneva il suo riempimento di spazila sorgente viene lasciata; la chiave segue il RowID più grande; rifilato
datagrid: of_export_xlsxle date erano scritte come testo; nessun tettovere date Excel; una cartella troppo pesante (oltre circa 18 MB) è rifiutata, ue_xlsx_saved dice perché
messagebox: Esc o Alt+F4 su una finestra senza pulsante di annullamentochiudevano la finestra e restituivano 0 — anche of_info, che prometteva 1come in Windows: una finestra con un solo pulsante si chiude tramite esso (of_info restituisce 1), una finestra Sì / No non si chiude — bisogna rispondere; ib_closable = true rende lo 0 della 4.0. Un test = 2 migrato da un MessageBox non lascia più passare un'eliminazione
messagebox: una scorciatoia (of_info, of_error, of_confirm, of_prompt…) dopo aver impostato il_accent, is_position, ib_movable, una dimensione o ib_input_passwordtutto veniva cancellato in silenzio: la password di of_prompt appariva in chiarola scorciatoia sostituisce solo il contenuto (titolo, messaggio, icona, pulsanti, casella, scelte); l'aspetto e le impostazioni del campo restano. of_reset() cancella tutto
messagebox: of_reset() dopo una finestraof_get_last_error, of_checked, of_action e of_input_value parlavano ancora della vecchia finestrasono azzerati
messagebox: un campo obbligatorio riempito di spaziaccettatovuoto: il pulsante predefinito aspetta (il valore digitato torna così com'è)
messagebox: una zona [action] nel titolo, in un'etichetta o nella nota; un collegamento in una scelta; due pulsanti con lo stesso tasto di sceltala zona non faceva nulla; il collegamento apriva il browser E sceglieva; Alt+lettera rispondeva con il primo pulsantela zona risponde come nel messaggio (of_action); il collegamento si apre senza scegliere; Alt+lettera sposta il focus da un pulsante all'altro, Invio sceglie
messagebox: Ctrl+Cperdeva la & di &&, copiava i tag di un pulsante, ignorava l'immissionele etichette come mostrate, « etichetta: valore » del campo (mai una password), i dettagli e la nota
messagebox: un discendente che chiamava xx_set_style_override o xx_clear_style_override (protette)sovrascriveva un token di tema della finestrasono scomparse: il_accent colora la finestra
json e jsontree: un livello di percorso che contiene ~0 o ~1letto così com'è; una chiave che contiene / non aveva percorso~1 è un / della chiave, ~0 un ~ (JSON Pointer, RFC 6901): paths/~1users legge la chiave /users; una chiave che contiene un ~ si scrive ~0 in un percorso
json: un livello di percorso vuoto (a//b, a/) o un percorso che inizia con /rifiutato con -5, letto assenteun livello vuoto è la chiave "", un / iniziale è la forma completa del puntatore: /name vale name, / designa la chiave "" della radice
json: of_get_number, of_get_decimal, of_get_longlong su una stringa come "12 kg" o "1,5"leggeva l'inizio: 12, 10: una stringa conta solo se è interamente un numero JSON — "12.50" vale sempre 12,5
json: of_set_members di una chiave che il documento ha giàla chiave era scritta una seconda volta: n_pbt_json leggeva la prima, un browser o un server l'ultimail valore è sostituito sul posto; una chiave ripetuta dal frammento tiene il suo ultimo valore
json: of_pretty di un documento con un valore of_set_raw annidato su più di 512 livelliun altro documento, tagliato a 512 livelliun testo vuoto
jsontree: clic su una chiave che contiene /, una chiave vuota, o sotto una chiave doppiaun percorso che leggeva un ALTRO valore in n_pbt_jsonx~1y per la chiave x/y, a//b per una chiave vuota; of_selected_addressable restituisce false sotto la seconda di due chiavi identiche
jsontree: Ctrl+C con un pezzo di testo evidenziato col mouseil nodo interoil pezzo evidenziato
jsontree: un testo JSON che inizia con un BOMrifiutato (ue_error)mostrato, come lo legge n_pbt_json; is_json si rilegge com'è stato posto
jsontree: il messaggio di ue_error in ingleseInvalid JSON : …Invalid JSON: … (ogni lingua mantiene la sua punteggiatura); 01, 1., 1e dicono Bad number
jsontree: of_expand_path durante una ricercaripiegato al passo successivo della ricerca, senza ue_node_toggledresta aperto, con i blocchi aperti sopra di lui
jsontree: Spazio su un valore selezionatofaceva scorrere l'albero di una paginanon fa nulla (un blocco si piega sempre)
xmltree: uno spazio tra due figli (<b>x</b> <i>y</i>)non aveva una riga: /p/text()[1] rendeva -5una riga sua, mostrata ␠, con il suo percorso: i numeri di riga di un contenuto misto cambiano
xmltree: un testo tra due figli (Hello <b>x</b> again)Hello, again: spazi ai bordi tagliatiHello , again: spariscono solo gli a capo di impaginazione
xmltree: of_select_path di un XPath il cui primo nodo è uno spazio di impaginazione (//text())-5viene selezionato il primo nodo che l'albero MOSTRA
xmltree: of_selected_value di un elemento che contiene solo a capo (mostrato <x/>)""questi a capo, come li legge n_pbt_xml
xmltree: Ctrl+C con un pezzo di testo evidenziato col mousel'XML del nodo interoil pezzo evidenziato
xmltree: il messaggio di ue_error in ingleseInvalid XML : …Invalid XML: … (ogni lingua mantiene la sua punteggiatura)
xmltree: of_expand_path durante una ricercaripiegato al passo successivo della ricerca, senza ue_node_toggledresta aperto, con gli elementi aperti sopra di lui
xmltree: Spazio su una foglia selezionatafaceva scorrere l'albero di una paginanon fa nulla (un elemento con figli si piega sempre)
jsontree, xmltree: una ricerca che si chiude (Esc nella casella, of_clear_search, of_reset, ib_search_enabled = false)nessun evento: una riga « 3 / 12 » dell'applicazione restava sbagliataue_search_result(0, 0), una volta; nulla quando nessuna ricerca era in corso
PBT_SetDefaultFont con una dimensione: codeeditor, jsontree, xmltree, ribbon, toolbar, crosstab, datagrid, tilesbox, stepbar, listbar, dockcontainer, video, picture, menu e tooltipil codice, il documento, la barra multifunzione (la sua dimensione del tema) e molti testi secondari mantenevano la loro dimensioneseguono la dimensione dell'applicazione, nelle loro proporzioni; la dimensione dell'applicazione prevale su quella della barra multifunzione del tema; un ii_font_size del codeeditor prevale su entrambe
markdownview: ue_link_clicked(string as_url)(string as_url, string as_kind): uno script già scritto per l'evento resta valido; as_kind (LINK_WEB, LINK_MAIL, LINK_DOCUMENT, LINK_FILE, LINK_OTHER) dice che cos'è il link — smistate in base a esso anziché al testo dell'indirizzo
markdownview: un'immagine di un documento su una condivisione di retecaricatarifiutata, a meno che non si trovi sulla condivisione da cui è stato letto il documento, o con ib_network_pictures; un documento letto dal Web non mostra alcun file della postazione
markdownview: un nuovo is_markdown dello stesso documento, of_refreshla vista tornava in cimala posizione di lettura è mantenuta; un nuovo is_source parte sempre dalla cima
markdownview: of_toc, of_scroll_to e una ricerca subito dopo is_sourceagivano sul documento precedenteil file si legge in background: of_toc restituisce 0, of_scroll_to e la ricerca lo attendono; leggete l'indice in ue_loaded
markdownview: una colonna allineata dall'autore (:--, --:) in un'applicazione da destra a sinistracambiava latomantiene il suo lato; solo l'allineamento predefinito segue il verso
markdownview: ue_load_failed per un testo impostato da is_markdownmai sollevatosollevato (REASON_FAILED, as_source vuoto) per un testo che il componente non sa leggere; il documento precedente resta mostrato
menubar: la scorciatoia di una voce (is_shortcut)agiva sullo stato lasciato dall'ultima apertura del menulancia prima ue_menu_opening del suo menu, come Windows: una voce che quell'evento disattiva non risponde, e ue_menu_closed lo dice
menubar: un'apertura abbandonata prima di mostrarsi (scivolamento rapido, Esc o Alt durante ue_menu_opening, perdita del focus)ue_menu_opening senza ue_menu_closed; dopo Esc il menu a discesa si apriva comunquenon si apre nulla, e segue ue_menu_closed: ogni ue_menu_opening riceve esattamente un ue_item_selected o un ue_menu_closed
menubar: Alt poi Esc, F10 poi EscEsc andava anche alla finestra: il suo pulsante AnnullaEsc esce dalla modalità menu e resta alla barra
menubar: un menu aperto da tastiera (Alt+lettera, F10 poi Invio)nessuna voce evidenziata: Invio non sceglieva nullala prima voce è evidenziata, Invio la sceglie
menubar: Alt quando la barra ha già il focusla modalità menu cambiava alla pressione: Alt+Maiusc (layout di tastiera) la accendevaal rilascio di un Alt da solo, come Windows
menubar: un clic su un titolo disattivato o sulla parte vuota della barrala barra teneva la tastiera, il campo in modifica la perdevala tastiera resta al controllo in cui si scriveva
menubar: is_shortcut su un indirizzo che non designa alcuna voceil tasto era preso in tutta la finestra, anche dopo of_clearnon viene armato nulla: impostatelo dopo of_add_item
pdfviewer: ib_allow_save / ib_allow_print di un visualizzatorevalevano per tutti i visualizzatori dell'applicazione; un of_reset altrove ridava Salva a un documento riservatoogni visualizzatore mantiene la propria impostazione
pdfviewer: ib_allow_save / ib_allow_print impostati prima di is_sourcetre caricamenti, tre ue_load_completed; un documento in errore veniva ritentato a ogni modificaun solo caricamento; un documento in errore non viene ritentato
pdfviewer: ii_page impostato mentre un documento è visualizzato, poi un altro is_sourceil documento successivo si apriva a quella paginala pagina era quella del documento visualizzato: il successivo si apre alla sua prima pagina; per aprire un documento su una pagina, imposti is_source e poi ii_page
pdfviewer: lo stesso valore reimpostato (ii_page, ii_zoom, is_fit, ib_viewer_toolbar)ricaricava il documento e attivava ue_load_completednon fa nulla
pdfviewer: ii_zoom fuori da 25-500passato così com'è al lettorericondotto a 25-500, riletto come applicato
pdfviewer: un indirizzo https://nome:segreto@…; una sorgente fatta di spazipassato al lettore, che lo rifiutava con un motivo approssimativo, il segreto tornava negli eventi; riletta così com'è, of_refresh restituiva 0rifiutato subito tramite ue_load_failed (REASON_UNSUPPORTED): scarichi il documento con il restclient; riletta "", of_refresh restituisce -4
picture: id_max_zoom su un'immagine più grande della sua cornicela rotellina, + e id_zoom salivano fino alla dimensione realesi fermano al tetto; solo il tasto 1 va oltre
picture: una nuova is_source, o ib_zoomable = false, su un'immagine ingranditalo zoom tornava a 1.0 senza dire nullaviene sollevato ue_zoom_changed(1.0) (of_reset resta muto); imposti id_zoom dopo is_source
picture: un percorso circondato da spazi (una colonna CHAR)rifiutato, REASON_UNSUPPORTEDvisualizzato; is_source si rilegge come scritto
picture: i tasti dello zoom con Ctrl, Alt o Windows premutoCtrl++ ingrandiva, Alt+1 mostrava la dimensione realelasciati alla Sua applicazione (scorciatoie, tasti di accesso)
picture: un'immagine ricolorata (mono:, tint:) di un altro sito, il cui server rifiuta le richieste di un'altra origineue_loaded e una cornice vuotaue_error con REASON_FAILED, il messaggio dice perché
radialmenu: is_tooltip, is_super_tooltip_title, is_super_tooltip_text, is_super_tooltip_imageesistevano, non mostravano mai nulla: il lanciatore non ha superficierimosse: il compilatore mostra la riga, cancellatela
radialmenu: of_close, un secondo of_show, of_clear o of_reset mentre una ruota è apertaue_dismissed arrivava quando la ruota lasciava lo schermo; of_is_open restava vero fino ad alloraue_dismissed subito, una volta per apertura; of_is_open falso appena la chiamata ritorna
radialmenu: of_remove_item di un ramo che la ruota aperta non mostra (nascosto)la ruota si chiudeva (ue_dismissed)la ruota resta aperta; si chiude solo se mostrava il ramo
radialmenu: of_remove_item con una chiave nuda ("csv")-5risolta come fa of_item (l'unico ramo che la porta); -5 se due rami la condividono
radialmenu: of_show di una ruota senza nulla da mostrare mentre un'altra è apertaue_dismissed, e la vecchia ruota restava sullo schermoanche la vecchia ruota si chiude: un ue_dismissed per ogni apertura
radialmenu: il_back_color_hover di un ramo senza il_text_color_hoverl'etichetta puntata manteneva il testo del tema (bianco su rosa pallido in un tema scuro)viene scelto un testo leggibile su quella tinta; un colore che impostate non viene mai cambiato
restclient: ib_windows_auth o is_client_certificate, e un reindirizzamento verso un altro hostle credenziali Windows e il certificato seguivano il reindirizzamentosolo l'host e la porta della richiesta li ricevono: l'altro host riceve la richiesta senza di essi
restclient: un valore di intestazione oltre il Latin-1 (greco, giapponese…)accettato da of_set_header (0), poi ogni richiesta dell'oggetto restituiva -5rifiutato già da of_set_header (-5, of_get_last_error() dice il perché); of_set_basic li accetta: la sua coppia parte come base64 del suo UTF-8
restclient: un metodo malformato ("GE T"), credenziali nell'URL (https://user:pwd@…), un nome di campo di of_upload con un apice-4 «request failed: 0»; le credenziali sparivano senza una parola; il corpo multipart era rotto-5, e il motivo in of_get_last_error() (per le credenziali: usate of_set_basic)
restclient: una 303, o una 301 o 302 dopo un POST, che prosegue come GETconservava il Content-Type del corpo di partenzaparte senza Content-Type
restclient: ue_progresssollevato per ogni corpo asincrono, senza mai raggiungere il totale: una barra restava al 39 %sollevato per ogni corpo asincrono (la documentazione lo dice), e l'ultimo, subito prima di ue_response, vale il totale
restclient: of_response_header di un'intestazione inviata più volte (Link, Set-Cookie)solo il primo valoretutti, uniti da , — Set-Cookie da un a capo
restclient: lo User-Agent inviatoPBToolboxAI/4.0, scritto nel codicela versione della libreria; of_set_header("User-Agent", …) lo sostituisce ancora
restclient: una richiesta quando il client HTTP non ha potuto essere creatopartiva su una sessione usa e getta, senza autenticazione Windows, certificato client né cookie-2, e il_status lo dice
restclient: of_set_header("Authorization", …) dopo of_set_basicpartivano entrambe le autenticazioniuna sola autenticazione: l'Authorization impostata sostituisce il Basic
ribbon: un valore scritto dal codice (is_text, id_value) mentre il campo di una casella combinata o di un contatore ha il focusil campo manteneva il vecchio testo; lasciandolo partiva ue_combo_changed / ue_value_changed con il vecchio valore, che sostituiva il Suoil campo lo mostra subito, a meno che l'utente stia digitando (vince la digitazione); lasciare il campo senza aver digitato non solleva nulla
ribbon: un'etichetta con tag (is_label, titolo di una scheda, di un gruppo, di un banner, pulsante applicativo)mostrata così com'è, tag compresi (il pannello di un gruppo ridotto li interpretava)il testo formattato con tag è interpretato ovunque; un testo dell'utente passa da of_escape_markup
ribbon: la rotellina sopra la barraogni piccolo movimento di un touchpad cambiava scheda; una barra ridotta cambiava scheda anch'essa, senza mostrare nullauna scheda per scatto della rotellina (i piccoli movimenti si sommano); nulla su una barra ridotta
ribbon: of_add_spinner con un passo di 0 o meno, o un minimo sopra il massimo; id_min / id_max / id_step incoerentiaccettati: frecce morte o invertite, un valore fuori intervallo mostratoof_add_spinner restituisce -5 e mantiene il valore nell'intervallo; un passo di 0 o meno è rifiutato (of_get_last_error dice perché); un limite scritto oltre l'altro lo porta con sé, come in un NumericUpDown — l'ordine delle due scritture non conta più
ribbon: un is_keytip non fatto di lettere A-Z e cifre ("É", "-")conservato e riletto, mai raggiungibile da tastierarifiutato: non cambia nulla, of_get_last_error dice perché
ribbon: Esc al secondo livello dei tasti di accesso (i comandi di una scheda)chiudeva tutti i tastitorna alle lettere delle schede, come in Office; un secondo Esc chiude
speechout: of_speak_from(0) o un numero negativoleggeva dalla prima frase-5, non viene letto nulla (le posizioni contano da 1)
speechout: ii_rate, ii_pitch, ii_volume impostati fuori dal loro intervallo (ii_rate = 1000)si rileggevano come impostati (1000) mentre la voce applicava il limitesi rileggono come applicati (400)
speechout: un pezzo [rate]…[/rate] in una fraseuna frase a sé: il suo ue_sentence, il suo numero, e un punto dopo [/rate] diventava una «frase»resta nella sua frase: un solo ue_sentence con il testo intero, un solo numero, ue_word conta in quel testo, of_spoken_text una riga per frase; la punteggiatura va con il pezzo
speechout: [rate=0]letto al 100 %la velocità più lenta, 10 %
speechout: una regola di of_add_replacement su una parola che è anche il nome o il valore di un tag (total con [mark=total], rate, una parola in [spell])riscriveva il tag: il segno cambiava nome, il tag era letto ad alta voce, il testo compitato cambiavala regola riscrive solo il testo tra i tag
speechout: una postazione senza alcuna voceue_error, poi una lettura «in corso»: ue_started, ogni ue_sentence, ue_stopped; of_speak_sync rendeva 0ue_error e nient'altro: nessuna lettura, nessun ue_started; of_speak_sync rende -4
speechout: is_lang senza regione ("fr", "en")ue_voice_fallback a ogni letturanessun ripiego per una voce di quella lingua, qualunque sia la regione
speechout: of_clear_queue dietro un of_speak (la lettura in corso non è un testo della coda)ue_queue_done alla fine della letturanessun ue_queue_done: nessun testo della coda è stato letto
speechout: un'iniziale (John F. Kennedy), un mese abbreviato (Oct. 10), una sigla con punti (U.S.)terminava la fraseresta nella frase (un mese o una sigla la termina davanti a una maiuscola, come etc.): i numeri di frase possono cambiare
statusbar: un pannello cliccabile disattivato con un tooltipil tooltip non appariva maiappare, per dire perché il pannello è disattivato
statusbar: of_count, of_keys_at, of_has sull'indirizzo di un pannello ("enc")0, "", false: le voci della sua lista non erano vistele voci della sua lista, separatori esclusi
statusbar: una posizione in una lista a discesa (of_insert_menu_item, of_move_menu_item)contava i separatoriconta solo le voci, come le posizioni dei pannelli
statusbar: una chiave di pannello o di voce che comincia con __accettatarifiutata, -5: è riservata al componente
statusbar: is_tooltip e i cinque colori su una voce di lista (of_menu_item)conservati e riletti, senza effettoignorati, riletti vuoti (-1 per un colore): il menu nativo non li mostra
statusbar: la maniglia (ib_show_resize_grip) in un foglio MDI, o una barra che non è in fondo alla sua finestraridimensionava la cornice, dal suo angoloridimensiona il foglio; nessuna maniglia quando la barra non occupa l'angolo in basso
statusbar: il tasto Menu o Maiusc+F10 su un pannello che ha il focusnienteue_panel_rclicked, all'angolo in basso a sinistra del pannello
stepbar: Invio o Spazio su un passaggio, in una finestra che ha un pulsante predefinitoue_step_clicked e il pulsante predefinito («Avanti») scattavasolo ue_step_clicked: il tasto resta alla barra
stepbar: of_clear_steps mentre la barra si trova su un passaggionon sollevava nullaue_step_changed(numero lasciato, chiave lasciata, 1, ""), come la rimozione del passaggio in corso; of_reset non solleva nulla
stepbar: ii_current oltre «tutto terminato» (più del numero di passaggi + 1)ue_step_changed annunciava subito un numero che non esisteva; l'arrivo del passaggio era mutonulla viene sollevato finché la barra attende; ue_step_changed viene sollevato quando il passaggio arriva
stepbar: of_move_step su una barra «tutto terminato»poteva riaprire la barra: un passaggio tornava in corso, con ue_step_changedla barra resta «tutto terminato», nulla viene sollevato
stepbar: NAV_VISITED, un passaggio inserito o spostato davanti a quello in corsocliccabilemostrato completato, ma non cliccabile: non è mai stato raggiunto
stepbar: un passaggio con avviso (STATE_WARNING)un indicatore ambraun indicatore ambra e un secondo anello ambra: non somiglia più a un passaggio completato dove l'accento è ambra
statictext: ue_hyperlink(string as_url)(string as_url, boolean ab_opened): uno script già scritto per l'evento resta valido; ab_opened vale FALSE quando il collegamento non si è aperto (uno schema diverso da http, https, mailto — of_get_last_error() dice perché —, o tenuto chiuso da ue_hyperlink_opening)
statictext disattivato su uno sfondo proprio (il_back_color, una porzione [bk])il testo prendeva il grigio del tema, illeggibile su uno sfondo scuro o coloratoi suoi colori sono mantenuti e attenuati; sulla superficie del tema, il grigio del tema, come prima
statictext: PBT_SetDefaultFont con una dimensionela dimensione restava a 11 ptla dimensione data si applica (11 pt senza di essa, invariato)
statictext: ii_font_size fuori da 6 a 200applicata così com'erariportata al limite più vicino, come il tag [size], e riletta come applicata
statictext: doppio clic su una parola con ib_selectableun solo ue_clicked prima di ue_double_clickeddue ue_clicked poi ue_double_clicked, come lo StaticText di PowerBuilder; rilasciare dopo un trascinamento che seleziona resta senza clic
statictext: of_reset di un testo annunciato come tagliatonienteue_text_overflow(false)
statictext: is_text riletto dopo of_append_text, quando una riga lasciava un tag aperto[b]Start[br]two: reimpostato, il grassetto continuava sulla riga seguente[b]Start[/b][br]two, ciò che lo schermo mostra; una riga vuota conserva la sua altezza; con ib_marquee, le righe scorrono come una riga sola
statictext: ib_auto_width e un testo svuotatomanteneva la larghezza del testo precedentesi restringe al suo margine; un cambio di tema misura di nuovo anche la larghezza
xml: of_count, of_get_values, of_get_attrs, of_get_attr_names quando nulla è caricato, un elemento costruito è ancora aperto o il motore rifiuta l'XPathrendevano 0, come una ricerca senza risultatorendono -4 (-2 se la pagina non risponde), of_get_last_error() dice perché; 0 è sempre un vero zero. Un test > 0 non cambia; un test = 0 che voleva dire «nulla trovato» vede ora il rifiuto a parte
xml: of_get_attr e of_remove_attr di un attributo assente, of_get_attrs con un nome vuotovuoto senza motivo, 0 («fatto»), 0vuoto e «no such attribute» in of_get_last_error() (un attributo scritto vuoto resta senza motivo), -4, -5
xml: of_set_value, of_set_attr, of_add_child di un testo con un carattere di controllo (Char(1)) o un CRscritto così com'era: il documento non si ricaricava più, il CR tornava LFil carattere vietato è rimosso, come fa il builder; il CR si scrive &#13; e si rilegge
xml: builder — un secondo elemento in cima, un testo senza elemento aperto, un attributo dopo un figlioscritto (due radici) o ignorato senza una parolalasciato fuori, e of_get_last_error() dice perché
xml: of_get_value("sum(//qty)") su un testo non numerico; of_get_value("/")il testo NaN; vuotovuoto e «the expression is not a number»; il testo del documento

La ricetta: niente da cambiare.

12.6 Ciò che è stato aggiunto #

Nulla di quanto segue chiede di modificare il codice. Gli otto nuovi componenti della 5.0 sono presentati nelle note di versione.

OggettoAggiunto
progressbaris_unit: un testo scritto dopo la lettura ("of 500 rows", "MB")
datagridis_mask di una colonna (n_pbt_datagrid_column): la maschera di input di una colonna numerica; una colonna senza formato di visualizzazione mostra la sua is_mask
datagridla tastiera delle intestazioni (Freccia su dalla prima riga; Invio ordina, Maiusc+Invio aggiunge all'ordinamento; Alt+Giù o il tasto Menu apre il menu della colonna; Ctrl+Maiusc+frecce la spostano, Alt+frecce cambiano la sua larghezza); TYPE_TIME; of_get_last_error dice perché una chiamata ha restituito -5
ribbonis_mask e is_format di un contatore (n_pbt_ribbon_item); is_group: interruttori esclusivi di un gruppo (n_pbt_ribbon_item) e voci radio di un menu (n_pbt_ribbon_menu_item); ue_item_rclicked (clic destro su un controllo, un gruppo, una scheda o un pulsante della barra di accesso rapido, con il punto dello schermo al_x, al_y; anche tasto Menu e Maiusc+F10) e ue_rclicked (fuori da ogni item); is_title di un gruppo contestuale (n_pbt_ribbon_ctx_group), il cui tooltip appare sul banner; tasti di accesso dei pulsanti della barra di accesso rapido; colori degli item delle voci di menu e dei pulsanti della barra di accesso rapido; nomi accessibili di tutti i controlli
breadcrumbla digitazione del percorso diventa una barra degli indirizzi: ib_auto_complete, ue_path_typing e of_add_suggestion (completamento durante la digitazione), ib_veto_path, ue_path_entering e is_path_error (un percorso rifiutato conserva la digitazione)
chartcartesianof_from_datastore (DataStore, DataWindow, DataWindowChild), of_map e le costanti ROLE_*, of_reload: il grafico di un DataWindow (righe sommate per categoria e serie, rilette sul posto); 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 (la cronologia di annullamento pilotabile); ue_modified_changed; of_toggle_comment (Ctrl+/); of_next_marker (F8); ib_match_brackets; ib_tab_moves_focus (Ctrl+M)
cryptoi blob (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; le claim attese di of_jwt_verify e il_jwt_leeway_seconds; JWT_HS384/HS512, JWT_RS384/RS512, JWT_PS256/PS384/PS512, JWT_ES384 e KEY_EC_P384; lo schema e l'hash di of_sign / of_verify (SIGN_PKCS1, SIGN_PSS); i dati aggiuntivi di of_encrypt_with_key / of_decrypt_with_key; l'hash di of_rsa_encrypt / of_rsa_decrypt; le impostazioni di of_totp_code, of_totp_verify, of_totp_uri e of_hotp_code; of_password_needs_rehash
buttonbaris_style di un pulsante (STYLE_PRIMARY, STYLE_FLAT, STYLE_DANGER), is_badge (un badge di testo), il_badge_color, is_mnemonic, ii_image_size e ii_badge_size della barra, ib_enabled dell'intera barra, ue_button_rclicked e ue_rclicked, of_clear_shortcuts
commandpaletteof_load_menu(menu): la palette riempita da un menu PowerBuilder, riletto a ogni apertura; of_loaded_item(as_key) restituisce la voce di un comando; of_get_last_error()
dockcontainerib_front di un pannello (n_pbt_dock_panel, sola lettura): il pannello che la sua pila mostra; la voce Nascondi automaticamente del menu del pannello, anche sulla linguetta della guida; Maiusc+F10 e il tasto Menu aprono questo menu sotto la scheda; il pannello attivo, quello che ha la tastiera: of_active_panel() e ue_active_panel_changed(as_key)
crosstabof_value(position) e il suo handle n_pbt_crosstab_value (un valore dell'area Valori: 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 (le righe del DataStore dietro una cella); is_format di un campo; AGG_COUNT_ROWS, LABEL_BEFORE, LABEL_AFTER
messageboxof_messagebox (gli argomenti di MessageBox(), Question! e YesNo! compresi) e le costanti BUTTONS_*; of_retry_cancel; il pulsante predefinito di of_confirm, of_yes_no, of_yes_no_cancel (al_default); Riprova, Interrompi, Ignora, Chiudi tradotti; 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 che maschera ed esige; una scelta disattivata (of_add_choice, ab_enabled)
jsontreeof_get_layout, of_set_layout e ue_layout_changed (le pieghe, la selezione, la riga in cima); of_selected_addressable, of_selected_type, of_selected_count, of_copy_path; ue_node_rclicked (clic destro, tasto Menu); ib_find_decoded (la ricerca nei valori decodificati, pulsante &)
xmltreeof_find_xpath (ogni nodo di un XPath, percorso con of_search_next); of_get_layout, of_set_layout e ue_layout_changed (le pieghe, la selezione, la riga in cima); of_selected_kind (costanti KIND_*), of_selected_name, of_selected_namespace, of_copy_path; ue_node_rclicked (clic destro, tasto Menu); ib_find_decoded (la ricerca nei valori decodificati, pulsante &)
jsonof_from_datastore e of_to_datastore (DataStore, DataWindow, DataWindowChild): un DataStore come array di oggetti tipizzati, e ritorno; date 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 (dove un testo non è JSON); of_escape_key
listbarue_item_invoked (un clic sulla voce, compresa quella già selezionata); ib_search, is_filter, ue_filter_changed (una ricerca); of_from_datastore (DataStore, DataWindow, DataWindowChild), of_map e le costanti ROLE_* (una riga = una voce)
markdownviewis_base_path, ib_allow_html (un breve elenco di tag HTML inerti), 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+Ins, le costanti LINK_*; gli avvisi di GitHub, gli indirizzi e-mail nudi e le emoji
menubarof_load_menu(menu): tutta la barra dal menu PowerBuilder di una finestra, riletto a ogni apertura, i suoi Clicked eseguiti; of_loaded_item; of_insert_item (una voce a un rango) e of_clear_items (svuotare una cascata mantenendo la voce); of_open, of_close, of_is_open
pdfviewerof_load_blob(blob) e of_load_blob(blob, string): un PDF contenuto in un blob (letto con SELECTBLOB), visualizzato senza file, qualunque sia la dimensione; is_find (un testo evidenziato all'apertura); ib_navigation_pane (il pannello laterale del lettore); is_destination (aprire su una destinazione con nome del PDF); ib_allow_search, ib_allow_rotate e ib_allow_fullscreen (i comandi Cerca, Ruota e Schermo intero della barra del lettore)
pictureof_set_picture(blob): un'immagine tenuta in memoria (SelectBlob), come SetPicture del Picture nativo; ib_clickable: l'immagine diventa un pulsante per la tastiera (Tab, Invio, Spazio); i formati TIFF, WMF, EMF e RLE, convertiti al volo; un nome per i lettori di schermo che dice la pastiglia e il fallimento
radialmenuof_show_over(dragobject ado_control {, boolean ab_keyboard}): la ruota centrata su un controllo, il suo primo ramo acceso quando viene dalla tastiera; sulla maniglia del ramo, is_image (icona cambiata sul posto), is_tone (costanti TONE_* di u_pbt_radialmenu) e is_group (gruppo radio)
restclientof_url e of_url_encode (una query di URL codificata); of_post_form e of_post_form_async (un modulo HTML); of_oauth_client_credentials (un token OAuth2 rinnovato da solo); of_retrieve (DataStore, DataWindow, DataWindowChild: un array JSON in righe); le intestazioni di una sola richiesta (of_request e of_request_async, quarto argomento as_headers); is_last_request; ib_check_revocation
statusbarib_spring (e una larghezza di -1 in of_add_panel, of_insert_panel): un pannello che prende lo spazio libero; of_dock_bottom (la barra in fondo alla sua finestra); is_help e is_help_panel (la MicroHelp di una cornice PowerBuilder); ib_announce (lettori di schermo); il tooltip di un testo troncato
tilesboxof_move_tile(as_keys, as_to_key, al_position): un riquadro mandato dal codice in un altro gruppo, con colori, badge e facce; Esc annulla un trascinamento, il pannello scorre quando il puntatore si avvicina al suo bordo; un lettore di schermo sente il badge e la banda di un riquadro; un'icona SVG resta nitida su un riquadro grande; l'intestazione di un gruppo si illumina sotto il puntatore; l'impostazione «meno animazioni» di Windows è rispettata
statictextib_mnemonic (la & di un'etichetta PowerBuilder), ii_max_lines (al massimo N righe, «…»), il_max_log_lines e of_clear (un registro limitato, svuotato), ii_max_width (tetto di ib_auto_width), ib_veto_links e ue_hyperlink_opening (decidere se un collegamento si apre); un registro viene annunciato riga per riga ai lettori di schermo; disattivato, le zone del markup escono dall'ordine di Tab
xmlof_get_number, of_get_decimal, of_get_longlong, of_get_boolean, of_get_date, of_get_datetime: il valore all'XPath verificato rispetto al suo tipo XML Schema e letto allo stesso modo su ogni macchina (NULL e of_get_last_error() se non è di quel tipo)
xmloverload decimal, date, datetime, boolean di of_leaf, of_element_attr e of_set_value: scritti con un punto e in ISO 8601 su qualunque macchina

12.7 buttonbar: chiave, etichetta, poi icona; la « & » e la combinazione #

La barra di pulsanti parlava diversamente dal resto della libreria: l'icona prima dell'etichetta, la posizione come secondo argomento, e un is_shortcut che voleva dire « lettera Alt » dove ovunque altrove vuol dire « combinazione » — is_shortcut = "Ctrl+S" armava Alt+C. La 5.0 la allinea a button, alla barra degli strumenti e al CommandButton di PowerBuilder.

Cosa4.05.0
Aggiungere un pulsanteuo.of_add_button("save", "img\save.png", "Save")uo.of_add_button("save", "&Save", "img\save.png")
Un pulsante di solo testouo.of_add_button("ok", "", "OK")uo.of_add_button("ok", "OK")
Inserire un pulsanteuo.of_insert_button("mid", 2, "", "Mid")uo.of_insert_button("mid", "Mid", "", 2)
La lettera Alt di un pulsanteis_shortcut ← "S" (Alt+S)l'etichetta "&Save", oppure uo.of_button("save").is_mnemonic = "S"
Una combinazione su un pulsanteuo.of_register_shortcut("Ctrl+S", "save")lo stesso, oppure uo.of_button("save").is_shortcut = "Ctrl+S" — mostrato nel tooltip
Una « & » in un'etichettamostrata così com'èsegna la lettera Alt; && per una « & » scritta
Il badgeuo.of_button("inbox").il_badge = 3uo.of_button("inbox").is_badge = "3" (un testo: "New", "!"); il_badge resta accettato
Il pulsante con il focus, senza is_defaultdipinto con l'accento pienosolo il suo anello di focus
// 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"

La ricetta: compili; una chiamata di of_insert_button è segnalata (la posizione va per ultima). Un of_add_button a tre argomenti compila ancora: scambi gli ultimi due (l'etichetta, poi l'icona) — un pulsante la cui etichetta è un percorso di file Le mostra quelli rimasti. Sostituisca ogni is_shortcut di una lettera con una « & » nell'etichetta, e raddoppi ogni « & » che deve essere mostrata (R&&D).

12.8 crosstab: il formato dei valori tramite is_format #

La tabella pivot scriveva i numeri di una misura con una funzione a quattro o cinque argomenti (decimali, separatore delle migliaia, simbolo, simbolo davanti), che valeva per tutti i valori di un campo: lo stesso campo due volte in Valori — l'importo, e la sua quota del totale — non poteva avere due formati. La 5.0 lo mette sotto la lingua dei grafici e degli indicatori: un formato di visualizzazione PowerBuilder in is_format, sull'handle del campo (of_field) per tutti i suoi valori, o sull'handle di un valore (of_value(position), nuovo) per esso solo. Vuoto, un valore prende il Format della colonna del DataWindow. Nessun vecchio nome sopravvive.

Cosa4.05.0
Il formato di tutti i valori di un campouo.of_set_value_format("amount", 2, "locale", "$", true)uo.of_field("amount").is_format = "$#,##0.00"
Un simbolo dopo il numerouo.of_set_value_format("amount", 0, "", " EUR")uo.of_field("amount").is_format = '#,##0" EUR"'
Il formato di un valore (lo stesso campo due volte)—uo.of_value(2).is_format = "#,##0.00"
I negativi in rossosolo il menu del chipuo.of_value(1).ib_negative_red = true
Tornare al formato predefinitouo.of_clear_value_format("amount")uo.of_field("amount").is_format = "" (il Format della colonna del 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"

La ricetta: compili; ogni of_set_value_format e of_clear_value_format viene segnalato. Scriva il formato come in una DataWindow: ai_decimals dà il numero di 0 dopo il punto, un separatore delle migliaia dà la , del raggruppamento ("none": nessuno), il simbolo si scrive davanti o dietro (tra virgolette se contiene cifre o spazi). Il formato di un solo valore va in of_value(<posizione>).is_format.

12.9 listbar: il clic destro porta il suo punto, una disposizione si annuncia #

La barra laterale si allinea alla libreria su tre punti: il clic destro di una voce dà il suo punto dello schermo come quello degli alberi, delle griglie e del kanban; un ordine del codice che cambia la disposizione la annuncia come un gesto; una voce disattivata non diventa più la selezione. Guadagna anche un evento per il clic sulla voce già selezionata, una ricerca e la costruzione da un DataStore (12.6).

Cosa4.05.0
ue_item_rclicked(string as_keys)(string as_keys, long al_x, long al_y): il punto in pixel dello schermo; anche il tasto Menu e Maiusc+F10 lo sollevano
of_set_layout che cambia la disposizionenessun eventoun ue_layout_changed (mai ue_section_toggled)
of_move_item / of_move_section al rango già occupatoue_layout_changednulla: nulla si è mosso
of_select_item di una voce disattivata0, diventava la selezione-5, senza porre ue_selection_changing; disattivare la voce già selezionata la mantiene
ib_auto_width letto mentre la barra è compressatrueciò che l'applicazione ha impostato
of_item di un indirizzo a un solo livello ("nav")raggiungeva la sezioneun handle che non nomina nulla; una sezione si raggiunge con of_section
La stessa lettera digitata due volteun prefisso dd, spesso senza corrispondenzela riga successiva che inizia con essa; uno Spazio a metà di un prefisso gli appartiene
Una voce disattivata sotto il puntatoresenza tooltipil suo tooltip si mostra; il clic continua a non fare nulla
// 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())

La ricetta: nulla rifiuta di compilare — uno script di ue_item_rclicked conserva as_keys. Aprite il vostro menu al puntatore della finestra (parent.PointerX()), o passate al_x, al_y a of_show di un contextmenu. Impostate la selezione iniziale prima di attivare ib_veto_selection, e verificate che il vostro ue_layout_changed accetti la chiamata che of_set_layout ora solleva.

12.10 scheduler: la natura di una modifica e i valori precedenti #

Il calendario si allinea al diagramma di Gantt: la domanda posta prima di un gesto dice se si tratta di uno spostamento o di un ridimensionamento, e gli eventi che seguono danno i valori precedenti — un registro, un annullamento o una conferma non devono più tenere la propria copia di ogni appuntamento. Una selezione che il vostro codice toglie viene annunciata, e quattro chiamate rifiutano ora ciò che accettavano in silenzio.

Cosa4.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 o 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)
Il vostro codice rimuove, svuota o ricarica l'appuntamento selezionatonessun eventoue_selection_changed(""); of_reset resta muto
of_add_appointment la cui fine precede l'inizio0, la fine diventava inizio + 30 min-5, of_get_last_error dice perché
of_scroll_to_time("abc")0, nulla scorreva-5
of_set_field sulla colonna che svolge ROLE_KEY0, due appuntamenti con la stessa chiave-5: una chiave cambia ricaricando
of_show_appointment di un appuntamento nascosto, filtrato o su una risorsa nascosta0, la vista partiva verso un giorno in cui nulla si vedeva-5, nulla si muove
is_now impostato dopo una navigazione dell'utenteriportava la vista al suo giornola vista resta dove l'utente è andato
of_clear_appointmentsteneva le colonne del DataStore per of_mapdimentica il DataStore: of_map accetta le colonne del successivo
// 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

La ricetta: nulla rifiuta di compilare — uno script di ue_appointment_changing, ue_appointment_moved o ue_appointment_resized conserva i suoi argomenti, i nuovi si aggiungono. Se il vostro ue_selection_changed attiva dei pulsanti, ora riceve "" quando l'appuntamento selezionato sparisce; ricontrollate i codici di ritorno di of_add_appointment, of_scroll_to_time, of_set_field e of_show_appointment, che ora possono restituire -5. Per salvare i gesti senza codice, vedete ib_write_back.

12.11 shellexplorer: l'errore dice il suo motivo #

L'esploratore della shell dà ora, in ue_error come in ue_path_not_found, un motivo che il codice può verificare — una costante REASON_* di u_pbt_shellexplorer, la stessa in ogni lingua di Windows. Non solleva più ue_selected per la cartella già selezionata, e annuncia con ue_collapsed un ramo che chiude da sé. Guadagna anche il clic destro su una cartella (ue_node_rclicked) e l'indirizzo della radice.

Cosa4.05.0
ue_error(string as_message)(string as_path, string as_reason, string as_message): il percorso ("" per il Desktop), una costante REASON_*, il testo della shell
as_reason di ue_path_not_founduna frase inglese (not found, outside the root, not a branch…)una costante REASON_* (not_found, outside_root, not_a_branch…); not_shown per un percorso che esiste ma che l'albero non mostra
Riselezionare la cartella già selezionata (clic, Home sulla prima riga)ue_selectednulla
Un ramo che l'albero chiude da sé (tornato vuoto, rifiutato dalla shell)nessun eventoue_collapsed
ib_show_files, ib_show_hidden, is_file_filter, is_root scritti con il loro valorel'albero viene rilettonulla viene riletto; is_file_filter impostato senza i file li aspetta
of_collapse di un percorso disegnato due volteogni riga, un ue_collapsed ciascunala riga che of_select raggiunge, un ue_collapsed
of_count(""), of_keys_at("", i)le righe mostrate, come of_count()il primo livello (la radice), come 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

La ricetta: nulla rifiuta di compilare — uno script di ue_error conserva as_message, i nuovi argomenti si aggiungono. Una verifica sul TESTO di as_reason in ue_path_not_found ("not found", "outside the root") si riscrive con una costante REASON_*; un'applicazione che ricaricava un riquadro a ogni ue_selected lo fa ora una volta per cambiamento.

12.12 tilesbox: il clic destro porta il suo punto, un ordine del codice si annuncia, la disposizione lascia i diritti all'applicazione #

Il pannello di riquadri si allinea alla libreria: il suo clic destro dà il punto dello schermo come quello degli alberi, delle griglie e del kanban; un ordine del codice che sposta un riquadro, comprime un gruppo o cambia una dimensione solleva gli stessi eventi di un gesto; la disposizione non porta più la visibilità, che resta affare dell'applicazione. Guadagna anche lo spostamento di un riquadro in un altro gruppo dal codice (12.6).

Cosa4.05.0
ue_tile_context(string as_keys)ue_tile_rclicked (string as_keys, long al_x, long al_y): il punto in pixel dello schermo; anche il tasto Menu e Maiusc+F10 lo sollevano, all'angolo in basso a sinistra del riquadro
of_move_tile, of_insert_tileinteger ai_indexlong al_position; un overload of_move_tile(as_keys, as_to_key, al_position) manda il riquadro in un altro gruppo
of_move_tile verso un altro postonullaue_tile_moved, ue_layout_changed
ib_collapsed di un gruppo impostato dal codiceue_group_toggledue_group_toggled, ue_layout_changed
is_size impostato dal codicenullaue_layout_changed (mai ue_tile_resized, che dice che l'utente l'ha scelta)
is_size di una dimensione sconosciuta ("huge")il riquadro diventava mediumrifiutato: nulla viene scritto, of_get_last_error dice perché; of_add_tile / of_insert_tile restituiscono -5
La disposizione (of_get_layout, ue_layout_changed)portava la visibilità dei gruppi e dei riquadrinon la porta più: of_set_layout non rimostra mai ciò che il Suo codice ha nascosto; una disposizione 4.0 si rilegge senza di essa
of_set_layout che cambia la disposizionenessun eventoun ue_layout_changed; -5 su un JSON che non è una disposizione ({})
of_tile / of_group di un indirizzo che non nomina nullaun handle per chiamata, conservatol'handle inerte, lo stesso per tutti: non scrive nulla e si rilegge vuoto
// 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)

La ricetta: compili; il Suo script di ue_tile_context resta su un evento che non esiste più — lo sposti in ue_tile_rclicked, che conserva as_keys. Se il Suo ue_layout_changed salva la disposizione, ora vede anche ciò che il Suo codice cambia; un ue_tile_moved che deve reagire solo all'utente ignora gli spostamenti che il Suo codice ha appena fatto. Se conservava la visibilità nella disposizione, la imposti dal codice all'apertura (ib_visible), secondo i diritti.

12.13 tab: il clic destro porta il suo punto, una disposizione applicata si annuncia #

La scheda si allinea alla libreria: il clic destro di una scheda, con il menu integrato spento, dà il suo punto dello schermo come quello degli alberi, delle griglie e del kanban, e of_set_layout che cambia la disposizione la annuncia come un gesto. Un trascinamento riportato al suo posto non annuncia più nulla. Guadagna anche pagine create su richiesta (ue_page_needed, of_supply_page), il doppio clic (ue_tab_double_clicked), ib_cycle_keys, is_close_mode, ii_strip_width e, su una pagina, ib_modified e is_badge — vedere la pagina della scheda.

Cosa4.05.0
ue_tab_rclicked(string as_key)(string as_key, long al_x, long al_y): il punto in pixel dello schermo; anche il tasto Menu e Maiusc+F10 lo sollevano, all'angolo in basso a sinistra della scheda
of_set_layout che cambia la disposizionenessun eventoue_layout_changed, una volta
un trascinamento riportato al suo posto, of_move_page al proprio postoue_tab_reordered e ue_layout_changednulla: l'ordine non è cambiato
più spostamenti sotto of_set_redraw(false)un ue_layout_changed per spostamentouno solo, alla ripresa
Maiusc+F10 su una scheda, menu integratoil menu si apriva sotto il mousesotto la scheda
banda verticale e titolo lungola banda prendeva la larghezza del titoloal massimo il 40 % del componente, puntini di sospensione; ii_strip_width la fissa
il_accent di una paginasolo l'anello di focussottolinea anche la scheda attiva
is_shortcut sull'handle di una chiave senza paginaregistrato: il tasto veniva preso per nullanon viene registrato nulla, of_get_last_error dice perché
of_insert_page il cui spostamento falliscecodice negativo, la pagina restavacodice negativo, la pagina viene tolta
// 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)

La ricetta: nulla rifiuta di compilare — uno script di ue_tab_rclicked conserva as_key. Apra il suo menu al puntatore della finestra (parent.PointerX()), o passi al_x, al_y a of_show di un contextmenu. Verifichi che il suo ue_layout_changed accetti la chiamata che of_set_layout ora gli fa.

12.14 soundplayer: il numero di un suono, un rifiuto reso subito #

Il lettore di suoni cambia tre cose che il Suo codice può vedere. I suoi eventi portano il numero del suono: ue_started, ue_ended e ue_failed ricevono un ultimo argomento, al_sound — il numero che of_play_over e of_enqueue rendono ora (rendevano 0), e che il nuovo of_stop_sound accetta. Una sorgente rifiutata subito è un codice: of_play, of_play_over, of_crossfade e of_preload rendono -5, il motivo in of_get_last_error(), per una sorgente vuota, un indirizzo http://, un indirizzo file:// malformato o un formato rifiutato dal nome — e non sollevano più ue_failed; il suono in corso continua. Nella coda (of_enqueue), il rifiuto arriva sempre tramite ue_failed, al suo turno. Altri -5: of_pause e of_resume senza nulla da sospendere o riprendere, of_beep e of_beep_sync a 0 Hz o 0 ms, of_meter fuori da 1 a 64 barre.

// 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

Ciò che cambia senza chiedere nulla al Suo codice: of_stop ora si spegne su il_fade_ms, come la documentazione prometteva (ue_stopped arriva sempre subito); alla scadenza di il_timeout_ms, solo il suono della chiamata sincrona è interrotto — lo sfondo, le sovrapposizioni e la coda continuano; of_crossfade verso una sorgente rifiutata conserva la traccia in corso; of_level vale 0 e of_spectrum non rende alcuna barra, a misuratore spento; of_equalizer(ab_on, ai_gains[]) riporta a 0 una banda che l'array non raggiunge; of_clear_queue dimentica anche i suoni che la coda ha già suonato; i messaggi di ue_failed seguono la lingua di visualizzazione (as_reason resta la parola da testare). Il lettore guadagna anche la coda navigabile (of_next, of_previous, of_queue_index, ue_source_changed, ib_queue_repeat), il ciclo senza interruzioni (ib_gapless_loop, REASON_TOO_LONG), il segmento (of_play_range), il muto (ib_muted) e il buffering (ue_buffering, of_is_buffering) — vedere la pagina del lettore di suoni.

La ricetta: nulla rifiuta di compilare — uno script di ue_started, ue_ended o ue_failed conserva i suoi argomenti, al_sound si aggiunge. Ricontrolli i test sul codice di ritorno di of_play_over e of_enqueue (un = 0 diventa > 0), e il codice che attendeva ue_failed per un indirizzo http:// o una sorgente vuota: ora verifica il -5 della chiamata.

12.15 toaster: il motivo di una chiusura, un toast chiuso dal codice si annuncia sempre #

Il toaster dice perché un toast si è chiuso: ue_toast_dismissed riceve un ultimo argomento, as_reason — REASON_TIMEOUT, REASON_USER (la sua croce), REASON_CODE (of_close, of_close_all) o REASON_OWNER_CLOSED (la sua finestra si è chiusa). E ogni toast chiuso dal codice lo annuncia, anche chiuso subito dopo of_show, prima di essere disegnato, o mentre attendeva il suo posto: un'applicazione che attendeva ue_toast_dismissed per liberare il proprio stato non dipende più da una corsa.

Cosa4.05.0
ue_toast_dismissed(long al_id, string as_key)(long al_id, string as_key, string as_reason), constants REASON_*
of_close di un toast non ancora disegnato, o in attesa di postonon veniva attivato nullaue_toast_dismissed, REASON_CODE
of_close di un toast di un altro toasterlo chiudeva, l'annuncio andava all'altro-5, nulla viene chiuso, of_get_last_error dice perché
la finestra di ipo_owner si chiudei suoi toast sparivano senza dire nullaue_toast_dismissed, REASON_OWNER_CLOSED
un toaster distrutto, toast a schermorestavano, mutii persistenti e quelli con pulsanti si chiudono con lui; gli altri finiscono da soli
of_show prima che il motore di visualizzazione sia pronto-6: « runtime mancante »-4: riprovare; of_get_last_error dice perché
angolo di un toast ancorato alla finestrala finestra intera: il toast copriva la barra del titolo e i suoi pulsantil'area client (quella della cornice in MDI)
un titolo molto lungospingeva la croce e i pulsanti fuori dalla finestralimitato, scorre
// 4.0
// event ue_toast_dismissed di inv_toaster : (long al_id, string as_key)
// 5.0 : lo stesso script, con il motivo
// event ue_toast_dismissed di inv_toaster : (long al_id, string as_key, string as_reason)

La ricetta: nulla rifiuta di compilare — uno script di ue_toast_dismissed conserva al_id e as_key, as_reason si aggiunge. Ricontrolli il codice che supponeva che un toast chiuso subito da of_close non avrebbe detto nulla: ora lo annuncia. I toast restano legati al toaster che li ha mostrati: un of_close sull'identificatore di un altro toaster restituisce -5. Il toaster guadagna anche of_close_all (chiudere tutti i suoi toast) e of_get_last_error — vedere la pagina del toaster.

12.16 video: un rifiuto reso subito, un film e i suoi sottotitoli in una chiamata, lo stesso film ripreso #

Il lettore video cambia cinque cose che il tuo codice può vedere. Un rifiuto è reso subito, come nel lettore di suoni (12.14): of_play(), of_play(source) e of_play_range rendono -5, il motivo in of_get_last_error(), per una sorgente vuota, un indirizzo http:// o un formato rifiutato dal nome (avi, wmv, flv) — e non sollevano più ue_failed; il film in corso continua. La proprietà is_source conserva il suo ue_failed: una proprietà non ha codice di ritorno. Lo stesso film non viene ricaricato: of_play(source) o is_source sul film già caricato lo riprende da dov'è (ue_resumed) invece di farlo ripartire dall'inizio; of_seek(0) lo fa ripartire. Una ricerca resta nel segmento di of_play_range, quella dell'utente come of_seek: Inizio porta all'inizio del segmento, un clic oltre la sua fine alla sua fine — prima, Inizio usciva dall'estratto e un clic oltre fermava il film. Una voce di playlist che non può essere riprodotta solleva prima ue_source_changed, poi un solo ue_failed — arrivava prima, e due volte. of_stop diventa una funzione: non rendeva nulla (subroutine), rende 0, o -2 quando il componente non è creato — come of_stop del browser 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

Ciò che cambia senza chiedere nulla al tuo codice: un marcatore raggiunto da una ricerca IN PAUSA non solleva più ue_marker_reached (solo ue_seeked); Spazio e il pulsante Riproduci di un lettore senza film non fanno più nulla (sollevavano ue_failed(REASON_NO_SOURCE)); la lingua dei sottotitoli scelta dall'utente segue al film successivo della playlist; una locandina http:// è rifiutata e is_poster si rilegge vuota; un is_subtitles rifiutato si rilegge vuoto; un file di sottotitoli della postazione introvabile solleva ue_subtitles_failed(REASON_NOT_FOUND); il menu della velocità si usa da tastiera e le sue frecce non cambiano più il volume; a schermo intero la barra si mostra da tastiera; la posizione ricordata (ib_remember_position) non dipende più da come è scritto il percorso, e sono conservati solo gli ultimi 200 film (una posizione della 4.0 viene riletta una volta). Il lettore guadagna of_play(source, subtitles) (il film e i SUOI sottotitoli: impostati prima di un secondo film, se ne andavano con il primo), ib_forward_seek, of_watched_ms, of_watched_percent, ue_watched_completely e ib_skip_failed — vedi la pagina del lettore video.

La ricetta: nulla rifiuta di compilare. Rileggi il codice che attendeva ue_failed dopo of_play per un indirizzo http://, una sorgente vuota o un .avi: ora verifica il -5 della chiamata. Rileggi anche un pulsante « Riproduci » che contava su of_play(source) per ripartire dall'inizio: aggiungi of_seek(0).

12.17 webbrowser: un gesto dell'utente viene chiesto, una pagina di of_show_html non ha indirizzo #

Con ib_veto_navigation = true, ue_navigating viene ora chiesto anche per un gesto dell'utente: un indirizzo digitato nella barra, Apri collegamento del menu contestuale, una nuova finestra aperta da un clic. Nella 4.0 questi tre percorsi non chiedevano nulla. Solo un indirizzo impostato dal Suo codice non viene mai chiesto, e nemmeno un reindirizzamento del server: per un elenco di server che valga anche per i reindirizzamenti, imposti la nuova proprietà is_allowed_hosts.

Cosa4.05.0
ue_navigating con il veto: indirizzo digitato, Apri collegamento, nuova finestrala pagina si apriva senza domandala domanda viene posta; false mantiene la pagina
is_address, la barra, ue_load_completed dopo of_show_htmll'intera pagina codificata (data:text/html;charset=utf-8,…, fino a 2 MB)""
is_title di una pagina senza <title>il suo indirizzo""
of_go_back, of_go_forward, of_stopsenza valore di ritornolong: 0 una volta richiesto, -2 componente non creato
ib_private cambiato dopo una paginais_address, is_title, la barra e le frecce mantenevano la pagina precedentetutto si rilegge vuoto: la vista è nuova
Invio su una barra degli indirizzi vuotala pagina diventava biancanulla
Una pagina del sito si carica, barra degli indirizzi visibileRicarica resta RicaricaRicarica diventa Interrompi, e torna una volta caricata la pagina

La ricetta: nulla rifiuta di compilare, un long ignorato compila. Uno script di ue_navigating scritto per i collegamenti del sito vede ora anche gli indirizzi digitati dall'utente: se decide in base all'indirizzo, confronti il suo host, come l'esempio della pagina del componente — oppure affidi l'elenco a is_allowed_hosts. Il codice che leggeva as_url di ue_load_completed, o is_address, dopo of_show_html riceve una stringa vuota.

12.18 toolbar: il clic destro porta il suo punto, un ordine del codice si annuncia #

La barra degli strumenti si allinea alla libreria: il clic destro di uno strumento dà il suo punto dello schermo, come quello degli alberi, delle griglie e della scheda, e spostare una barra con ii_band / ii_index scatena ue_bar_reordered come il gesto. Due aggiunte rifiutano ciò che accettavano in silenzio, e una scorciatoia posta dove nulla vive non viene più registrata. Guadagna anche is_text su una barra, un nome per ogni strumento e ogni campo letto da un lettore di schermo, e una tastiera che attraversa i campi — vedere la pagina della barra degli strumenti.

Cosa4.05.0
ue_item_rclicked(string as_keys)(string as_keys, long al_x, long al_y): il punto in pixel dello schermo; il tasto Menu e Maiusc+F10 lo scatenano anch'essi, all'angolo in basso a sinistra dello strumento, e così il clic destro di un campo
ii_band / ii_index che spostano una barraue_layout_changedue_bar_reordered, ue_layout_changed
of_add_datepicker con una data che non è aaaa-mm-gg ("31/12/2026")0, la data mostrata così com'era-5, non viene aggiunto nulla
of_add_menu_separator su una voce senza sottovoci0: la voce diventava grigia e non si sceglieva più-5
is_shortcut o of_register_shortcut su un indirizzo dove nulla vive, una voce con cascata o la scelta di un elencoregistrata: il tasto veniva preso in tutta la finestranulla di registrato; of_register_shortcut restituisce -5, of_get_last_error dice perché
Ctrl+A, Ctrl+C, Ctrl+V, Ctrl+X, Ctrl+Z, Ctrl+Y in un campo della barrapartiva lo strumento che portava la scorciatoiail campo modifica il suo testo
is_text di un selettore di dataconservato e riletto, mai mostratoignorato, rilegge ""
// 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)

La ricetta: nulla rifiuta di compilare — uno script di ue_item_rclicked conserva as_keys. Aprite il vostro menu al punto al_x, al_y (passatelo a of_show di un contextmenu). Verificate che uno script di ue_bar_reordered accetti anche gli spostamenti fatti dal vostro codice, testate il codice di ritorno di of_add_datepicker se la data viene da un campo regionale, e impostate is_shortcut dopo l'aggiunta dello strumento o della voce.

12.19 Il clic destro di un elemento porta il suo punto: buttonbar, breadcrumb, chartcartesian, statusbar #

Una sola regola per ogni clic destro su un elemento della libreria: l'evento riceve la chiave (o l'indirizzo) dell'elemento, poi al_x, al_y, il punto dove aprire un menu, in pixel dello schermo — il puntatore, o, da tastiera (tasto Menu, Maiusc+F10), l'angolo in basso a sinistra dell'elemento (in basso a destra in una lettura da destra a sinistra; il centro di una forma che non è un rettangolo: un punto di un grafico). Un contextmenu della libreria vi si apre così com'è: uo_menu.of_show(al_x, al_y). Tre eventi che non lo portavano lo ricevono; la barra di stato moltiplicava il suo per la scala dello schermo, e un menu aperto in quel punto finiva lontano dal puntatore su uno schermo al 125 % o al 150 %.

Cosa4.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 di ue_panel_rclickedmoltiplicati per la scala dello schermoil punto come lo legge la pagina, come ogni clic destro
// 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)

La ricetta: nulla rifiuta di compilare — uno script di questi eventi conserva i suoi argomenti. Aprite il vostro menu al punto al_x, al_y (passatelo a of_show di un contextmenu); un menu PowerBuilder conserva PopMenu(PointerX(), PointerY()) della vostra finestra. Uno script che correggeva da sé la scala delle coordinate di ue_panel_rclicked non deve più farlo.

12.20 La base: l'errore di un componente è il suo, ogni verbo restituisce un codice #

Cinque cambiamenti toccano tutta la libreria, o tutta una famiglia di componenti. Uno solo rifiuta di compilare: is_last_error di un componente non visuale, diventato of_get_last_error().

Cosa4.05.0
of_get_last_error() di un componente visualel'ultimo messaggio della DLL, uno solo per tutto il processo — spesso quello di un altro componenteciò che è successo a questo componente: un nome rifiutato, o una chiamata di questo componente alla DLL, il cui motivo è letto nel momento del fallimento; altrimenti vuoto
Il motivo del fallimento di un componente non visuale (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 dei componenti non visuali (commandpalette, crypto, messagebox, restclient, soundplayer, speechout, toaster, xml)senza valore restituitoun long, 0 una volta fatto — come i componenti visuali
of_set_property("tooltip", …) e super_tooltip_* su un componente senza tooltip (webbrowser, pdfviewer, radialmenu, progressbar)impostava un tooltip che la documentazione dice inesistente-5, e of_get_last_error() dice perché
La scorciatoia di un menu PowerBuilder ripreso (of_load_menu di menubar e commandpalette)Ctrl++, PageUp, Insert (menubar); niente oltre F12 (palette)una sola scrittura, quella del contextmenu: Ctrl+Plus, PgUp, Ins, da F13 a F24, da 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()

La ricetta: il compilatore mostra ogni .is_last_error da sostituire con .of_get_last_error(). Una chiamata a of_stop, of_close o of_reset scritta come istruzione compila sempre. Uno script che leggeva of_get_last_error() di un componente per conoscere il fallimento di un'altra chiamata (un export della DLL chiamato direttamente, un altro componente) legge ora il motivo di quel componente, o niente: chiedetelo a chi è fallito.

Aggiunto, niente da rifare: is_accessible_name e is_accessible_description su tutti i componenti visuali — il nome e la descrizione che dice un lettore di schermo (3.4); of_from_datastore di un DataWindow o di un DataWindowChild su crosstab e datagrid, come sugli altri componenti legati ai dati; la forma completa di of_insert_command (commandpalette), che prende la spiegazione, la combinazione e le parole chiave come of_add_command, con una posizione in long.


← Migrare dalla 3.0 alla 4.0 · Sommario · Note di versione →