PBToolboxAI v5 ← Site

carousel — u_pbt_carousel #

← Riferimento dei componenti · Sommario della guida

carousel fa scorrere degli elementi di cui uno solo è davanti: il Cover Flow di iTunes — l'elemento corrente di fronte, i suoi vicini inclinati in prospettiva che si sovrappongono, un riflesso sotto di essi —, una striscia piatta dove più elementi si vedono interi, una pila di schede, o un banner a tutta superficie che mostra un elemento alla volta. Ogni elemento è un'immagine, un testo formattato o una scheda (immagine, titolo, sottotitolo, corpo scritto da un modello, etichette, badge). L'utente clicca un vicino, scorre con inerzia, gira la rotellina, digita le prime lettere di un titolo o usa la tastiera; ue_current_changed vi dice quale elemento è davanti. Il carosello si riempie a mano o da un DataStore, e può avanzare da solo, con un pulsante PAUSA.

▶ Vederlo dal vivo — Applicazione dimostrativa, riquadro Carousel: l'anteprima, il codice che lo produce e questa pagina, affiancati.


In breve #

Userobjectu_pbt_carousel
Classe di elementin_pbt_carousel_item (of_item(key))
Serve aSfogliare copertine, prodotti, foto, schede, notizie o passi di accoglienza
PrincipioUn elemento ha una chiave unica; uno solo è davanti alla volta, e si disegna come immagine, testo o scheda
Opzioni opt-inib_veto_changes, ib_loop, ib_reflection, il_autoplay_ms
Limite in modalità demoI primi 6 elementi visibili disegnati — vedere la modalità demo

Avvio rapido #

// Three album covers : a key, a title, a picture
uo_covers.of_add_item(/*key*/ "c1", /*title*/ "Northern Lights", /*image*/ "img\packimages.dll:SVG/COVERS/COVER-01")
uo_covers.of_add_item(/*key*/ "c2", /*title*/ "Blue Hour", /*image*/ "img\packimages.dll:SVG/COVERS/COVER-02")
uo_covers.of_add_item(/*key*/ "c3", /*title*/ "Evergreen", /*image*/ "img\packimages.dll:SVG/COVERS/COVER-03")

// A reflection under the covers, as on a glossy floor
uo_covers.ib_reflection = true
// event ue_current_changed of uo_covers : (string as_from_key, string as_key)
// The album now in front, in the title of the window ("" : the carousel is empty)
if as_key <> "" then Parent.Title = this.of_item(/*key*/ as_key).is_title

Quattro disposizioni, tre facce #

is_style sceglie la disposizione: STYLE_COVERFLOW (predefinito) mette l'elemento corrente di fronte e inclina i suoi vicini in prospettiva, sovrapposti, distribuiti sulla larghezza disponibile e più scuri con la distanza (ii_angle, ii_spacing, ib_shade); STYLE_CAROUSEL allinea una striscia piatta dove più elementi si vedono interi; STYLE_STACK impila delle schede — la corrente davanti, le successive dietro di essa, le precedenti spostate di lato; STYLE_HERO mostra un solo elemento su tutta la superficie, il successivo che scivola o appare in dissolvenza (is_transition): il banner di un cruscotto. Un riquadro mantiene una proporzione (is_item_ratio; vuoto: 1:1 per immagini, 3:4 per schede, 16:9 per testi) e il contenuto di una scheda o di un testo segue la sua dimensione, tra un minimo leggibile e un massimo. ib_reflection mette un riflesso sotto gli elementi, ii_item_width e ii_item_height fissano la dimensione al pixel.

Perché delle facce piuttosto che dei componenti nel carosello? Ogni componente della libreria è un controllo a sé stante, con la propria pagina web (un WebView2): non può stare nella pagina di un altro. Il carosello disegna quindi da sé ciò che mostrerebbero un'immagine, uno statictext o una scheda del kanban — sono le tre facce di uno stesso elemento, e mille elementi costano un solo controllo. is_item_style sceglie la faccia di tutti gli elementi, is_style di un elemento sceglie la sua (vuoto: segue il carosello). Con ITEM_AUTO (predefinito), la faccia si deduce da ciò che l'elemento porta:

of_item(key).of_face() dice la faccia scelta. Un'immagine è un file della postazione, una risorsa file.dll:nome, un glifo mono: o tint: disegnato nel tema, o un indirizzo https://; un indirizzo http:// è rifiutato e solleva ue_image_failed con REASON_INSECURE, un file mancante con REASON_NOT_FOUND.

// The covers as a pile of cards, the whole picture in each tile
uo_covers.is_style = u_pbt_carousel.STYLE_STACK
uo_covers.is_fit = u_pbt_carousel.FIT_CONTAIN

// This item is a card, whatever it holds
uo_covers.of_item(/*key*/ "c2").is_style = u_pbt_carousel.ITEM_CARD

Una fila allineata all'inizio #

Su una striscia piatta (STYLE_CAROUSEL), is_align = ALIGN_START dà la fila di un servizio video: gli elementi partono dal bordo d'inizio (a destra nella lettura da destra a sinistra), tutti interi e piatti, e l'ultima schermata è piena — nessun vuoto dopo l'ultimo elemento; un elemento tagliato da un bordo invita a scorrere. L'elemento corrente non è più al centro: è quello che l'utente ha scelto, sempre intero sullo schermo. Le frecce e Pag su / Pag giù avanzano di una schermata (gli elementi che mostra interi) e l'elemento corrente diventa il primo che la schermata ha portato; i tasti freccia avanzano di un elemento e fanno scorrere solo quanto serve per tenerlo intero; la rotellina e il trascinamento scorrono e si posano su un elemento intero, l'elemento corrente segue solo se stava per uscire; un clic su un elemento intero lo rende corrente e solleva ue_item_clicked. Le frecce stanno nei margini, si mostrano solo sotto il puntatore o con la tastiera, e spariscono a un'estremità. I punti contano le schermate (un punto è un posto dove la striscia può posarsi); il contatore conta sempre gli elementi. La riproduzione automatica avanza di una schermata e, alla fine, la prima schermata torna dal lato. Con ib_loop, la fila gira quando è abbastanza lunga da fare il giro dello schermo (circa tre elementi in più di quelli che mostra). ALIGN_START non ha effetto sulle altre disposizioni.

// The row of a video service : the covers from the start edge, a screen at a time
uo_covers.is_style = u_pbt_carousel.STYLE_CAROUSEL
uo_covers.is_align = u_pbt_carousel.ALIGN_START

// Small covers : the row holds several screens
uo_covers.ii_item_height = 150

L'elemento davanti #

L'elemento corrente è quello davanti; of_current_key() ne legge la chiave in diretta. Un clic su un vicino lo porta davanti; un clic sull'elemento davanti solleva ue_item_clicked, un doppio clic (o Invio) ue_item_opened. Un cambiamento dell'utente — clic, tastiera, rotellina, scorrimento, punto, freccia, riproduzione automatica — e un cambiamento del vostro codice (of_select_item, of_next, of_previous) sollevano lo stesso ue_current_changed, come SelectItem solleva l'evento del clic. Con ib_veto_changes, ue_current_changing è posto prima, nei due casi: restituire FALSE lascia l'elemento davanti, e of_select_item restituisce allora -4. ue_current_changed parte anche quando l'elemento davanti se ne va (nascosto, rimosso: il più vicino prende il suo posto) e quando il primo elemento arriva in un carosello vuoto (as_from_key vuoto). Un ordine del vostro codice dentro ue_current_changing (un altro elemento selezionato) prevale: la risposta che segue non cambia più nulla. of_select_row porta davanti l'elemento di una riga e of_current_row legge la riga dell'elemento davanti; con ib_sync_row, il DataWindow dato a of_from_datastore segue l'elemento davanti — il master-detail di un DataWindow.

Un elemento disattivato (ib_enabled = false) resta al suo posto, ma l'utente non può né portarlo davanti né cliccarlo: la tastiera, la rotellina, Pag su / Pag giù, la barra di scorrimento e un lancio lo saltano; il vostro codice lo seleziona comunque. Un elemento nascosto (ib_visible = false) esce dal carosello mantenendo la sua chiave e il suo posto. Con ib_loop (almeno tre elementi), il primo segue l'ultimo. Un doppio clic su un vicino lo porta davanti e si ferma lì: né ue_item_clicked né ue_item_opened. il_autoplay_ms fa avanzare il carosello da solo, ogni tot millisecondi (almeno 500): un pulsante PAUSA / RIPRODUZIONE compare sotto di esso (ib_autoplay_button) e la pausa dell'utente tiene fino a RIPRODUZIONE (of_pause, of_play, ue_autoplay_changed); si interrompe anche sotto il puntatore, quando la tastiera è nel componente e quando il carosello è nascosto. Alla fine di un carosello che non gira in tondo, il primo elemento ritorna dal lato. Ogni passo passa da ue_current_changing come un gesto: un elemento rifiutato viene saltato, si chiede il successivo. Un lettore di schermo non viene avvisato di ogni passo durante la riproduzione.


Schede e didascalia scritte da un modello #

Una scheda mostra la sua immagine in alto, il suo titolo (is_title), il suo sottotitolo (is_subtitle), il suo corpo (is_text), le sue etichette (is_tags, separate da virgole, colorate da is_tag_tones: New=success|Sale=danger) e un badge (is_badge). Il corpo di tutte le schede può essere scritto da un modello, is_card_template, e la didascalia sotto il carosello da is_caption_template: testo formattato con tag dove {price} è un campo dell'elemento — uno dei vostri (of_set_field), una colonna del DataStore da cui proviene, o un campo predefinito (key, title, subtitle, text, image, badge, tags, position, count). {position} e {count} contano gli elementi disegnati, come il contatore. {sold:dd/mm/yyyy hh:mm} scrive una data o una data-ora, {price:#,##0.00} un numero: i formati di visualizzazione di una colonna di DataWindow (mm dopo un'ora = i minuti, [shortdate], [longdate], [time], sezioni positivo;negativo;zero), nella lingua di visualizzazione — un valore che il formato non sa scrivere è mostrato così com'è. {?x}…{/x} mantiene un pezzo quando il campo dice qualcosa, {!x}…{/x} quando non dice nulla, {{ }} sono parentesi graffe. Un valore è mostrato così com'è, mai letto come tag; {x:raw} lo mantiene come tag — riservatelo ai vostri campi: su una colonna di database leggerebbe il dato come tag, zone d'azione comprese. {title}, {subtitle}, {text} e {badge} scritti dal vostro codice sono tag, come nella didascalia; letti da una colonna, testo.

// A price, a field of our own, then the body of every card
uo_shop.of_set_field(/*key*/ "p1", /*field*/ "price", /*value*/ "$12.90")
uo_shop.is_card_template = "{?price}From [b]{price}[/b]{/price}{!price}Price on request{/price}"

// Under the carousel : the place of the item in front, then its title
uo_shop.is_caption_template = "{position} / {count} - [b]{title}[/b]"

Da un DataStore #

of_from_datastore fa un elemento di ogni riga di un DataStore, di un DataWindow o di un DataWindowChild — la stessa chiamata. La sua chiave è il RowID della riga — nomina la sua riga finché il DataStore non viene né svuotato né riletto (Reset, Retrieve e ImportString ridanno i RowID 1, 2, 3), e of_item(key).of_row() la ritrova — o il valore della colonna ROLE_KEY, la chiave da dare non appena aggiornate. Una riga la cui chiave è vuota, non valida, già vista o tenuta da un elemento aggiunto a mano non viene caricata: la chiamata restituisce 0 e of_get_last_error la nomina — date ai vostri elementi a mano chiavi che non siano numeri. Una colonna svolge un ruolo quando ne porta il nome (key, title, subtitle, text, image, badge, tags, color) o quando of_map lo dice; la colonna ROLE_COLOR (un RGB() o #rrggbb) colora la banda di una scheda. of_map e of_reload_row aggiornano gli elementi sul posto (indicatori, campi, handle e posto restano). Anche un secondo caricamento, con ROLE_KEY: un elemento la cui chiave torna mantiene i suoi indicatori, i suoi campi e il suo handle. Senza ROLE_KEY, un secondo caricamento è una nuova epoca: un RowID che torna può nominare un altro record, ogni elemento delle righe viene rifatto (nulla è ereditato, gli handle dei vecchi sono liberati) e, se la chiave davanti torna, ue_current_changed lo dice con as_from_key = as_key. In ogni caso gli elementi prendono l'ordine delle righe (un of_move_item non sopravvive a un caricamento), quelli delle righe sparite se ne vanno, quelli aggiunti a mano restano, dopo le righe; un elemento di riga rimosso con of_remove_item torna con la sua riga — nascondetelo piuttosto (ib_visible). Le date sono lette nell'ordine regionale della postazione, i numeri si scrivono con il punto, i valori CHAR senza il loro riempimento, al caricamento come dopo of_reload_row. Ciò che una colonna dà è testo, mai tag — un [action=x] venuto dal database non è cliccabile —, e un'immagine di una colonna non va mai a cercare un percorso di rete (\\server\condivisione: ue_image_failed con REASON_UNC). Quando la colonna ROLE_KEY di una riga riletta cambia, l'elemento prende la nuova chiave: l'handle della vecchia viene liberato. Tutte le colonne sono campi dei modelli.

// The rows of the albums : columns named title and subtitle play their role
ids_albums.Retrieve()

// The picture is in a column with another name
uo_covers.of_map(/*role*/ u_pbt_carousel.ROLE_IMAGE, /*column*/ "cover_file")

// One item per row, its key the RowID of the row
uo_covers.of_from_datastore(/*ads*/ ids_albums)
// Master-detail : the DataWindow follows the item in front, and the carousel reads its rows
uo_covers.ib_sync_row = true
uo_covers.of_from_datastore(/*adw*/ dw_albums)

// event rowfocuschanged of dw_albums : the item of the row comes in front
uo_covers.of_select_row(/*row*/ currentrow)

Proprietà #

ProprietàTipoPredefinitoRuolo
is_stylestringSTYLE_COVERFLOWLa disposizione: STYLE_COVERFLOW (il corrente di fronte, i suoi vicini inclinati in prospettiva), STYLE_CAROUSEL (una striscia piatta, più elementi interi), STYLE_STACK (una pila di schede), STYLE_HERO (un solo elemento su tutta la superficie, un banner). Un altro valore è rifiutato: il vecchio resta, of_get_last_error dice perché
is_item_stylestringITEM_AUTOLa faccia di ogni elemento che non ne sceglie una da sé: ITEM_AUTO (in base a ciò che porta, vedi sopra), ITEM_IMAGE, ITEM_TEXT, ITEM_CARD. Un altro valore è rifiutato
is_fitstringFIT_COVERCome un'immagine riempie il suo riquadro: FIT_COVER (il riquadro è pieno, l'immagine ritagliata) o FIT_CONTAIN (l'immagine intera). Un altro valore è rifiutato
ib_reflectionbooleanfalseUn riflesso sotto gli elementi, come su un pavimento lucido
ib_loopbooleanfalseDopo l'ultimo elemento viene il primo (e prima del primo, l'ultimo). Servono almeno tre elementi
il_autoplay_mslong0Riproduzione automatica: l'elemento successivo viene davanti ogni il_autoplay_ms millisecondi (almeno 500, un valore più piccolo viene portato a esso); 0 la ferma. Un pulsante PAUSA / RIPRODUZIONE compare sotto il carosello (ib_autoplay_button); si interrompe anche sotto il puntatore, quando la tastiera è nel componente e quando il carosello è nascosto. Alla fine di un carosello che non gira in tondo, il primo ritorna dal lato; un elemento che ue_current_changing rifiuta viene saltato
ib_show_captionbooleantrueLa didascalia dell'elemento davanti: il suo titolo (e il suo sottotitolo), sottolineato con l'accento, o ciò che scrive is_caption_template; sta subito sotto di esso o sul suo piede (is_caption_position)
is_caption_positionstringCAPTION_AUTODove sta la didascalia: CAPTION_BELOW (subito sotto l'elemento davanti, sotto il suo riflesso se ne ha uno), CAPTION_OVERLAY (sul suo piede, in bianco su un velo scuro), CAPTION_AUTO (sotto un'immagine — sul suo piede in un banner —, e nessuna sotto schede o testi che scrivono già il loro titolo, a meno che is_caption_template dica cosa scrivere). Un altro valore è rifiutato
ib_autoplay_buttonbooleantrueUn pulsante PAUSA / RIPRODUZIONE sotto il carosello finché il_autoplay_ms gira, e una sottile barra che si riempie fino al prossimo elemento: chi legge può fermare ciò che si muove. La pausa dell'utente tiene fino a RIPRODUZIONE; ue_autoplay_changed lo dice. false: nessun pulsante
is_indicatorstringINDICATOR_AUTOCiò che mostra dove si è, sotto la didascalia: INDICATOR_AUTO (punti fino a 12 elementi, una barra di scorrimento oltre), INDICATOR_DOTS (punti cliccabili, fino a 48 elementi: oltre, la barra), INDICATOR_SCROLLBAR (una barra da cliccare e trascinare), INDICATOR_COUNTER (3 / 12), INDICATOR_NONE. Un altro valore è rifiutato
ib_arrowsbooleantrueI due pulsanti a freccia sui lati: quello di sinistra va sempre a sinistra
ii_item_widthinteger0La larghezza di un riquadro, in pixel (da 24 a 4000, un valore fuori limiti viene riportato dentro); 0: in base alla dimensione del componente e a is_item_ratio. Una larghezza impostata con un'altezza 0: l'altezza segue la proporzione. Senza effetto su STYLE_HERO: il suo elemento prende tutta la superficie
ii_item_heightinteger0L'altezza di un riquadro, in pixel (da 24 a 4000); 0: in base alla dimensione del componente, lasciando vedere i vicini e la didascalia. Un'altezza impostata con una larghezza 0: la larghezza segue la proporzione. Senza effetto su STYLE_HERO
is_item_ratiostring""La proporzione di un riquadro, larghezza:altezza: "1:1", "3:4", "16:9"… Il riquadro la mantiene qualunque sia la dimensione del componente. Vuoto: in base alla faccia della maggior parte degli elementi — 1:1 per immagini, 3:4 per schede, 16:9 per testi. Un valore che non sia due numeri positivi uniti da : è rifiutato. Senza effetto su STYLE_HERO
ii_angleinteger62La rotazione delle copertine sui lati del Cover Flow, in gradi, da 0 (piatte) a 80; 62 è quella di iTunes
ii_spacinginteger100La spaziatura delle copertine del Cover Flow e dei riquadri di una striscia, in percentuale di ciò che il carosello calcola: 100 distribuisce le copertine sulla larghezza disponibile, da 25 a 300 le avvicina o le allontana
ib_shadebooleantrueLe copertine sui lati si scuriscono con la loro distanza, perché l'elemento davanti attiri lo sguardo; anche le schede che aspettano dietro una pila
is_transitionstringTRANSITION_SLIDECome un banner (STYLE_HERO) cambia elemento: TRANSITION_SLIDE (il successivo scivola dal lato) o TRANSITION_FADE (appare in dissolvenza). Un altro valore è rifiutato
is_alignstringALIGN_CENTERDove sta l'elemento corrente su una striscia (STYLE_CAROUSEL): ALIGN_CENTER (al centro) o ALIGN_START (la fila di un servizio video, allineata al bordo d'inizio, che avanza di una schermata: vedi sopra). Nessun effetto sulle altre disposizioni. Un altro valore è rifiutato
is_card_templatestring""Il corpo di ogni scheda, scritto da un modello (vedi sopra). Impostare un modello fa di ogni elemento ITEM_AUTO una scheda. Vuoto: il testo dell'elemento (is_text)
is_caption_templatestring""La didascalia sotto il carosello, scritta da un modello (gli stessi campi). Vuoto: il titolo, e il sottotitolo sotto
is_tag_tonesstring""Il tono di ogni etichetta, etichetta=tono uniti da `: New=successSale=danger. Toni: TONE_SUCCESS, TONE_WARN, TONE_DANGER, TONE_INFO (l'accento), TONE_NEUTRAL`. Un'etichetta non elencata, o un tono sconosciuto, è neutra
is_badge_formatstring""Il formato di visualizzazione dei badge che sono un numero o una data — una colonna ROLE_BADGE del DataStore, o un valore che il vostro codice scrive: "$#,##0.00", "dd/mm/yyyy", il formato di una colonna di DataWindow, nella lingua di visualizzazione. Un badge che non è né l'uno né l'altro (tag, una parola) è mostrato così com'è. Vuoto: ogni badge così com'è
ib_sync_rowbooleanfalseMaster-detail: il DataWindow (o DataWindowChild) dato a of_from_datastore segue l'elemento davanti — ScrollToRow sulla sua riga a ogni cambiamento, gesto o codice. Nell'altro senso, chiamate of_select_row dal suo RowFocusChanged. Un DataStore non ha righe da mostrare: nulla si muove; un elemento aggiunto a mano non ha riga
ib_veto_changesbooleanfalseOpt-in: chiedere ue_current_changing prima di ogni cambiamento dell'elemento davanti, dell'utente, della riproduzione automatica come di of_select_item. La riproduzione automatica salta un elemento rifiutato; la tastiera resta ferma — un elemento sempre rifiutato è meglio disattivarlo. Un ordine del vostro codice in ue_current_changing prevale: la risposta che segue non cambia nulla. Disattivato per impostazione predefinita, come ogni evento annullabile della libreria
ib_animatedbooleantrueGli elementi scivolano fino al loro nuovo posto. Una postazione impostata per ridurre le animazioni salta direttamente, a meno che l'applicazione insista (PBT_SetAnimationPolicy)
ii_anim_durationinteger450Durata di un movimento, in millisecondi (da 0 a 5000)
is_anim_easingstringEASING_EASE_OUTLa curva del movimento: EASING_LINEAR, EASING_EASE_OUT, EASING_BACK_OUT (va un po' oltre poi torna), EASING_BOUNCE_OUT (rimbalza), EASING_ELASTIC_OUT (oscilla)
ib_enabledbooleantruefalse disattiva il carosello: gli elementi restano visibili, più nulla risponde all'utente (clic, tastiera, rotellina, scorrimento, riproduzione automatica)
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

Il suo handle, tramite of_item(key). Una lettura chiede al carosello com'è ora.

ProprietàTipoPredefinitoRuolo
is_titlestring""Titolo dell'elemento: la didascalia quando è davanti, e la prima riga di una scheda. Accetta il testo formattato con tag. Vuoto, l'elemento mostra la sua chiave
is_subtitlestring""La seconda riga, sotto il titolo di una scheda e della didascalia (tag accettati). Un'immagine con un sottotitolo resta un'immagine: il sottotitolo va nella sua didascalia
is_textstring""Il testo (tag accettati): tutta la faccia di un elemento testo, il corpo di una scheda finché is_card_template è vuoto. Una zona [action=x] solleva ue_action_clicked sull'elemento davanti
is_imagestring""L'immagine: un file della postazione, una risorsa file.dll:nome, un glifo mono: / tint: disegnato nel tema, un indirizzo https://. http:// è rifiutato (ue_image_failed, REASON_INSECURE), così come un percorso di rete venuto da una colonna di DataStore (REASON_UNC). Uno scheletro a tema si vede finché l'immagine arriva
is_badgestring""Piccolo badge (tag accettati): un prezzo, un numero, nell'accento — in alto a destra di una scheda, sull'angolo di un'immagine. Un'immagine con un badge resta un'immagine
is_tagsstring""Etichette di una scheda, separate da virgole: Vinyl, Sale. Ognuna è una pastiglia colorata da is_tag_tones del carosello
is_stylestring""La faccia di questo elemento (ITEM_* di u_pbt_carousel); vuoto: segue is_item_style del carosello. Un altro valore è rifiutato: resta il vecchio, of_get_last_error del carosello dice perché
ib_visiblebooleantruefalse toglie l'elemento dal carosello; mantiene la sua chiave e il suo posto. Se era davanti, il più vicino prende il suo posto (ue_current_changed)
ib_enabledbooleantruefalse disattiva l'elemento: l'utente non può né portarlo davanti né cliccarlo, la tastiera e la rotellina lo saltano. Il vostro codice lo seleziona comunque
of_position ( ) → long——Restituisce la posizione dell'elemento nel carosello ora, contata da 1 (elementi nascosti compresi); 0 quando il carosello non lo contiene
of_row ( ) → long——Restituisce il numero di riga di oggi, nelle righe date a of_from_datastore, della riga da cui viene l'elemento — dopo un ordinamento, un filtro o l'eliminazione di altre righe, finché il DataStore non viene né svuotato né riletto; 0 per un elemento aggiunto a mano o la cui riga è sparita
of_face ( ) → string——La faccia con cui l'elemento è disegnato ora: "image", "text" o "card" (ITEM_IMAGE, ITEM_TEXT, ITEM_CARD) — ciò che ha scelto is_style o ciò che ITEM_AUTO ha dedotto; vuoto quando il carosello non lo contiene
is_tooltipstring""Tooltip semplice mostrato al passaggio del mouse sull'item
is_super_tooltip_titlestring""Titolo del tooltip avanzato dell'item (prevale su is_tooltip)
is_super_tooltip_textstring""Testo del tooltip avanzato dell'item (markup avanzato accettato)
is_super_tooltip_imagestring""Immagine del tooltip avanzato dell'item
il_accentlong-1Accento dell'elemento: la banda in alto di una scheda (che fa comparire) e di un pannello di testo, e il badge, lo prendono; prevale sul colore di una colonna ROLE_COLOR. I punti e la didascalia mantengono l'accento del componente. -1 = quello del componente
il_back_colorlong-1Sfondo di una faccia testo o scheda, in RGB(r,g,b) (-1 = quello che dà il tema). Una faccia immagine non ha sfondo
il_text_colorlong-1Colore del testo di una faccia testo o scheda (-1 = quello che dà il tema)
il_back_color_hoverlong-1Sfondo di una faccia testo o scheda sotto il puntatore, in RGB(r,g,b) (-1 = il suo sfondo abituale). Al passaggio nulla si muove : cambia solo il colore
il_text_color_hoverlong-1Colore del testo di una faccia testo o scheda sotto il puntatore (-1 = il suo colore abituale)

Tre letture dell'handle, in sola lettura: of_position() restituisce la posizione dell'elemento a partire da 1, of_row() il numero della sua riga nel DataStore (0 per un elemento aggiunto a mano), of_face() la faccia scelta. Un elemento si sposta con of_move_item del carosello.


Metodi #

MetodoRuolo
of_add_item (string as_key, string as_title)Aggiunge un elemento alla fine del carosello, un titolo solo (una scheda): la sua immagine, il suo testo, il suo sottotitolo… si impostano sul suo handle. La sua chiave è unica nel carosello. Il primo elemento di un carosello vuoto viene davanti (ue_current_changed). Restituisce 0 una volta aggiunto, -5 per una chiave vuota, con / o `, che comincia con __, o già presa (elementi di un DataStore compresi), -2` quando il componente non è creato
of_add_item (string as_key, string as_title, string as_image)Lo stesso con la sua immagine. Con ITEM_AUTO, un'immagine e un titolo soli fanno un elemento immagine, il titolo come didascalia. Restituisce 0 una volta aggiunto, -5 come sopra, -2 quando il componente non è creato
of_clear ( )Svuota il carosello: elementi (quelli di un DataStore compresi) e i loro handle; il DataStore resta legato per un nuovo of_from_datastore, le opzioni restano. Segue ue_current_changed, con una chiave vuota, se c'era un elemento davanti. Restituisce 0 una volta applicato, -2 quando il componente non è creato
of_current_key ( )La chiave dell'elemento davanti, chiunque ve l'abbia portato; vuota quando il carosello è vuoto. Letta in diretta
of_current_row ( )Il numero di riga di oggi, nelle righe date a of_from_datastore, dell'elemento davanti — dopo un ordinamento, un filtro o l'eliminazione di altre righe. Restituisce 0 quando il carosello è vuoto, quando l'elemento davanti è stato aggiunto a mano o la sua riga è sparita
of_from_datastore (datastore ads)Fa un elemento di ogni riga del DataStore (vedi sopra). Un secondo caricamento aggiorna gli elementi sul posto con ROLE_KEY, li rifà senza (una nuova epoca: nulla è ereditato); quelli delle righe sparite se ne vanno (handle liberati), quelli aggiunti a mano restano, dopo le righe; una riga non caricata è nominata da of_get_last_error. Restituisce 0 una volta caricato, -5 quando il DataStore non è valido, -2 quando il componente non è creato
of_from_datastore (datawindow adw)Lo stesso dalle righe di un DataWindow, lette da un DataStore che le condivide (ShareData). Restituisce 0 una volta caricato, -5 quando il DataWindow non è valido o rifiuta di condividere le sue righe (of_get_last_error lo dice), -2 quando il componente non è creato
of_from_datastore (datawindowchild adwc)Lo stesso dalle righe di un DataWindowChild (un elenco a discesa DataWindow, un report annidato). Restituisce 0 una volta caricato, -5 quando non è valido, -2 quando il componente non è creato
of_get_field (string as_key, string as_field)Legge un campo di un elemento, in diretta: uno dei vostri, una colonna del suo DataStore o un campo predefinito (title, position, count…). Una stringa vuota quando non ne ha
of_get_last_error ( )Perché l'ultima chiamata è fallita: un metodo che ha restituito -5 o -4, un valore rifiutato (is_style, is_item_style, is_indicator, is_fit, is_caption_position, is_transition, is_item_ratio, is_align, is_style di un elemento), una chiamata fatta durante un'attesa (nulla ha potuto essere giudicato), le righe che un caricamento ha lasciato fuori. Svuotato da ogni metodo che agisce (una lettura lo lascia); altrimenti l'ultimo errore della libreria
of_insert_item (string as_key, string as_title, string as_image, long al_position)Aggiunge un elemento in una posizione contata da 1 (oltre l'ultima: alla fine). L'elemento davanti resta davanti. Restituisce 0 una volta aggiunto, -5 come of_add_item, -2 quando il componente non è creato
of_is_playing ( )TRUE finché la riproduzione automatica gira: il_autoplay_ms è impostato e nessuno ha premuto PAUSA (un puntatore sul carosello la sospende un istante: gira comunque). Letto in diretta
of_item (string as_key)Restituisce l'handle di un elemento (creato al primo accesso, liberato quando l'elemento è rimosso)
of_map (string as_role, string as_column)Dà un ruolo a una colonna del DataStore quando il suo nome non lo dice (ROLE_KEY, ROLE_TITLE, ROLE_SUBTITLE, ROLE_TEXT, ROLE_IMAGE, ROLE_BADGE, ROLE_TAGS, ROLE_COLOR). Prima o dopo of_from_datastore: dopo, le righe sono rilette sul posto. Una colonna vuota restituisce il ruolo alla colonna che ne porta il nome; un nuovo ROLE_KEY dà nuove chiavi agli elementi (gli handle delle vecchie sono liberati). Restituisce 0 una volta impostato, -5 per un ruolo sconosciuto o una colonna che il DataStore non ha, -2 quando il componente non è creato
of_move_item (string as_key, long al_position)Sposta un elemento in una posizione contata da 1 (oltre l'ultima: l'ultima). L'elemento davanti resta davanti. Restituisce 0 una volta spostato, -5 per un elemento sconosciuto, -2 quando il componente non è creato
of_next ( )Porta davanti l'elemento successivo (quelli disattivati saltati; dopo l'ultimo, il primo con ib_loop), come il tasto freccia verso di esso (Destra, Sinistra da destra a sinistra), e solleva ue_current_changed. Restituisce 0 una volta fatto (anche alla fine: nulla si muove, nulla viene sollevato), -4 quando ue_current_changing ha rifiutato, -5 durante un'attesa (nulla ha potuto essere giudicato), -2 quando il componente non è creato
of_pause ( )Mette in pausa la riproduzione automatica, come il pulsante PAUSA: l'elemento davanti resta fino a of_play (o RIPRODUZIONE). Segue ue_autoplay_changed — un ordine del codice lo solleva come il pulsante. Restituisce 0 una volta in pausa (anche se lo è già: nulla viene sollevato), -5 quando il_autoplay_ms vale 0, -2 quando il componente non è creato
of_play ( )Riavvia la riproduzione automatica dopo una pausa — il pulsante PAUSA dell'utente o of_pause. Segue ue_autoplay_changed. Restituisce 0 una volta ripartita (anche se gira già: nulla viene sollevato), -5 quando il_autoplay_ms vale 0 (niente da riprodurre), -2 quando il componente non è creato
of_previous ( )Porta davanti l'elemento precedente, come il tasto freccia verso di esso. Restituisce 0 una volta fatto (anche all'inizio: nulla si muove, nulla viene sollevato), -4 quando ue_current_changing ha rifiutato, -5 durante un'attesa, -2 quando il componente non è creato
of_reload_row (long al_row)Rinvia al carosello una riga del DataStore di of_from_datastore, letta ora, dopo che il vostro codice l'ha cambiata (SetItem, una finestra di inserimento); il suo elemento è aggiornato sul posto (indicatori, campi, handle e posto restano). Una riga che il carosello non tiene ancora (InsertRow) arriva dopo l'ultimo elemento di riga. Quando la colonna ROLE_KEY della riga è cambiata, l'elemento prende la nuova chiave: l'handle della vecchia è liberato e, se era davanti, ue_current_changed lo dice. Restituisce 0 una volta inviata, -5 quando nulla è collegato, la riga non esiste o la sua chiave è vuota, non valida o tenuta da un altro elemento (of_get_last_error lo dice), -2 quando il componente non è creato
of_remove_item (string as_key)Rimuove un elemento e libera il suo handle; rimuovere l'elemento davanti porta davanti il più vicino (ue_current_changed). Un elemento di riga di un DataStore torna con la sua riga (of_reload_row, un nuovo caricamento): nascondetelo (ib_visible) o eliminate la riga. Restituisce 0 una volta rimosso, -5 per un elemento sconosciuto, -2 quando il componente non è creato
of_reset ( )Svuota il carosello, dimentica il DataStore e riporta ogni proprietà al suo valore predefinito. Restituisce 0 una volta applicato, -2 quando il componente non è creato
of_select_item (string as_key)Porta un elemento davanti, come un clic: scivola fin lì e segue ue_current_changed. Con ib_veto_changes, ue_current_changing è posto prima. Un elemento disattivato è selezionato comunque: la disattivazione ferma l'utente, non il vostro codice. Restituisce 0 una volta fatto (o già davanti: niente è sollevato), -4 quando ue_current_changing ha rifiutato, -5 per un elemento sconosciuto o non disegnato (nascosto, oltre il limite demo), -2 quando il componente non è creato
of_select_row (long al_row)Porta davanti l'elemento di una riga delle righe date a of_from_datastore — al_row è il numero di riga di oggi, qualunque cosa dica ROLE_KEY: il master-detail di un DataWindow, chiamato dal suo RowFocusChanged. Come of_select_item sulla sua chiave: segue ue_current_changed, ib_veto_changes chiede prima. Restituisce 0 una volta davanti (o già davanti), -4 quando ue_current_changing ha rifiutato, -5 quando nulla è collegato, la riga non esiste o non ha dato alcun elemento (lasciata fuori dal caricamento, rimossa, nascosta, oltre il limite demo), -2 quando il componente non è creato
of_set_field (string as_key, string as_field, string as_value)Dà a un elemento un vostro campo, per i modelli: {price}; prevale su una colonna del DataStore con lo stesso nome. Un nome di campo: lettere, cifre e _, senza cifra iniziale. Restituisce 0 una volta impostato, -5 per un elemento sconosciuto o un nome non valido, -2 quando il componente non è creato

Eventi #

EventAttivato quando
ue_current_changed (string as_from_key, string as_key)L'elemento davanti è cambiato: un clic su un vicino, la tastiera, la rotellina, uno scorrimento, un punto, una freccia, la riproduzione automatica, o il vostro codice (of_select_item, of_next, of_previous). Anche quando l'elemento davanti se ne va (nascosto, rimosso: il più vicino prende il suo posto) quando il primo elemento arriva in un carosello vuoto (as_from_key vuoto), e quando un nuovo caricamento senza ROLE_KEY dà la chiave davanti a un altro record (as_from_key = as_key). as_key vuoto: il carosello è vuoto. Con ib_sync_row, il DataWindow collegato mostra già la riga
ue_current_changing (string as_from_key, string as_key) → booleanAnnullabile, posto prima di un cambiamento dell'elemento davanti, solo quando ib_veto_changes = true: gesto, riproduzione automatica e of_select_item (quindi of_next, of_previous). Restituire FALSE lascia l'elemento davanti, e of_select_item restituisce allora -4. Predefinito: TRUE
ue_item_clicked (string as_key)L'elemento davanti è stato cliccato (o premuto Spazio). Un clic su un vicino lo porta invece davanti (ue_current_changed) — e un doppio clic su un vicino lo porta soltanto, senza questo evento; una zona [action=x] solleva invece ue_action_clicked; un elemento disattivato non solleva nulla
ue_item_opened (string as_key)Un doppio clic sull'elemento davanti, o Invio: apritelo. Un doppio clic su un vicino lo porta soltanto davanti
ue_item_rclicked (string as_key, long al_x, long al_y)Un clic destro su un elemento, o il tasto menu (o Maiusc + F10) sull'elemento davanti. al_x, al_y sono pixel dello schermo; per un menu PowerBuilder, PopMenu(PointerX(), PointerY()) della vostra finestra
ue_action_clicked (string as_key, string as_action)È stata cliccata una zona [action=x] del testo dell'elemento davanti: as_action = "x"
ue_autoplay_changed (boolean ab_playing)La riproduzione automatica è stata messa in pausa (ab_playing = false) o ripresa (true): il pulsante PAUSA / RIPRODUZIONE sotto il carosello, o il vostro codice (of_pause, of_play lo sollevano anche). Un puntatore sul carosello la sospende senza sollevarlo
ue_image_failed (string as_key, string as_reason)L'immagine di un elemento non ha potuto essere mostrata: as_reason vale REASON_INSECURE (un indirizzo http://), REASON_UNC (un percorso di rete venuto da una colonna di DataStore, rifiutato prima di ogni richiesta) o REASON_NOT_FOUND (file non trovato). Detto una volta per elemento e per immagine
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)

Tastiera e mouse #


Esempi #

Una vetrina di prodotti #

// A flat strip : several products in full, a counter under it
uo_shop.is_style = u_pbt_carousel.STYLE_CAROUSEL
uo_shop.is_indicator = u_pbt_carousel.INDICATOR_COUNTER

// A product : a picture and a title, then a badge and tags (it becomes a card)
uo_shop.of_add_item(/*key*/ "p1", /*title*/ "Northern Lights", /*image*/ "img\packimages.dll:SVG/COVERS/COVER-01")
uo_shop.of_item(/*key*/ "p1").is_badge = "New"
uo_shop.of_item(/*key*/ "p1").is_tags = "Vinyl, Sale"

// The tone of each tag, and the price in the body of every card
uo_shop.is_tag_tones = "Vinyl=info|Sale=danger"
uo_shop.of_set_field(/*key*/ "p1", /*field*/ "price", /*value*/ "$12.90")
uo_shop.is_card_template = "From [b]{price}[/b]"

Chiedere prima di cambiare elemento #

// Once : ask before the item in front changes
uo_covers.ib_veto_changes = true

// event ue_current_changing of uo_covers : not while the form beside it is not saved
if ib_unsaved then return false
return true

Aprire un elemento di un DataStore nella vostra finestra #

// Local variables
long ll_row

// event ue_item_opened of uo_covers : the row of the item, edited in a RESPONSE window (the code waits for it)
ll_row = uo_covers.of_item(/*key*/ as_key).of_row()
OpenWithParm(w_album_edit, ll_row)

// The row may have changed : the item follows it
uo_covers.of_reload_row(/*row*/ ll_row)

Notizie che scorrono da sole #

// A banner : one item on the whole surface
uo_news.is_style = u_pbt_carousel.STYLE_HERO

// Text items : rich text on a themed panel, with an [action] zone
uo_news.of_add_item(/*key*/ "n1", /*title*/ "Release")
uo_news.of_item(/*key*/ "n1").is_text = "[b]Version 5.0[/b] is out. [action=notes]Read the notes[/action]"
uo_news.of_add_item(/*key*/ "n2", /*title*/ "Webinar")
uo_news.of_item(/*key*/ "n2").is_text = "[b]Webinar[/b] on Thursday at 10:00."
uo_news.of_add_item(/*key*/ "n3", /*title*/ "Support")
uo_news.of_item(/*key*/ "n3").is_text = "[b]Support[/b] answers within one day."

// A new one every 5 seconds, faded in, the first again after the last :
// a PAUSE button shows under the banner
uo_news.is_transition = u_pbt_carousel.TRANSITION_FADE
uo_news.il_autoplay_ms = 5000
uo_news.ib_loop = true
// event ue_action_clicked of uo_news : (string as_key, string as_action)
// The zone [action=notes] of the first item opens the release notes
if as_action = "notes" then Open(w_release_notes)

// The products : one row = one item, its key the product code
ids_products.Retrieve()
uo_shop.of_map(/*role*/ u_pbt_carousel.ROLE_KEY, /*column*/ "code")
uo_shop.of_from_datastore(/*ads*/ ids_products)

// Only the tiles near the one in front are drawn : thousands of rows cost nothing.
// Beyond 12 items a scrollbar replaces the dots ; the user types a name to reach it
uo_shop.of_select_item(/*key*/ "P250")

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_count · of_keys_at · of_hasPercorrere ciò che il componente contiene3.2 Gli item
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