PBToolboxAI v5 ← Site

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 #

Userobjectu_pbt_picture
Classe degli item— (componente senza item)
Serve perSostituire un picture PowerBuilder: formati moderni (SVG, WebP, GIF animato), ritaglio controllato, immagine cliccabile, conversione automatica in scala di grigi
Opzioni opt-inib_zoomable · ib_clickable · ib_allow_drop · ib_auto_height · 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:

FormaEsempioUso
File localeimg\logo.pngpng, jpg, jfif, bmp, gif, ico, svg, webp, avif — and tif, tiff, wmf, emf, rle, converted on the fly
Indirizzo webhttps://…/logo.pngImmagine caricata da un server (solo https: un indirizzo http:// viene rifiutato, vedere sotto)
Dati incorporatidata:image/png;base64,…Immagine già in memoria, senza file intermedio
Risorsa di DLLimg\packimages.dll:SAMPLEImmagine 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.

I formati del Picture nativo che il motore non legge — TIFF (scansioni, fax), WMF, EMF e RLE — vengono convertiti al volo: un'applicazione ripresa da PowerBuilder conserva le sue immagini. Gli spazi attorno a un percorso vengono ignorati: una colonna CHAR letta da GetItemString arriva completata da spazi, e anche Windows li ignora; is_source si rilegge come l'ha scritto. Un'immagine ricolorata (mono:, tint:) servita da un altro sito in https viene disegnata solo se quel server autorizza le richieste di un'altra origine (intestazione Access-Control-Allow-Origin); altrimenti ue_error lo dice (REASON_FAILED). I file della postazione, le risorse di DLL e i data: non sono interessati.

Un'immagine in memoria — una foto memorizzata nel database e letta da SelectBlob — si mostra con of_set_picture(blob), come SetPicture del Picture nativo: nessun file temporaneo, nessun base64. Il formato viene riconosciuto dai byte; seguono ue_loaded o ue_error, come per is_source.


Come viene ritagliata: is_stretch #

CostanteEffetto
STRETCH_UNIFORMPredefinito. L'immagine è ridimensionata senza deformazione, interamente visibile; possono comparire dei margini
STRETCH_UNIFORMTOFILLRidimensionamento senza deformazione, ma la cornice è interamente riempita; le eccedenze vengono ritagliate
STRETCH_FILLL'immagine è stirata per occupare esattamente la cornice — può risultare deformata
STRETCH_NONEDimensione 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 #

CostanteValorePer
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_2700 90 180 270ii_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àTipoPredefinitoRuolo
is_sourcestring""L'immagine da visualizzare (vedere le quattro forme qui sopra)
is_stretchstring"uniform"Modalità di ritaglio: STRETCH_NONE, STRETCH_FILL, STRETCH_UNIFORM, STRETCH_UNIFORMTOFILL
is_alignstring"center"Posizionamento orizzontale quando l'immagine è più piccola del controllo: ALIGN_CENTER, ALIGN_START, ALIGN_END. L'asse verticale è is_valign
is_valignstring"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_enabledbooleantrueA false, l'immagine è visualizzata in scala di grigi e non risponde più a nulla: clic, rotellina, tastiera e file rilasciati
ii_badgeinteger0Pastiglia 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). Oltre 99 mostra 99+; un lettore di schermo la sente con l'immagine (« Posta, 5 novità »)
il_badge_colorlong-1Sfondo 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_sizeinteger0Altezza 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_mousebooleanfalseOpt-in: attiva ue_mouse_enter / ue_mouse_leave
is_placeholderstring""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_sourcestring""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_rotationinteger0Quarti 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_mirrorbooleanfalseSpecchiatura orizzontale sullo schermo: l'immagine è ribaltata da sinistra a destra, qualunque sia ii_rotation
ib_zoomablebooleanfalseOpt-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 il tasto contrassegnato 0, qualunque sia la disposizione della tastiera); il tasto 1 mostra l'immagine alla sua dimensione REALE, un pixel dell'immagine per un pixel dello schermo. Con Ctrl o Alt premuto, questi tasti sono lasciati alla Sua applicazione. 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_zoomdouble1.0Fattore 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, questa proprietà impostata dal suo codice, o una nuova sorgente che lo riporta a 1.0). Richiede ib_zoomable, impostato prima: senza, il fattore resta 1.0. Lo imposti dopo is_source: una nuova immagine riparte dall'inquadratura
id_max_zoomdouble8.0Il TETTO dello zoom, nell'unità di id_zoom (1.0 = l'inquadratura): la rotellina, il tasto + e id_zoom si fermano lì, qualunque sia la dimensione dell'immagine. Qualsiasi valore a partire da 1.0; sotto, torna il valore predefinito. Solo il tasto 1 va oltre, fino alla dimensione REALE — una grande scansione mostrata in piccolo resta leggibile pixel per pixel; da lì, + non fa nulla e - ridiscende. Abbassato sotto lo zoom corrente, lo zoom vi scende e ue_zoom_changed lo dice
ib_allow_dropbooleanfalseOpt-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_heightbooleanfalseOpt-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_textstring""Testo alternativo: ciò che un lettore di schermo dice dell'immagine, seguito dal numero della pastiglia, o da « Immagine non disponibile » quando la sorgente è fallita. Lo lasci vuoto per un'immagine puramente decorativa
ib_clickablebooleanfalseOpt-in: l'immagine è un PULSANTE — nell'ordine di tabulazione, con un anello di focus visibile, e Invio o Spazio sollevano ue_clicked come un clic (il pulsante predefinito della finestra allora non risponde). Disattivata, esce dall'ordine di tabulazione. Un lettore di schermo annuncia un pulsante chiamato con is_alt_text. Senza, un'immagine è un'immagine: Invio va alla finestra
is_theme_stylestring""Stile visivo del componente (costanti THEME_STYLE_*); vuoto = quello dell'applicazione, seguito a ogni cambio
is_theme_modestring""Variante chiara o scura (costanti THEME_MODE_*); vuoto = quella dell'applicazione, seguita a ogni cambio
il_theme_accentlong-1Colore d'accento di questo componente (-1 = accento dell'applicazione, o quello del tema)
is_tooltipstring""Tooltip semplice mostrato al passaggio del mouse sul componente
is_super_tooltip_titlestring""Titolo del tooltip avanzato (prevale su is_tooltip)
is_super_tooltip_textstring""Testo del tooltip avanzato (markup avanzato accettato)
is_super_tooltip_imagestring""Immagine del tooltip avanzato

Metodi #

MetodoRuolo
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_picture (blob ablb_image)Mostra un'immagine tenuta in memoria — una foto letta dal database con SelectBlob — come SetPicture del Picture nativo: nessun file temporaneo, nessun base64. Il formato viene riconosciuto dai byte (tif, wmf ed emf convertiti); is_source rilegge poi l'indirizzo a cui l'immagine è servita, e seguono ue_loaded o ue_error. Restituisce 0 una volta consegnata, -5 se il blob è vuoto o non è un'immagine, -4 oltre 32 MB, -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 #

EventAttivato quando
ue_clicked ( )Clic sinistro sull'immagine — o Invio / Spazio con ib_clickable. 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. Per un SVG sono le dimensioni che dichiara (width, height); un SVG disegnato al 100 % non ne dichiara alcuna, e il motore gli dà una casella predefinita (150 pixel di altezza, con le proporzioni del suo disegno): il rapporto è giusto, la dimensione non significa nulla
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 +, -, 0 e 1, id_zoom o un id_max_zoom più basso impostati dal suo codice, una nuova is_source o ib_zoomable disattivato (ritorno a 1.0) — nulla quando il fattore resta lo stesso, né su of_reset. 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 rowfocuschanged di dw_customer : visualizzare la foto del cliente corrente
// Local variables
string ls_customer_code

// Il codice del cliente della nuova riga
if currentrow < 1 then return
ls_customer_code = this.GetItemString(currentrow, "customer_code")

// La foto riempie la cornice ; gli spazi di una colonna CHAR vengono ignorati
uo_photo.is_source  = "photos\" + ls_customer_code + ".jpg"
uo_photo.is_stretch = uo_photo.STRETCH_UNIFORMTOFILL
// Una volta, nell'event open della finestra : l'immagine mostrata quando manca una foto
uo_photo.is_error_source = "img\photo_missing.svg"
// event ue_error di uo_photo : (string as_message, string as_reason)
// L'immagine sostitutiva e gia mostrata : qui, solo contare le foto mancanti
if as_reason = uo_photo.REASON_NOT_FOUND then
    il_missing_photos = il_missing_photos + 1
end if

is_error_source è il modo corretto di trattare una foto mancante: è inutile verificare l'esistenza del file prima di assegnarlo. Non riassegni mai is_source da ue_error: se mancasse a sua volta l'immagine sostitutiva, il fallimento rilancerebbe il caricamento senza fine.

Visualizzare una foto memorizzata nel database #

// Local variables
blob lb_photo

// La foto del dipendente, memorizzata in una colonna del database
SELECTBLOB photo INTO :lb_photo FROM employee WHERE emp_id = 4152 USING SQLCA;

// Mostrata direttamente dalla memoria : 0 = consegnata, -5 = non e un'immagine
if uo_photo.of_set_picture(/*image*/ lb_photo) <> 0 then
    uo_photo.is_source = ""
end if

Un'immagine cliccabile, in stile pulsante #

// L'immagine, il suo nome per la tastiera e i lettori di schermo, e il suo tooltip
uo_avatar.is_source    = "photos\user.png"
uo_avatar.is_alt_text  = "Il mio account"
uo_avatar.is_tooltip   = "Il mio account"

// Un pulsante anche per la tastiera : Tab lo raggiunge, Invio o Spazio sollevano ue_clicked
uo_avatar.ib_clickable = true
// event ue_clicked di uo_avatar
of_open_my_account()

Contatore e scala di grigi #

// Local variables
long ll_unread

// Una pastiglia di notifiche su un'icona di posta
ll_unread = 7
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 #

// Local variables
string ls_chosen_file, ls_name

// Show the file the user has chosen
if GetFileOpenName("Picture", ls_chosen_file, ls_name, "jpg", "Pictures (*.jpg;*.png),*.jpg;*.png", /*initdir*/ "", OFN_EXPLORER + OFN_NOCHANGEDIR) = 1 then
    uo_preview.is_source = ls_chosen_file
end if
// 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. La dimensione dell'immagine
// e in PIXEL, quella dello userobject in unita PowerBuilder : confrontarle nella stessa unita
if al_width < UnitsToPixels(uo_preview.width, XUnitsToPixels!) and al_height < UnitsToPixels(uo_preview.height, YUnitsToPixels!) 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 #

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.

MembriRuoloDescritto in
of_resetRiportare il componente a zero3.6 Riportare un componente a zero: of_reset()
of_register_shortcut · of_clear_shortcutsScorciatoie da tastiera del componente3.5 Le scorciatoie da tastiera
of_is_created · of_is_ready · of_get_last_errorSe è nato, se è pronto, cosa è fallito3.7 Diagnostica
of_save_as_png · of_save_as_jpgEsportare il rendering in immagine3.8 Esportare il rendering come immagine
of_set_redrawRaggruppare le modifiche in un solo ridisegno3.10 Buone pratiche
of_preload_iconsIcone mostrate senza ritardoVisualizzazione istantanea: of_icon
of_set_translationTradurre una dicitura del componente5.2 Adattare un'etichetta: of_set_translation
of_focus_webviewDare il focus al componente6.4 Tastiera e focus
of_print · of_print_to_pdfStampare, o scrivere un PDF6.9 Stampare
of_set_property · of_get_property · of_component_namePilotare una proprietà per nome3.1 Il motore delle proprietà
is_accessible_name · is_accessible_descriptionIl nome e la descrizione che dice un lettore di schermo3.4 Proprietà ed event opzionali

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.


← Riferimento dei componenti · Sommario della guida