picture — u_pbt_picture #
← Riferimento dei componenti · Sommario della guida
Visualizzazione di immagini: tutti i formati correnti, modalità di ritaglio, allineamento, conversione automatica in scala di grigi e pastiglia contatore.
▶ Vederlo dal vivo — Applicazione dimostrativa, riquadro Picture: l'anteprima, il codice che lo produce e questa pagina, affiancati.
In breve #
| Userobject | u_pbt_picture |
| Classe degli item | — (componente senza item) |
| Serve per | Sostituire un picture PowerBuilder: formati moderni (SVG, WebP, GIF animato), ritaglio controllato, immagine cliccabile, conversione automatica in scala di grigi |
| Opzioni opt-in | ib_track_mouse |
Avvio rapido #
// event open della finestra
uo_image.is_source = "img\logo.png"
uo_image.is_stretch = uo_image.STRETCH_UNIFORM // adatta senza deformare
uo_image.is_align = uo_image.ALIGN_CENTER
uo_image.is_tooltip = "Logo della societa"
Da dove arriva l'immagine: is_source #
is_source accetta quattro forme, tutte intercambiabili:
| Forma | Esempio | Uso |
|---|---|---|
| File locale | img\logo.png | png, jpg, jfif, bmp, gif, ico, svg, webp, avif |
| Indirizzo web | https://…/logo.png | Immagine caricata da un server (solo https: un indirizzo http:// viene rifiutato, vedere sotto) |
| Dati incorporati | data:image/png;base64,… | Immagine già in memoria, senza file intermedio |
| Risorsa di DLL | img\packimages.dll:SAMPLE | Immagine impacchettata in una DLL di risorse |
Un prefisso anim: può essere posto davanti a un GIF per segnalare esplicitamente un'animazione (i GIF si animano comunque).
Quando lo stesso nome esiste sotto più tipi di risorsa in una DLL, precisi il tipo: img\packimages.dll:PNG/SAMPLE, SVG/SAMPLE, ICON/APP, RCDATA/BLOB. Vedere Immagini e icone per i prefissi mono: e tint:, che ricolorano un glifo in base al tema.
Un indirizzo http:// viene rifiutato: la pagina del componente è protetta, e il motore passerebbe l'immagine a https:// senza dire nulla — su un server intranet senza TLS fallirebbe allora con un messaggio ingannevole. Il componente la rifiuta quindi subito: glifo di errore e ue_error con REASON_INSECURE. Per un'immagine di un server non cifrato, la scarichi prima con n_pbt_restclient.of_download in una cartella temporanea, poi mostri quel percorso. Riassegnare lo stesso percorso rilegge il file: un'immagine che la Sua applicazione ha appena riscritto (foto, scansione, ritaglio) appare, come con il Picture nativo. Un'immagine su disco non supera 32 MB.
Come viene ritagliata: is_stretch #
| Costante | Effetto |
|---|---|
STRETCH_UNIFORM | Predefinito. L'immagine è ridimensionata senza deformazione, interamente visibile; possono comparire dei margini |
STRETCH_UNIFORMTOFILL | Ridimensionamento senza deformazione, ma la cornice è interamente riempita; le eccedenze vengono ritagliate |
STRETCH_FILL | L'immagine è stirata per occupare esattamente la cornice — può risultare deformata |
STRETCH_NONE | Dimensione originale, senza ridimensionamento |
is_align decide la posizione orizzontale dell'immagine quando è più piccola del controllo: ALIGN_CENTER (predefinito), ALIGN_START, ALIGN_END. L'asse verticale ha la sua proprietà, is_valign. Il posizionamento si legge sullo schermo: ALIGN_START resta sul bordo iniziale qualunque siano ii_rotation e ib_mirror. Un valore sconosciuto si rilegge center.
Costanti #
| Costante | Valore | Per |
|---|---|---|
STRETCH_NONE · STRETCH_FILL · STRETCH_UNIFORM · STRETCH_UNIFORMTOFILL | "none" "fill" "uniform" "uniformtofill" | is_stretch |
ALIGN_CENTER · ALIGN_START · ALIGN_END | "center" "start" "end" | is_align |
VALIGN_TOP · VALIGN_CENTER · VALIGN_BOTTOM | "top" "center" "bottom" | is_valign |
ROTATION_NONE · ROTATION_90 · ROTATION_180 · ROTATION_270 | 0 90 180 270 | ii_rotation |
REASON_NOT_FOUND · REASON_TOO_LARGE · REASON_INSECURE · REASON_UNSUPPORTED · REASON_FAILED | "notfound" "toolarge" "insecure" "unsupported" "failed" | ue_error (as_reason) |
ALIGN_START e ALIGN_END sono logici: seguono il senso di scrittura (Lingua e RTL). I valori fisici left e right restano accettati come alias.
Proprietà #
| Proprietà | Tipo | Predefinito | Ruolo |
|---|---|---|---|
is_source | string | "" | L'immagine da visualizzare (vedere le quattro forme qui sopra) |
is_stretch | string | "uniform" | Modalità di ritaglio: STRETCH_NONE, STRETCH_FILL, STRETCH_UNIFORM, STRETCH_UNIFORMTOFILL |
is_align | string | "center" | Posizionamento orizzontale quando l'immagine è più piccola del controllo: ALIGN_CENTER, ALIGN_START, ALIGN_END. L'asse verticale è is_valign |
is_valign | string | VALIGN_CENTER | Collocazione verticale quando l immagine è più piccola del controllo: VALIGN_TOP, VALIGN_CENTER, VALIGN_BOTTOM. I due assi sono indipendenti — is_align dà la colonna, questa la riga — ed è ciò che rende raggiungibile un angolo |
ib_enabled | boolean | true | A false, l'immagine è visualizzata in scala di grigi e non risponde più a nulla: clic, rotellina, tastiera e file rilasciati |
ii_badge | integer | 0 | Pastiglia contatore nell'angolo superiore di fine riga: a destra in una lettura da sinistra a destra, a sinistra in una da destra a sinistra (0 = nessuna) |
il_badge_color | long | -1 | Sfondo della pastiglia, in RGB PowerBuilder (-1 = non impostato: il colore che proviene dal tema; 0 è il nero, come per ogni altro colore). Il colore del testo viene scelto automaticamente affinché il contatore resti leggibile |
ii_badge_size | integer | 0 | Altezza del badge in pixel (0 = la dimensione che proviene dal tema). La dimensione del carattere segue da sola: il contatore resta centrato qualunque sia la dimensione |
ib_track_mouse | boolean | false | Opt-in: attiva ue_mouse_enter / ue_mouse_leave |
is_placeholder | string | "" | Immagine segnaposto, mostrata finché is_source è vuota (una cornice « aggiungi una foto », una sagoma). Presentata attenuata: un segnaposto non è il contenuto e non viene mai annunciato come immagine caricata. Accetta il prefisso mono:, che ricolora un glifo monocromatico con il tema |
is_error_source | string | "" | Immagine di ripiego quando la sorgente fallisce il caricamento. La lasci vuota e il componente mostra il proprio glifo di errore — mai un riquadro vuoto, che non dice nulla all utente mentre ue_error va solo al Suo codice. Accetta il prefisso mono: |
ii_rotation | integer | 0 | Quarti di giro, per le scansioni e le foto che arrivano coricate: ROTATION_NONE, ROTATION_90, ROTATION_180, ROTATION_270 (qualunque altro valore vale 0). Un quarto di giro scambia anche gli assi di adattamento, così l'immagine conserva le proporzioni invece di essere schiacciata |
ib_mirror | boolean | false | Specchiatura orizzontale sullo schermo: l'immagine è ribaltata da sinistra a destra, qualunque sia ii_rotation |
ib_zoomable | boolean | false | Opt-in: l'utente può avvicinarsi (rotellina, verso il puntatore, o tasti + e -), spostarsi (trascinamento, o frecce — invertite in una lettura da destra a sinistra) e tornare all'inquadratura (doppio clic, o 0); il tasto 1 mostra l'immagine alla sua dimensione REALE, un pixel dell'immagine per un pixel dello schermo. Più grande della sua cornice, l'immagine la copre sempre: un trascinamento non scopre mai una banda vuota; più piccola, resta dove la collocano is_align e is_valign. Solo il tasto sinistro la sposta. Per una pianta, una scansione, una foto — dove quattro modi di adattamento fissi non bastano |
id_zoom | double | 1.0 | Fattore di zoom: 1.0 = l'inquadratura scelta da is_stretch, fino a id_max_zoom (8.0 per impostazione predefinita). Rileggendolo si ottiene il fattore corrente, rotellina e tastiera comprese (ue_zoom_changed avvisa di ogni cambiamento: un gesto dell'utente, o questa proprietà impostata dal suo codice). Richiede ib_zoomable, impostato prima: senza, il fattore resta 1.0 |
id_max_zoom | double | 8.0 | Il TETTO dello zoom, nell'unità di id_zoom (1.0 = l'inquadratura): la rotellina, i tasti e id_zoom si fermano lì. Qualsiasi valore a partire da 1.0; sotto, torna il valore predefinito. La dimensione REALE resta sempre raggiungibile — il tasto 1 ci porta, e una grande scansione mostrata in piccolo resta leggibile pixel per pixel. Abbassato sotto lo zoom corrente, lo zoom vi scende e ue_zoom_changed lo dice |
ib_allow_drop | boolean | false | Opt-in: accetta i file rilasciati da Esplora risorse. La cornice mostra di essere armata, e i percorsi completi arrivano con ue_drop_files — caricarli in is_source spetta alla sua applicazione. Un'immagine disattivata (ib_enabled = false) rifiuta ogni rilascio, e ib_allow_drop si rilegge come impostato |
ib_auto_height | boolean | false | Opt-in: l'userobject prende l'altezza che rispetta le proporzioni dell'immagine alla larghezza corrente. Per un'immagine quell'altezza si deduce: non serve calcolarla da sé a partire dalle dimensioni di ue_loaded |
is_alt_text | string | "" | Testo alternativo: ciò che un lettore di schermo dice dell'immagine. Lo lasci vuoto per un'immagine puramente decorativa |
is_theme_style | string | "" | Stile visivo del componente (costanti THEME_STYLE_*); vuoto = quello dell'applicazione, seguito a ogni cambio |
is_theme_mode | string | "" | Variante chiara o scura (costanti THEME_MODE_*); vuoto = quella dell'applicazione, seguita a ogni cambio |
il_theme_accent | long | -1 | Colore d'accento di questo componente (-1 = accento dell'applicazione, o quello del tema) |
is_tooltip | string | "" | Tooltip semplice mostrato al passaggio del mouse sul componente |
is_super_tooltip_title | string | "" | Titolo del tooltip avanzato (prevale su is_tooltip) |
is_super_tooltip_text | string | "" | Testo del tooltip avanzato (markup avanzato accettato) |
is_super_tooltip_image | string | "" | Immagine del tooltip avanzato |
Metodi #
| Metodo | Ruolo |
|---|---|
of_reset ( ) | Riporta tutte le proprietà al valore predefinito e rimuove l'immagine. Restituisce 0 una volta applicato, -2 se il componente non è creato |
of_set_redraw (boolean) | Raggruppa una raffica di modifiche in un unico rendering. Restituisce 0 una volta applicato, -2 se il componente non è creato |
of_save_as_png (string) · of_save_as_jpg (string) | Esporta il rendering come immagine. Restituisce 0 una volta scritta l'immagine, -4 se la scrittura fallisce, -2 se il componente non è creato |
Event #
| Event | Attivato quando |
|---|---|
ue_clicked ( ) | Clic sinistro sull'immagine. Spostare l'immagine ingrandita non è un clic, e un doppio clic ne solleva uno solo, come il Picture nativo |
ue_loaded (long al_width, long al_height) | L'immagine è caricata; i parametri portano le sue dimensioni originali in pixel |
ue_error (string as_message, string as_reason) | L'immagine non ha potuto essere caricata. as_message nomina la sorgente (image load failed : <source>), as_reason dice perché: REASON_NOT_FOUND (file assente), REASON_TOO_LARGE (oltre 32 MB), REASON_INSECURE (un indirizzo http://, rifiutato), REASON_UNSUPPORTED (un formato che il componente non mostra), REASON_FAILED (tutto il resto: un file che non si decodifica, un server che non risponde) |
ue_rclicked ( ) | Clic destro sull'immagine |
ue_double_clicked ( ) | Doppio clic sull'immagine. Lo precede un solo ue_clicked, mai due — come il Picture nativo. Quando ib_zoomable è attivo, il doppio clic riporta anche all'inquadratura: l'evento parte in entrambi i casi, sta a lei decidere cosa significa |
ue_zoom_changed (double ad_zoom) | Il fattore di zoom è cambiato: rotellina, doppio clic, tasti +, - e 0, o id_zoom impostato dal suo codice — nulla quando il fattore resta lo stesso. 1.0 significa il ritorno all'inquadratura di is_stretch |
ue_auto_height (long al_height) | Il componente si è fermato su una nuova altezza; l'userobject è già ridimensionato quando l'evento parte. Richiede ib_auto_height |
ue_drop_files (string as_files[]) | File rilasciati da Esplora risorse: percorsi completi, una voce per file. Richiede ib_allow_drop |
ue_drag_enter ( ) | Un trascinamento di file entra nel componente (ib_allow_drop) |
ue_drag_leave ( ) | Il trascinamento di file lascia il componente |
ue_mouse_enter ( ) | Il mouse entra — richiede ib_track_mouse = true |
ue_mouse_leave ( ) | Il mouse esce — richiede ib_track_mouse = true |
ue_ready ( ) | Il componente ha terminato il caricamento; tutto ciò che è stato inviato prima è stato riprodotto |
ue_runtime_missing ( ) | Il runtime WebView2 è assente: il componente resta vuoto |
ue_bg_color (long al_color) | Il componente ha calcolato il colore di sfondo del proprio tema; l'userobject lo ha già adottato (backcolor) |
Esempi #
Visualizzare la foto di una scheda #
// event ue_row_changed della datawindow : visualizzare la foto del cliente corrente
uo_photo.is_source = "photos\" + ls_customer_code + ".jpg"
uo_photo.is_stretch = uo_photo.STRETCH_UNIFORMTOFILL // riempie la cornice, l'eccedenza viene ritagliata
uo_photo.is_align = uo_photo.ALIGN_CENTER
// event ue_error di uo_photo : (string as_message, string as_reason)
if as_reason = uo_photo.REASON_NOT_FOUND then
uo_photo.is_source = "img\photo_missing.svg" // immagine sostitutiva
end if
Gestire ue_error è il modo corretto di trattare una foto mancante: è inutile verificare l'esistenza del file prima di assegnarlo.
Un'immagine cliccabile, in stile pulsante #
// L'immagine, e il tooltip mostrato quando il mouse vi si posa
uo_avatar.is_source = "photos\user.png"
uo_avatar.is_tooltip = "Il mio account"
// event ue_clicked di uo_avatar
of_open_my_account()
Contatore e scala di grigi #
// Una pastiglia di notifiche su un'icona di posta
uo_mail.is_source = "img\packimages.dll:SVG/MAIL"
uo_mail.ii_badge = ll_unread // 0 fa sparire la pastiglia
// Pastiglia rossa oltre una soglia, colore del tema altrimenti (-1)
if ll_unread > 20 then
uo_mail.il_badge_color = RGB(/*red*/ 200, /*green*/ 30, /*blue*/ 30)
else
uo_mail.il_badge_color = -1
end if
// Funzione non disponibile : l'immagine passa in scala di grigi, senza fornire una seconda immagine
uo_mail.ib_enabled = ib_mail_allowed
La scala di grigi è calcolata automaticamente: non deve fornire una seconda immagine « disattivata ».
Conoscere le dimensioni reali dell'immagine #
// Show the file the user has chosen
uo_preview.is_source = ls_chosen_file
// event ue_loaded di uo_preview : (long al_width, long al_height)
uo_status.of_panel(/*key*/ "main").is_text = String(al_width) + " x " + String(al_height) + " px"
// Un'immagine piu piccola della cornice : non ingrandirla inutilmente
if al_width < uo_preview.width and al_height < uo_preview.height then
uo_preview.is_stretch = uo_preview.STRETCH_NONE
end if
Un banner a tutta larghezza #
// L'immagine del banner, che riempie la sua striscia
uo_banner.is_source = "img\banniere.jpg"
uo_banner.is_stretch = uo_banner.STRETCH_UNIFORMTOFILL // riempie tutta la fascia, senza deformare
uo_banner.is_valign = uo_banner.VALIGN_TOP // mantiene visibile la parte alta dell'immagine
Buone pratiche #
STRETCH_UNIFORMè la modalità sicura: non deforma mai. RiserviSTRETCH_FILLagli sfondi decorativi, dove la deformazione è senza conseguenze.- Per una foto in una cornice fissa (organigramma fotografico, miniatura),
STRETCH_UNIFORMTOFILLdà un risultato regolare, senza margini antiestetici. - Raggruppi le Sue icone in una DLL di risorse anziché consegnare centinaia di file; la forma
pack.dll:TIPO/NOMEelimina ogni ambiguità. - Per un glifo monocromatico che deve seguire il tema chiaro e scuro, usi il prefisso
mono:(Immagini e icone). - Scriva uno script per
ue_errorsu ogni immagine la cui sorgente dipende dai dati: è la Sua unica rete di sicurezza in caso di file mancante. - Chiami
of_reset()prima di riutilizzare il componente per un'immagine di natura diversa: senza questo, la modalità di ritaglio, la pastiglia o lo stato in scala di grigi precedenti restano attivi.
Ereditato dalla base comune #
Questi membri esistono su tutti i componenti visivi — non sono propri di questo. Sono descritti una sola volta, nei capitoli trasversali; questa tabella dice solo dove leggerli.
| Membri | Ruolo | Descritto in |
|---|---|---|
of_reset | Riportare il componente a zero | 3.6 Riportare un componente a zero: of_reset() |
of_register_shortcut · of_clear_shortcuts | Scorciatoie da tastiera del componente | 3.5 Le scorciatoie da tastiera |
of_is_created · of_is_ready · of_get_last_error | Se è nato, se è pronto, cosa è fallito | 3.7 Diagnostica |
of_save_as_png · of_save_as_jpg | Esportare il rendering in immagine | 3.8 Esportare il rendering come immagine |
of_set_redraw | Raggruppare le modifiche in un solo ridisegno | 3.10 Buone pratiche |
of_preload_icons | Icone mostrate senza ritardo | Visualizzazione istantanea: of_icon |
of_set_translation | Tradurre una dicitura del componente | 5.2 Adattare un'etichetta: of_set_translation |
of_focus_webview | Dare il focus al componente | 6.4 Tastiera e focus |
of_print · of_print_to_pdf | Stampare, o scrivere un PDF | 6.9 Stampare |
of_set_property · of_get_property · of_component_name | Pilotare una proprietà per nome | 3.1 Il motore delle proprietà |
Due aiuti non sono ereditati: of_icon e of_escape_markup vivono su n_pbt_utils. Ne dichiari uno — n_pbt_utils lnv_utils, niente da creare — e li chiami su di esso.