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.
| Cosa | 4.0 | 5.0 |
|---|---|---|
| Mostrare la lettura | uo.ib_label = true | uo.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 valore | uo.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 nome | of_set_property("label", …), ("label_format", …), ("color", …) | ("show_value", …), ("format", …), ("unit", …), ("value_color", …) |
is_formatè un formato di visualizzazione PowerBuilder applicato al valore ("#,##0","$#,##0.00"), con i separatori della lingua di visualizzazione, esattamente come per gli indicatori. Vuoto, la barra mostra la percentuale, come prima.- I segnaposto
{percent},{value},{min}e{max}non esistono più. Un'etichetta che mescolava valore e percentuale ("{value} of {max} rows ({percent})") non ha un equivalente esatto: scelga il valore (formato e unità) o la percentuale (e un'unità). Il massimo, che il Suo codice conosce, si scrive nell'unità. is_unitè nuovo: un testo semplice scritto dopo la lettura, separato da uno spazio — dopo il valore come dopo la percentuale.of_resetlo svuota.- Una maschera che contiene
%scrive la parte compiuta, non il valore:is_format = "0.0%"dà «35.0%» per 1.687 righe su 4.820, arrotondata per difetto come la percentuale — la percentuale con decimali che{percent}non sapeva scrivere. - Un'attesa in pausa o in errore diventa una barra piena. Nella 4.0, una barra di attesa (
ib_indeterminate) che ricevevaSTATE_PAUSEDoSTATE_ERRORsi bloccava nel suo scorrimento, spesso fuori dalla traccia: l'errore non si vedeva. Nella 5.0 si ferma come barra (anello) piena del colore dello stato, come la barra delle applicazioni di Windows, e il lettore di schermo non la annuncia più occupata ma ne dice lo stato. of_set_property("tooltip", …)esuper_tooltip_*restituiscono-5: la barra non espone tooltip, e la porta per nome, che ne impostava uno, è chiusa come le proprietà.- Novità, senza nulla da riprendere:
is_orientation(ORIENTATION_VERTICAL: una barra verticale, al posto di unaVProgressBar),is_accessible_name(il nome che dice il lettore di schermo) e il testo di un'attesa (solois_unitmentre la barra è in attesa).
// 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.
| Cosa | 4.0 | 5.0 |
|---|---|---|
L'editor di una cella mostrata $1,234.50 | si apriva sul numero nudo 1234.5; ogni carattere era accettato | si 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 numerico | non raggruppato in alcune lingue (1234 in spagnolo) | raggruppato in tutte le lingue (1.234 in spagnolo) |
| Un negativo arrotondato a zero | -0 | 0 |
| Aprire e chiudere l'editor senza digitare | poteva cambiare un valore che il formato arrotonda | non cambia nulla |
Una cella di valutazione (rating) letta da un lettore di schermo | cinque segni di stella | 4 / 5 |
// 5.0 : the input mask of a numeric column - the cell still receives the bare number
uo_grid.of_column(/*key*/ "revenue").is_mask = "#,##0.00"
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.
| Cosa | 4.0 | 5.0 |
|---|---|---|
| Il formato del grafico | uo.of_set_value_format(0, "$", "", true) | uo.is_format = "$#,##0" |
| Il formato di un asse | uo.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) |
- Il formato di un asse prevale su quello del grafico, e lo mantiene. Impostare il formato del grafico non cancella più quello degli assi (la forma di
of_set_value_formatsenza asse lo faceva): un asse torna al formato del grafico conis_format = "". - Senza formato (vuoto, o un formato non numerico), il numero si scrive così com'è, al millesimo, con il separatore decimale della lingua di visualizzazione — come faceva il formato predefinito.
// 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 #
| Cosa | 4.0 | 5.0 | ||
|---|---|---|---|---|
Menu nativi di un componente che ha un accento proprio (il_theme_accent) | l'accento si vedeva solo nella casella di una voce selezionata | anche 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 focus | cliccavano quel pulsante | vanno 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 MDI | Invio (Esc) andava al pulsante predefinito di un altro foglio | il tasto resta nel suo foglio: lo riceve il campo, o il CommandButton PB predefinito | ||
breadcrumb: ii_max_visible impostato | un numero esatto di segmenti in OVERFLOW_COLLAPSE (la larghezza non ripiegava più nulla), ignorato in OVERFLOW_SCROLL e OVERFLOW_SHRINK | un 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 vuoto | una riga vuota nel menu | la chiave del ramo, come of_add_children | ||
breadcrumb: Ctrl+S, F5 e le altre scorciatoie della finestra durante la digitazione del percorso | non partivano | partono, come da un SingleLineEdit; Invio ed Esc restano al campo | ||
breadcrumb: ue_children_needed che non restituisce mai il controllo | nessun chevron si apriva più fino al prossimo of_reset | un 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 testo | una 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 calore | la 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_series | le serie seguenti cambiavano colore; il tooltip della serie rimossa vestiva la serie successiva con la stessa chiave | ogni 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_animated | l'intero grafico ricadeva sull'asse e risaliva a ogni aggiunta, finché la finestra non era piena | sale 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 valori | le due pile si sovrapponevano | affiancate nella categoria | ||
chartcartesian: un tag di markup in una categoria o un'etichetta di valore | scritta così com'è sull'asse, interpretata nel pannello | testo ovunque: il tag è tolto (l'asse, il pannello, #x#, #label#) | ||
chartcartesian: Esc senza nulla di aperto, Invio su un buco | trattenuti dal grafico | vanno alla finestra: il suo pulsante Annulla, il suo pulsante predefinito | ||
codeeditor: Ctrl+Tab o Alt+Tab nell'editor | facevano rientrare il codice: la tastiera non usciva più dall'editor | vanno 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 valida | restituiva 0 | restituisce -5, come of_replace | ||
codeeditor: un nuovo is_text durante una ricerca | la barra restava aperta e sollevava ue_find_result | la 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_text | mostrato #region; la copia restituiva la visualizzazione, senza le righe delle regioni chiuse | mostrato 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 sopra | restavano sullo stesso numero di riga | seguono la loro riga; una riga eliminata porta via i suoi indicatori | ||
codeeditor: il cursore dopo «Sostituisci tutto» (of_replace_all) | sull'ultima sostituzione | resta dov'era, spostato di quanto inserito prima | ||
codeeditor: Ctrl+Z, Ctrl+Y | la cronologia del browser, persa quando il testo veniva scritto con il focus altrove | la 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 0 | accettato, 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 bit | promesso 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'URI | scritto in base32 maiuscolo, senza spazi né =; un altro carattere: "" e of_get_last_error() | ||
crypto: un argomento NULL | is_last_error poteva tornare NULL | vale 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 migliore | spareggia soltanto risultati che corrispondono più o meno allo stesso modo | ||
commandpalette: un comando senza gruppo (as_group = "") dichiarato tra due gruppi | elencato sotto l'intestazione del gruppo dichiarato prima | in testa all'elenco, senza intestazione | ||
commandpalette: Home / Fine nel campo che contiene testo, Maiusc+Home | spostavano la selezione nell'elenco; Maiusc+Home non selezionava nulla | spostano il cursore nel campo; Ctrl+Home / Ctrl+Fine raggiungono l'elenco; Maiusc seleziona nel campo | ||
commandpalette: un clic destro o centrale su una riga | lanciava il comando | non fa nulla | ||
commandpalette: of_command su una chiave che nessun comando porta | ib_enabled / ib_visible si rileggevano true, una scrittura andava persa in silenzio | si rileggono false; una scrittura va persa e of_get_last_error lo dice | ||
commandpalette: un secondo oggetto palette che aveva ripreso una combinazione viene distrutto | il tasto non rispondeva più a nessuno finché il primo non lo registrava di nuovo | la 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 lungo | ripulito, tagliato al limite e restituito pulito a is_recent all'apertura | ||
dockcontainer: costruire il dock, ripristinare una disposizione | ue_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 scheda | nulla 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 pila | tornava dietro la scheda attiva | passa 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 pila | restituisce -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 esso | ib_pinned cambiava senza evento | ue_panel_pinned segue | ||
dockcontainer: un clic senza spostamento su un separatore | sollevava ue_layout_changed | non solleva nulla: nulla è cambiato | ||
dockcontainer: of_keys_at con chiavi numeriche | prima le chiavi intere (2, 10, zeta) | l'ordine di aggiunta (zeta, 10, 2) | ||
dockcontainer distrutto in esecuzione (CloseUserObject) | i suoi controlli tornavano sulla finestra, nascosti | ritrovano la visibilità che avevano prima di of_add_panel | ||
dockcontainer: of_add_panel di un controllo che CONTIENE il dock | le finestre si chiudevano ad anello | restituisce -5, il controllo resta dov'era | ||
crosstab: AGG_COUNT | contava le righe | conta 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 vuota | 0 | una 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 area | classificati su tutta la tabella | classificati 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 Colonne | una colonna di totale che raddoppiava l'unica colonna (`Nord | 650 | 650`) | niente più colonna di totale; ib_col_grand_total conserva il suo valore |
crosstab: più misure e campi in Colonne | una colonna Totale per misura, senza nome di misura, e non ordinabile | un'intestazione « Totale » poi un'intestazione per misura, ordinabile | ||
crosstab: ue_layout_changed | attivato dai gesti dell'utente, e solo da is_thousands e of_remove_field | attivato 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 lingue | scritta come la scrive la lingua di visualizzazione: 57.9% in inglese, 57,9 % in francese | ||
crosstab: il filtro di etichetta | proposto 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 date | 0, 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 1 | riportati 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 righe | una 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 colonna | gli spazi di riempimento restavano nel membro; il Format era ignorato | gli 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 rimuove | restava 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 trascinarla | sollevavano ue_layout_changed | non sollevano nulla: nulla è cambiato | ||
datagrid: modifiche del layout tra of_set_redraw(false) e of_set_redraw(true) | un ue_layout_changed per modifica | uno 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 creato | accettati e riletti così com'erano, senza effetto; 0 | of_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 modificata | il segno «modificata» restava | se 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 DataStore | il <select> e il campo data del motore; un'ora era testo | l'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 codici | cercava il testo «> 3»: nessuna riga | confronta il dato (il numero, il codice) | ||
datagrid: un albero sotto una ricerca; una riga il cui padre non è nella griglia | il figlio trovato restava nascosto; la riga non appariva mai | i 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 CHAR | la griglia restava sugli scheletri; la riga era rifiutata (-5); manteneva il suo riempimento di spazi | la sorgente viene lasciata; la chiave segue il RowID più grande; rifilato | ||
datagrid: of_export_xlsx | le date erano scritte come testo; nessun tetto | vere 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 annullamento | chiudevano la finestra e restituivano 0 — anche of_info, che prometteva 1 | come 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_password | tutto veniva cancellato in silenzio: la password di of_prompt appariva in chiaro | la 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 finestra | of_get_last_error, of_checked, of_action e of_input_value parlavano ancora della vecchia finestra | sono azzerati | ||
messagebox: un campo obbligatorio riempito di spazi | accettato | vuoto: 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 scelta | la zona non faceva nulla; il collegamento apriva il browser E sceglieva; Alt+lettera rispondeva con il primo pulsante | la 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+C | perdeva la & di &&, copiava i tag di un pulsante, ignorava l'immissione | le 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 finestra | sono scomparse: il_accent colora la finestra | ||
json e jsontree: un livello di percorso che contiene ~0 o ~1 | letto 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 assente | un 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, 1 | 0: 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'ultima | il 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 livelli | un altro documento, tagliato a 512 livelli | un testo vuoto | ||
jsontree: clic su una chiave che contiene /, una chiave vuota, o sotto una chiave doppia | un percorso che leggeva un ALTRO valore in n_pbt_json | x~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 mouse | il nodo intero | il pezzo evidenziato | ||
jsontree: un testo JSON che inizia con un BOM | rifiutato (ue_error) | mostrato, come lo legge n_pbt_json; is_json si rilegge com'è stato posto | ||
jsontree: il messaggio di ue_error in inglese | Invalid JSON : … | Invalid JSON: … (ogni lingua mantiene la sua punteggiatura); 01, 1., 1e dicono Bad number | ||
jsontree: of_expand_path durante una ricerca | ripiegato al passo successivo della ricerca, senza ue_node_toggled | resta aperto, con i blocchi aperti sopra di lui | ||
jsontree: Spazio su un valore selezionato | faceva scorrere l'albero di una pagina | non 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 -5 | una 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 tagliati | Hello , again: spariscono solo gli a capo di impaginazione | ||
xmltree: of_select_path di un XPath il cui primo nodo è uno spazio di impaginazione (//text()) | -5 | viene 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 mouse | l'XML del nodo intero | il pezzo evidenziato | ||
xmltree: il messaggio di ue_error in inglese | Invalid XML : … | Invalid XML: … (ogni lingua mantiene la sua punteggiatura) | ||
xmltree: of_expand_path durante una ricerca | ripiegato al passo successivo della ricerca, senza ue_node_toggled | resta aperto, con gli elementi aperti sopra di lui | ||
xmltree: Spazio su una foglia selezionata | faceva scorrere l'albero di una pagina | non 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 sbagliata | ue_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 tooltip | il codice, il documento, la barra multifunzione (la sua dimensione del tema) e molti testi secondari mantenevano la loro dimensione | seguono 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 rete | caricata | rifiutata, 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_refresh | la vista tornava in cima | la posizione di lettura è mantenuta; un nuovo is_source parte sempre dalla cima | ||
markdownview: of_toc, of_scroll_to e una ricerca subito dopo is_source | agivano sul documento precedente | il 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 sinistra | cambiava lato | mantiene il suo lato; solo l'allineamento predefinito segue il verso | ||
markdownview: ue_load_failed per un testo impostato da is_markdown | mai sollevato | sollevato (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 menu | lancia 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 comunque | non 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 Esc | Esc andava anche alla finestra: il suo pulsante Annulla | Esc 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 nulla | la prima voce è evidenziata, Invio la sceglie | ||
menubar: Alt quando la barra ha già il focus | la modalità menu cambiava alla pressione: Alt+Maiusc (layout di tastiera) la accendeva | al rilascio di un Alt da solo, come Windows | ||
menubar: un clic su un titolo disattivato o sulla parte vuota della barra | la barra teneva la tastiera, il campo in modifica la perdeva | la tastiera resta al controllo in cui si scriveva | ||
menubar: is_shortcut su un indirizzo che non designa alcuna voce | il tasto era preso in tutta la finestra, anche dopo of_clear | non viene armato nulla: impostatelo dopo of_add_item | ||
pdfviewer: ib_allow_save / ib_allow_print di un visualizzatore | valevano per tutti i visualizzatori dell'applicazione; un of_reset altrove ridava Salva a un documento riservato | ogni visualizzatore mantiene la propria impostazione | ||
pdfviewer: ib_allow_save / ib_allow_print impostati prima di is_source | tre caricamenti, tre ue_load_completed; un documento in errore veniva ritentato a ogni modifica | un solo caricamento; un documento in errore non viene ritentato | ||
pdfviewer: ii_page impostato mentre un documento è visualizzato, poi un altro is_source | il documento successivo si apriva a quella pagina | la 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_completed | non fa nulla | ||
pdfviewer: ii_zoom fuori da 25-500 | passato così com'è al lettore | ricondotto a 25-500, riletto come applicato | ||
pdfviewer: un indirizzo https://nome:segreto@…; una sorgente fatta di spazi | passato al lettore, che lo rifiutava con un motivo approssimativo, il segreto tornava negli eventi; riletta così com'è, of_refresh restituiva 0 | rifiutato 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 cornice | la rotellina, + e id_zoom salivano fino alla dimensione reale | si fermano al tetto; solo il tasto 1 va oltre | ||
picture: una nuova is_source, o ib_zoomable = false, su un'immagine ingrandita | lo zoom tornava a 1.0 senza dire nulla | viene 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_UNSUPPORTED | visualizzato; is_source si rilegge come scritto | ||
picture: i tasti dello zoom con Ctrl, Alt o Windows premuto | Ctrl++ ingrandiva, Alt+1 mostrava la dimensione reale | lasciati 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 origine | ue_loaded e una cornice vuota | ue_error con REASON_FAILED, il messaggio dice perché | ||
radialmenu: is_tooltip, is_super_tooltip_title, is_super_tooltip_text, is_super_tooltip_image | esistevano, non mostravano mai nulla: il lanciatore non ha superficie | rimosse: il compilatore mostra la riga, cancellatela | ||
radialmenu: of_close, un secondo of_show, of_clear o of_reset mentre una ruota è aperta | ue_dismissed arrivava quando la ruota lasciava lo schermo; of_is_open restava vero fino ad allora | ue_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") | -5 | risolta 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 è aperta | ue_dismissed, e la vecchia ruota restava sullo schermo | anche la vecchia ruota si chiude: un ue_dismissed per ogni apertura | ||
radialmenu: il_back_color_hover di un ramo senza il_text_color_hover | l'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 host | le credenziali Windows e il certificato seguivano il reindirizzamento | solo 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 -5 | rifiutato 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 GET | conservava il Content-Type del corpo di partenza | parte senza Content-Type | ||
restclient: ue_progress | sollevato 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 valore | tutti, uniti da , — Set-Cookie da un a capo | ||
restclient: lo User-Agent inviato | PBToolboxAI/4.0, scritto nel codice | la versione della libreria; of_set_header("User-Agent", …) lo sostituisce ancora | ||
restclient: una richiesta quando il client HTTP non ha potuto essere creato | partiva 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_basic | partivano entrambe le autenticazioni | una 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 focus | il campo manteneva il vecchio testo; lasciandolo partiva ue_combo_changed / ue_value_changed con il vecchio valore, che sostituiva il Suo | il 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 barra | ogni piccolo movimento di un touchpad cambiava scheda; una barra ridotta cambiava scheda anch'essa, senza mostrare nulla | una 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 incoerenti | accettati: frecce morte o invertite, un valore fuori intervallo mostrato | of_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 tastiera | rifiutato: 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 tasti | torna alle lettere delle schede, come in Office; un secondo Esc chiude | ||
speechout: of_speak_from(0) o un numero negativo | leggeva 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 limite | si rileggono come applicati (400) | ||
speechout: un pezzo [rate]…[/rate] in una frase | una 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 cambiava | la regola riscrive solo il testo tra i tag | ||
speechout: una postazione senza alcuna voce | ue_error, poi una lettura «in corso»: ue_started, ogni ue_sentence, ue_stopped; of_speak_sync rendeva 0 | ue_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 lettura | nessun 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 lettura | nessun 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 frase | resta 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 tooltip | il tooltip non appariva mai | appare, 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 viste | le voci della sua lista, separatori esclusi | ||
statusbar: una posizione in una lista a discesa (of_insert_menu_item, of_move_menu_item) | contava i separatori | conta solo le voci, come le posizioni dei pannelli | ||
statusbar: una chiave di pannello o di voce che comincia con __ | accettata | rifiutata, -5: è riservata al componente | ||
statusbar: is_tooltip e i cinque colori su una voce di lista (of_menu_item) | conservati e riletti, senza effetto | ignorati, 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 finestra | ridimensionava la cornice, dal suo angolo | ridimensiona 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 focus | niente | ue_panel_rclicked, all'angolo in basso a sinistra del pannello | ||
stepbar: Invio o Spazio su un passaggio, in una finestra che ha un pulsante predefinito | ue_step_clicked e il pulsante predefinito («Avanti») scattava | solo ue_step_clicked: il tasto resta alla barra | ||
stepbar: of_clear_steps mentre la barra si trova su un passaggio | non sollevava nulla | ue_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 muto | nulla 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_changed | la barra resta «tutto terminato», nulla viene sollevato | ||
stepbar: NAV_VISITED, un passaggio inserito o spostato davanti a quello in corso | cliccabile | mostrato completato, ma non cliccabile: non è mai stato raggiunto | ||
stepbar: un passaggio con avviso (STATE_WARNING) | un indicatore ambra | un 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 colorato | i suoi colori sono mantenuti e attenuati; sulla superficie del tema, il grigio del tema, come prima | ||
statictext: PBT_SetDefaultFont con una dimensione | la dimensione restava a 11 pt | la dimensione data si applica (11 pt senza di essa, invariato) | ||
statictext: ii_font_size fuori da 6 a 200 | applicata così com'era | riportata al limite più vicino, come il tag [size], e riletta come applicata | ||
statictext: doppio clic su una parola con ib_selectable | un solo ue_clicked prima di ue_double_clicked | due 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 tagliato | niente | ue_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 svuotato | manteneva la larghezza del testo precedente | si 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'XPath | rendevano 0, come una ricerca senza risultato | rendono -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 vuoto | vuoto senza motivo, 0 («fatto»), 0 | vuoto 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 CR | scritto così com'era: il documento non si ricaricava più, il CR tornava LF | il carattere vietato è rimosso, come fa il builder; il CR si scrive e si rilegge | ||
xml: builder — un secondo elemento in cima, un testo senza elemento aperto, un attributo dopo un figlio | scritto (due radici) o ignorato senza una parola | lasciato 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; vuoto | vuoto 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.
| Oggetto | Aggiunto |
|---|---|
| progressbar | is_unit: un testo scritto dopo la lettura ("of 500 rows", "MB") |
| datagrid | is_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 |
| datagrid | la 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 |
| ribbon | is_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 |
| breadcrumb | la 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) |
| chartcartesian | of_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 |
| codeeditor | of_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) |
| crypto | i 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 |
| buttonbar | is_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 |
| commandpalette | of_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() |
| dockcontainer | ib_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) |
| crosstab | of_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 |
| messagebox | of_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) |
| jsontree | of_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 &) |
| xmltree | of_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 &) |
| json | of_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 |
| listbar | ue_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) |
| markdownview | is_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 |
| menubar | of_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 |
| pdfviewer | of_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) |
| picture | of_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 |
| radialmenu | of_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) |
| restclient | of_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 |
| statusbar | ib_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 |
| tilesbox | of_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 |
| statictext | ib_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 |
| xml | of_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) |
| xml | overload 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.
| Cosa | 4.0 | 5.0 |
|---|---|---|
| Aggiungere un pulsante | uo.of_add_button("save", "img\save.png", "Save") | uo.of_add_button("save", "&Save", "img\save.png") |
| Un pulsante di solo testo | uo.of_add_button("ok", "", "OK") | uo.of_add_button("ok", "OK") |
| Inserire un pulsante | uo.of_insert_button("mid", 2, "", "Mid") | uo.of_insert_button("mid", "Mid", "", 2) |
| La lettera Alt di un pulsante | is_shortcut ← "S" (Alt+S) | l'etichetta "&Save", oppure uo.of_button("save").is_mnemonic = "S" |
| Una combinazione su un pulsante | uo.of_register_shortcut("Ctrl+S", "save") | lo stesso, oppure uo.of_button("save").is_shortcut = "Ctrl+S" — mostrato nel tooltip |
| Una « & » in un'etichetta | mostrata così com'è | segna la lettera Alt; && per una « & » scritta |
| Il badge | uo.of_button("inbox").il_badge = 3 | uo.of_button("inbox").is_badge = "3" (un testo: "New", "!"); il_badge resta accettato |
Il pulsante con il focus, senza is_default | dipinto con l'accento pieno | solo il suo anello di focus |
is_shortcutdi un pulsante è una combinazione. Durante la 5.0, una lettera da sola vi è ancora letta come la lettera Alt della 4.0 (passa inis_mnemonic); scriva piuttosto la « & » nell'etichetta. Una combinazione che la finestra non può mai sollevare (una lettera da sola,Ctrl+Shift) è rifiutata:is_shortcutsi rilegge vuoto,of_register_shortcutrestituisce-5.- Un pulsante disabilitato non ruba più un tasto. Il pulsante predefinito disabilitato di una barra, o la lettera Alt di un pulsante disabilitato, lascia Invio e la lettera alla finestra — non vanno più al pulsante di UN'ALTRA barra (due fogli MDI); la combinazione di un pulsante disabilitato lascia il suo tasto alla finestra (un acceleratore di menu, per esempio). Le frecce saltano un pulsante disabilitato.
// 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.
| Cosa | 4.0 | 5.0 |
|---|---|---|
| Il formato di tutti i valori di un campo | uo.of_set_value_format("amount", 2, "locale", "$", true) | uo.of_field("amount").is_format = "$#,##0.00" |
| Un simbolo dopo il numero | uo.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 rosso | solo il menu del chip | uo.of_value(1).ib_negative_red = true |
| Tornare al formato predefinito | uo.of_clear_value_format("amount") | uo.of_field("amount").is_format = "" (il Format della colonna del DataWindow) |
- Il separatore delle migliaia di un valore senza formato resta
is_thousands, come il menu Opzioni della griglia: è ciò che faceva unof_set_value_formatcon separatore vuoto. La valuta che propone il menu del chip restais_currency_symbol. - Un valore senza formato mostra ora il Format della sua colonna del DataWindow, letto da
of_from_datastore: un importo la cui colonna porta#,##0.00si mostra con due decimali senza una riga di codice.
// 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).
| Cosa | 4.0 | 5.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 disposizione | nessun evento | un ue_layout_changed (mai ue_section_toggled) |
of_move_item / of_move_section al rango già occupato | ue_layout_changed | nulla: nulla si è mosso |
of_select_item di una voce disattivata | 0, diventava la selezione | -5, senza porre ue_selection_changing; disattivare la voce già selezionata la mantiene |
ib_auto_width letto mentre la barra è compressa | true | ciò che l'applicazione ha impostato |
of_item di un indirizzo a un solo livello ("nav") | raggiungeva la sezione | un handle che non nomina nulla; una sezione si raggiunge con of_section |
| La stessa lettera digitata due volte | un prefisso dd, spesso senza corrispondenze | la riga successiva che inizia con essa; uno Spazio a metà di un prefisso gli appartiene |
| Una voce disattivata sotto il puntatore | senza tooltip | il 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.
| Cosa | 4.0 | 5.0 |
|---|---|---|
ue_appointment_changing | (string as_key, string as_start, string as_end, string as_resource) | (string as_key, string as_kind, string as_start, string as_end, string as_resource): as_kind vale CHANGE_MOVE 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 selezionato | nessun evento | ue_selection_changed(""); of_reset resta muto |
of_add_appointment la cui fine precede l'inizio | 0, 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_KEY | 0, due appuntamenti con la stessa chiave | -5: una chiave cambia ricaricando |
of_show_appointment di un appuntamento nascosto, filtrato o su una risorsa nascosta | 0, la vista partiva verso un giorno in cui nulla si vedeva | -5, nulla si muove |
is_now impostato dopo una navigazione dell'utente | riportava la vista al suo giorno | la vista resta dove l'utente è andato |
of_clear_appointments | teneva le colonne del DataStore per of_map | dimentica 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.
| Cosa | 4.0 | 5.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_found | una 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_selected | nulla |
| Un ramo che l'albero chiude da sé (tornato vuoto, rifiutato dalla shell) | nessun evento | ue_collapsed |
ib_show_files, ib_show_hidden, is_file_filter, is_root scritti con il loro valore | l'albero viene riletto | nulla viene riletto; is_file_filter impostato senza i file li aspetta |
of_collapse di un percorso disegnato due volte | ogni riga, un ue_collapsed ciascuna | la 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).
| Cosa | 4.0 | 5.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_tile | integer ai_index | long 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 posto | nulla | ue_tile_moved, ue_layout_changed |
ib_collapsed di un gruppo impostato dal codice | ue_group_toggled | ue_group_toggled, ue_layout_changed |
is_size impostato dal codice | nulla | ue_layout_changed (mai ue_tile_resized, che dice che l'utente l'ha scelta) |
is_size di una dimensione sconosciuta ("huge") | il riquadro diventava medium | rifiutato: 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 riquadri | non 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 disposizione | nessun evento | un ue_layout_changed; -5 su un JSON che non è una disposizione ({}) |
of_tile / of_group di un indirizzo che non nomina nulla | un handle per chiamata, conservato | l'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.
| Cosa | 4.0 | 5.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 disposizione | nessun evento | ue_layout_changed, una volta |
un trascinamento riportato al suo posto, of_move_page al proprio posto | ue_tab_reordered e ue_layout_changed | nulla: l'ordine non è cambiato |
più spostamenti sotto of_set_redraw(false) | un ue_layout_changed per spostamento | uno solo, alla ripresa |
| Maiusc+F10 su una scheda, menu integrato | il menu si apriva sotto il mouse | sotto la scheda |
| banda verticale e titolo lungo | la banda prendeva la larghezza del titolo | al massimo il 40 % del componente, puntini di sospensione; ii_strip_width la fissa |
il_accent di una pagina | solo l'anello di focus | sottolinea anche la scheda attiva |
is_shortcut sull'handle di una chiave senza pagina | registrato: il tasto veniva preso per nulla | non viene registrato nulla, of_get_last_error dice perché |
of_insert_page il cui spostamento fallisce | codice negativo, la pagina restava | codice 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.
| Cosa | 4.0 | 5.0 |
|---|---|---|
ue_toast_dismissed | (long al_id, string as_key) | (long al_id, string as_key, string as_reason), constants REASON_* |
of_close di un toast non ancora disegnato, o in attesa di posto | non veniva attivato nulla | ue_toast_dismissed, REASON_CODE |
of_close di un toast di un altro toaster | lo chiudeva, l'annuncio andava all'altro | -5, nulla viene chiuso, of_get_last_error dice perché |
la finestra di ipo_owner si chiude | i suoi toast sparivano senza dire nulla | ue_toast_dismissed, REASON_OWNER_CLOSED |
| un toaster distrutto, toast a schermo | restavano, muti | i 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 finestra | la finestra intera: il toast copriva la barra del titolo e i suoi pulsanti | l'area client (quella della cornice in MDI) |
| un titolo molto lungo | spingeva la croce e i pulsanti fuori dalla finestra | limitato, 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.
| Cosa | 4.0 | 5.0 |
|---|---|---|
ue_navigating con il veto: indirizzo digitato, Apri collegamento, nuova finestra | la pagina si apriva senza domanda | la domanda viene posta; false mantiene la pagina |
is_address, la barra, ue_load_completed dopo of_show_html | l'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_stop | senza valore di ritorno | long: 0 una volta richiesto, -2 componente non creato |
ib_private cambiato dopo una pagina | is_address, is_title, la barra e le frecce mantenevano la pagina precedente | tutto si rilegge vuoto: la vista è nuova |
| Invio su una barra degli indirizzi vuota | la pagina diventava bianca | nulla |
| Una pagina del sito si carica, barra degli indirizzi visibile | Ricarica resta Ricarica | Ricarica 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.
| Cosa | 4.0 | 5.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 barra | ue_layout_changed | ue_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 sottovoci | 0: 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 elenco | registrata: il tasto veniva preso in tutta la finestra | nulla 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 barra | partiva lo strumento che portava la scorciatoia | il campo modifica il suo testo |
is_text di un selettore di data | conservato e riletto, mai mostrato | ignorato, 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 %.
| Cosa | 4.0 | 5.0 |
|---|---|---|
buttonbar · ue_button_rclicked | (string as_key) | (string as_key, long al_x, long al_y) |
breadcrumb · ue_item_rclicked | (string as_keys) | (string as_keys, long al_x, long al_y) |
chartcartesian · ue_point_rclicked | (string as_key, long al_index, double ad_value) | (string as_key, long al_index, double ad_value, long al_x, long al_y) |
statusbar · al_x, al_y di ue_panel_rclicked | moltiplicati per la scala dello schermo | il 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().
| Cosa | 4.0 | 5.0 |
|---|---|---|
of_get_last_error() di un componente visuale | l'ultimo messaggio della DLL, uno solo per tutto il processo — spesso quello di un altro componente | ciò 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_error | inv.of_get_last_error() |
of_stop, of_close, of_reset dei componenti non visuali (commandpalette, crypto, messagebox, restclient, soundplayer, speechout, toaster, xml) | senza valore restituito | un 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 →