PBToolboxAI v2 ← Site

toaster — n_pbt_toaster #

← Riferimento dei componenti · Sommario della guida

Notifiche « toast » in un angolo dello schermo: un messaggio che appare, informa e scompare senza bloccare l'utente né interrompere la sua digitazione.

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


In breve #

Oggetton_pbt_toaster — non visuale: niente da collocare nella finestra
Serve perConfermare un'azione riuscita, segnalare un avviso o un errore, senza interrompere il lavoro in corso
RitornoNon bloccante: of_show() restituisce subito il controllo; le reazioni dell'utente tornano tramite event

Il toast è una finestra staccata: fluttua sopra la Sua applicazione (o sopra tutto lo schermo) e si chiude da solo.

n_pbt_toaster lnv_toast

lnv_toast = create n_pbt_toaster
// ... configurazione ...
destroy lnv_toast

Avvio rapido #

n_pbt_toaster lnv_toast

lnv_toast = create n_pbt_toaster

lnv_toast.ipo_owner = this                       // finestra a cui il toast si aggancia
lnv_toast.is_kind   = lnv_toast.KIND_SUCCESS     // icona verde + bordino di successo
lnv_toast.is_text   = "Le Sue modifiche sono state [b]salvate[/b]."
lnv_toast.of_show()

destroy lnv_toast

Tutto si configura tramite proprietà, poi of_show() — che non accetta alcun argomento — fa apparire la notifica.


Proprietà #

Da impostare prima di of_show.

ProprietàTipoPredefinitoRuolo
is_textstring""Corpo del messaggio. Accetta il testo formattato con tag
is_kindstringKIND_INFOLivello: governa l'icona e il colore del bordino. Costanti KIND_*
is_positionstringPOSITION_BOTTOM_RIGHTAngolo di ancoraggio. Costanti POSITION_*
ib_screenbooleanfalsefalse = ancorato all'angolo della finestra; true = ancorato all'angolo dello schermo, fluttuante sopra tutto
il_timeoutlongTIMEOUT_AUTODurata di visualizzazione in millisecondi prima della chiusura automatica. TIMEOUT_AUTO (-1, il valore predefinito) vale 4 s per un'informazione ma fino al clic per un errore — un errore che sparisce dopo quattro secondi è un errore perduto. TIMEOUT_UNTIL_CLICKED (0) rende persistente qualunque toast; una durata esplicita viene rispettata così com'è. Finché il puntatore resta sul toast il conto alla rovescia è sospeso, e una barra mostra il tempo restante
is_titlestring""Riga di titolo in grassetto sopra il messaggio (toast avanzato)
is_imagestring""Immagine illustrativa a sinistra, al posto dell'icona di livello (forme accettate: percorso, mono:, risorsa di DLL)
is_keystring""Chiave del toast: rimostrare la stessa chiave aggiorna il toast già a schermo invece di aprirne un secondo. È ciò di cui ha bisogno una notifica di avanzamento («Export 3/10» poi «4/10»): chiudere e riaprire farebbe ripartire l'animazione e scomporrebbe la pila. Lasci vuoto per un toast ordinario
il_max_visiblelong5Numero massimo di toast a schermo nello stesso angolo (da 1 a 20). Oltre, i successivi aspettano e compaiono man mano che si libera posto: un ciclo di elaborazione che emette un toast per riga impilava altrimenti le finestre fuori dallo schermo
ipo_ownerpowerobject—L'oggetto visuale a cui il toast è agganciato (il suo angolo di finestra serve da riferimento)
ipo_receiverpowerobject—L'oggetto visuale che riceve gli event del toast. Lo lasci vuoto per una notifica senza ritorno

Costanti #

CostanteValoreUso
KIND_INFO"info"Informazione neutra
KIND_SUCCESS"success"Operazione riuscita
KIND_WARNING"warning"Avviso
KIND_ERROR"error"Fallimento
POSITION_TOP_LEFT"top-left"Angolo in alto a sinistra
POSITION_TOP_CENTER"top-center"In alto, centrato
POSITION_TOP_RIGHT"top-right"Angolo in alto a destra
POSITION_BOTTOM_LEFT"bottom-left"Angolo in basso a sinistra
POSITION_BOTTOM_CENTER"bottom-center"In basso, centrato
POSITION_BOTTOM_RIGHT"bottom-right"Angolo in basso a destra (predefinito)

Perché LEFT/RIGHT qui, e START/END altrove? Il toast è una finestra di sistema posizionata in pixel dello schermo, non un contenuto che segue un senso di lettura: un angolo dello schermo non ha un « inizio ». Queste costanti restano quindi volutamente fisiche e non cambiano lato quando l'applicazione passa alla scrittura da destra a sinistra. Vedere Lingua e RTL.


Metodi #

MetodoRuolo
of_show ( ) → longVisualizza la notifica costruita a partire dalle proprietà. Restituisce l'identificatore del toast (> 0), oppure un valore negativo in caso di errore. Non blocca
of_close ( long al_id ) → longChiude un toast ancora visualizzato, indicato dall'identificatore restituito da of_show. Restituisce 0, oppure -5 se l’identificatore è vuoto o indica un toast già scomparso
of_reset ( )Riporta tutte le proprietà di contenuto ai valori predefiniti e cancella i pulsanti (ipo_owner e ipo_receiver vengono conservati: sono collegamenti, non contenuto). Restituisce 0 una volta applicato, -2 se il componente non è creato
of_process_events ( )Svuota la coda dei ritorni del toast e attiva i corrispondenti event ue_toast_* — vedere più avanti
of_add_button (string as_key, string as_label {, string as_image }) → longAggiunge un pulsante d'azione (al massimo 3) e ne restituisce il numero. Un clic emette ue_toast_action(id, chiave); of_reset azzera i pulsanti. Un'etichetta può contenere qualunque carattere — una virgola, un segno di uguale — senza essere tagliata
of_count ( ) → integerQuanti pulsanti d'azione porta la notifica
of_keys_at ( integer ai_index ) → stringLa chiave del pulsante di rango ai_index (a partire da 1), oppure "" oltre l'uno o l'altro estremo
of_has ( string as_key ) → booleanÈ stato aggiunto un pulsante sotto questa chiave? Chiedere evita di aggiungerne un secondo sotto una chiave già presa

Più toast visualizzati nello stesso angolo si impilano automaticamente. Ciascuno porta una croce di chiusura; l'identificatore restituito da of_show permette di distinguerli negli event e di chiuderli dal Suo codice.

Il conto alla rovescia si sospende finché il puntatore è sul toast: una notifica non deve svanire sotto gli occhi di chi la legge. Una sottile barra in basso mostra il tempo restante — e quindi spiega la sua sparizione. Un clic sul corpo risponde e chiude, in entrambe le modalità di hosting.

Una notifica impostata con il_timeout = 0 resta a schermo finché nessuno la chiude: conservi il suo identificatore per poterla rimuovere quando l'attività che annuncia è terminata.

long ll_toast

// Notifica persistente : restera visualizzata fino a of_close.
inv_toaster.is_text = "Esportazione in corso..."
inv_toaster.il_timeout = /*ms, 0 = nessuna chiusura automatica*/ 0
ll_toast = inv_toaster.of_show()

// ... elaborazione lunga ...

inv_toaster.of_close(/*key*/ ll_toast)

Event — il toast Le risponde #

Una notifica non è un semplice « visualizza e dimentica »: può dirLe che è stata cliccata, che è stato scelto un pulsante d'azione, o che si è chiusa.

Poiché il toast vive in una finestra staccata, il collegamento avviene in tre passaggi.

1. Designare l'oggetto visuale destinatario:

inv_toaster.ipo_owner    = this
inv_toaster.ipo_receiver = this      // questo userobject / questa finestra ricevera i ritorni

ipo_receiver deve essere un oggetto visuale (finestra o userobject). Un oggetto non visuale non può ricevere notifiche di sistema.

2. Dichiarare su questo oggetto visuale un event mappato su pbm_custom02, che svuota la coda:

// event ue_toast_notified, mappato su pbm_custom02
if IsValid(inv_toaster) then inv_toaster.of_process_events()

3. Trattare gli event attivati sul toaster:

EventAttivato quando
ue_toast_clicked (string as_key)Viene cliccato il corpo del toast (non un pulsante)
ue_toast_action (string as_key, string as_action)Viene cliccato un pulsante d'azione; as_action contiene la chiave passata a of_add_button
ue_toast_dismissed (string as_key)Il toast si chiude: tempo scaduto, croce di chiusura, oppure dopo un'azione

Senza ipo_receiver, la notifica appare e scompare senza mai restituire nulla — è la modalità più semplice, perfetta per una semplice conferma.


Esempi #

I quattro livelli #

inv_toaster.of_reset()
inv_toaster.is_kind = inv_toaster.KIND_INFO
inv_toaster.is_text = "Operazione terminata."
inv_toaster.of_show()

inv_toaster.of_reset()
inv_toaster.is_kind = inv_toaster.KIND_SUCCESS
inv_toaster.is_text = "Le Sue modifiche sono state [b]salvate[/b]."
inv_toaster.of_show()

inv_toaster.of_reset()
inv_toaster.is_kind    = inv_toaster.KIND_WARNING
inv_toaster.il_timeout = 5000                        // un po' piu lungo
inv_toaster.is_text    = "Spazio su disco insufficiente sull'unità C:."
inv_toaster.of_show()

inv_toaster.of_reset()
inv_toaster.is_kind    = inv_toaster.KIND_ERROR
inv_toaster.il_timeout = 6000
inv_toaster.is_text    = "Impossibile contattare il server."
inv_toaster.of_show()

Scegliere l'angolo, nella finestra o sullo schermo #

// Ancorato all'angolo in alto a destra della FINESTRA (predefinito : segue l'applicazione)
inv_toaster.is_position = inv_toaster.POSITION_TOP_RIGHT
inv_toaster.ib_screen   = false
inv_toaster.is_text     = "Ancorato all'angolo della finestra."
inv_toaster.of_show()
// Staccato : ancorato all'angolo dello SCHERMO, visibile anche se la finestra e ridotta a icona
inv_toaster.is_position = inv_toaster.POSITION_TOP_RIGHT
inv_toaster.ib_screen   = true
inv_toaster.is_text     = "Elaborazione notturna terminata."
inv_toaster.of_show()

Toast avanzato: titolo, immagine e durata #

inv_toaster.of_reset()

inv_toaster.is_title    = "Backup completato"
inv_toaster.is_text     = "1 240 file copiati in [b]\\server\backup[/b]."
inv_toaster.is_image    = "mono:img\backup.svg"
inv_toaster.il_timeout  = 8000                    // resta 8 secondi
inv_toaster.of_show()

Notifica con pulsanti d'azione #

// event open : collegare il ritorno una volta per tutte
inv_toaster.ipo_owner    = this
inv_toaster.ipo_receiver = this
// Proporre due azioni ; timeout 0 = il toast attende la decisione dell'utente
inv_toaster.of_reset()

inv_toaster.is_title   = "Aggiornamento disponibile"
inv_toaster.is_text    = "La versione 2.0 è pronta per essere installata."
inv_toaster.il_timeout = 0
inv_toaster.of_add_button(/*chiave*/ "installer", /*etichetta*/ "Installa")
inv_toaster.of_add_button(/*chiave*/ "plus_tard", /*etichetta*/ "Piu tardi")
inv_toaster.of_show()
// event ue_toast_notified della finestra, mappato su pbm_custom02
if IsValid(inv_toaster) then inv_toaster.of_process_events()
// event ue_toast_action di inv_toaster : (string as_key, string as_action)
choose case as_action
    case "installer" ; of_lancer_mise_a_jour()
    case "plus_tard" ; of_reporter(1)
end choose

Reagire al clic sul messaggio #

// event ue_toast_clicked di inv_toaster : (string as_key)
// L'utente ha cliccato il corpo del toast : aprire la schermata interessata
Open(w_journal_import)

Notificare da un'elaborazione lunga #

// Fine di un'importazione : informare senza bloccare la schermata di digitazione
inv_toaster.of_reset()

if ll_erreurs = 0 then
    inv_toaster.is_kind = inv_toaster.KIND_SUCCESS
    inv_toaster.is_text = "Importazione terminata : [b]" + String(ll_lignes) + " righe[/b] integrate."
else
    inv_toaster.is_kind    = inv_toaster.KIND_ERROR
    inv_toaster.il_timeout = 0                    // un errore deve essere letto
    inv_toaster.is_text    = "Importazione interrotta : " + String(ll_erreurs) + " errori."
end if

inv_toaster.of_show()

Buone pratiche #


← Riferimento dei componenti · Sommario della guida