PBToolboxAI v4 ← Site

scheduler — u_pbt_scheduler #

← Riferimento dei componenti · Sommario della guida

Un calendario alla maniera di Outlook: viste giorno, settimana lavorativa, settimana, mese e agenda, fascia « giornata intera », trascinamento per spostare e ridimensionare, risorse affiancate, categorie di colore, e schede e tooltip scritti da modelli. Si riempie appuntamento per appuntamento, o con una sola chiamata da un DataStore — e ogni gesto dell'utente Le restituisce la riga da aggiornare.

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


In breve #

Userobjectu_pbt_scheduler
Classi degli itemn_pbt_scheduler_appointment (un appuntamento, of_appointment) · n_pbt_scheduler_resource (una risorsa, of_resource) · n_pbt_scheduler_category (una categoria, of_category)
Serve perPianificazione di un team, prenotazione di sale o macchine, agenda di un commerciale, appuntamenti di pazienti — tutto ciò che si posa su giorni e ore
Limite in modalità demoI primi 12 appuntamenti dell'intervallo a schermo, per ora di inizio; gli altri restano in memoria senza essere visualizzati — vedere la modalità demo

Avvio rapido #

// open event of the window : a few appointments of the week, in one repaint
uo_sched.of_set_redraw(/*on*/ false)
uo_sched.is_date = "2026-09-21"

// A colour category, then the appointments : a key, a subject, a start and an end
uo_sched.of_add_category(/*key*/ "customer", /*label*/ "Customer", /*color*/ RGB(216, 90, 48))
uo_sched.of_add_appointment(/*key*/ "a1", /*subject*/ "Weekly meeting", /*start*/ "2026-09-21 09:00", /*end*/ "2026-09-21 10:00")
uo_sched.of_appointment(/*key*/ "a1").is_location = "Room 3"
uo_sched.of_add_appointment(/*key*/ "a2", /*subject*/ "ACME visit", /*start*/ "2026-09-23 14:00", /*end*/ "2026-09-23 16:30")
uo_sched.of_appointment(/*key*/ "a2").is_category = "customer"

// Dates only : an all-day appointment, both days included
uo_sched.of_add_appointment(/*key*/ "a3", /*subject*/ "Trade fair", /*start*/ "2026-09-24", /*end*/ "2026-09-25")
uo_sched.of_appointment(/*key*/ "a3").ib_all_day = true
uo_sched.of_set_redraw(/*on*/ true)
// ue_appointment_opened event of uo_sched : (string as_key)
// A double-click, or Enter on the selected appointment : open YOUR editor
wf_edit_appointment(as_key)

Capire il calendario #

Le viste #

is_view sceglie la vista, is_date il giorno attorno al quale si costruisce: la sua settimana, il suo mese. L'utente cambia l'una e l'altro dalla barra degli strumenti del componente (Oggi, precedente, successivo, menu delle viste) — le due proprietà si rileggono dal vivo, e ue_view_changed / ue_date_changed lo segnalano, che il cambiamento venga dall'utente o dal vostro codice.

VistaCosa mostra
VIEW_DAYUn giorno su una griglia oraria
VIEW_WORK_WEEKI giorni lavorativi della settimana (is_work_days) — la vista predefinita
VIEW_WEEKI sette giorni, a partire da ii_first_day_of_week
VIEW_MONTHSei settimane; un appuntamento di più giorni si estende come barra sui suoi giorni
VIEW_AGENDAUn elenco, giorno per giorno, su ii_agenda_days giorni

Le date #

Una data viaggia come testo, "yyyy-mm-dd hh:mm" — nei metodi, nelle proprietà e negli event. È un'ora locale fluttuante: né fuso orario, né ora legale; "2026-09-22 09:00" si visualizza alle 09:00, su tutte le postazioni.

// Local variables
datetime ldt_start

// A "yyyy-mm-dd hh:mm" text back into a PowerBuilder datetime
ldt_start = DateTime(Date(Left(as_start, 10)), Time(Mid(as_start, 12)))

La fascia « giornata intera » #

Sopra la griglia oraria delle viste giorno e settimana, una fascia riceve gli appuntamenti ib_all_day e quelli che durano 24 ore o più: un seminario di tre giorni vi sta in una barra invece di schiacciare tre colonne. ib_all_day_band = false la rimuove. Nella vista mese, questi appuntamenti sono barre che attraversano i loro giorni; gli altri, una riga scritta da is_month_template.

Gli appuntamenti di un DataStore #

of_from_datastore(ids) carica il calendario con una sola chiamata: una riga = un appuntamento, e la sua chiave è il suo numero di riga — è lei che ogni event Le restituisce, pronta per SetItem. Una colonna svolge un ruolo quando ne porta il nome, o quando of_map glielo assegna:

RuoloNomi riconosciuti senza of_map
ROLE_SUBJECTsubject, title
ROLE_START · ROLE_ENDstart, start_date, starts · end, end_date, ends
ROLE_ALL_DAY · ROLE_READ_ONLYall_day, allday · read_only, readonly
ROLE_KEY · ROLE_LOCATION · ROLE_ORGANIZER · ROLE_DESCRIPTION · ROLE_RESOURCE · ROLE_CATEGORY · ROLE_STATUS · ROLE_RECURRING · ROLE_PRIVATE · ROLE_REMINDER · ROLE_CANCELLEDil nome del ruolo: key, location, organizer, description, resource, category, status, recurring, private, reminder, cancelled

Risorse e raggruppamento #

Una risorsa è ciò che si prenota: una persona, una sala, una macchina (of_add_resource). Un appuntamento la nomina con is_resource. Con is_group_by = GROUP_RESOURCE, ogni giorno delle viste giorno e settimana si divide in una colonna per risorsa, e trascinare una scheda in un'altra colonna ne cambia la risorsa — ue_appointment_moved la restituisce in as_resource. ib_visible = false su una risorsa nasconde la sua colonna e i suoi appuntamenti, come togliere la spunta a un calendario in Outlook.

Colori, categorie e stato #

Il colore di una scheda si decide in quest'ordine: l'il_accent impostato su questo appuntamento, poi il colore della sua categoria (of_add_category, is_category), poi quello della sua risorsa, poi l'accento del tema. La striscia a sinistra indica lo stato (is_status, il « Mostra come » di Outlook: occupato, provvisorio, libero, fuori sede, altrove); un appuntamento ib_cancelled è disegnato vuoto, e ib_recurring, ib_private, ib_reminder pongono un piccolo segno sulla scheda.


Proprietà #

ProprietàTipoPredefinitoRuolo
is_viewstringVIEW_WORK_WEEKLa vista visualizzata (VIEW_*). Riletta dal vivo: l'utente la cambia dalla barra degli strumenti. Impostarla solleva ue_view_changed, come il menu delle viste (nulla se la vista non cambia)
is_datestringoggiIl giorno visualizzato, "yyyy-mm-dd": la vista si costruisce attorno (la sua settimana, il suo mese). Riletto dal vivo: le frecce lo spostano. Una volta impostato, is_now non lo sposta più; "" riporta la vista a oggi
is_nowstring""« Adesso », per la linea dell'ora corrente e il pulsante Oggi: "" = l'orologio della postazione; "yyyy-mm-dd hh:mm" lo fissa (dimostrazione, test, riproduzione). Finché is_date non è mai stato impostato, la vista va al suo giorno
ii_first_day_of_weekinteger1Primo giorno della settimana, in numeri ISO come is_work_days: 1 = lunedì … 7 = domenica; 0 è accettato per domenica
is_work_daysstring"1|2|3|4|5"I giorni lavorativi, numeri ISO uniti da | (1 = lunedì … 7 = domenica, 0 accettato per domenica): formano la settimana lavorativa, gli altri sono ombreggiati
is_work_start · is_work_endstring"08:00" · "17:00"L'orario di lavoro, "hh:mm": il resto della giornata è ombreggiato
is_day_start · is_day_endstring"00:00" · "24:00"Le ore che la griglia oraria mostra; ciò che cade fuori è contato al bordo della sua colonna (« ▲ 1 prima », « ▼ 1 dopo »), con ciò che lo scorrimento nasconde sopra o sotto la vista; un clic sul segno porta in vista l'appuntamento nascosto più vicino
ii_slot_minutesinteger30Il passo della griglia in minuti: 5, 10, 15, 20, 30 o 60. Un trascinamento vi si allinea
ii_hour_heightinteger48L'altezza di un'ora, in pixel
is_scroll_timestring"08:00"L'ora a cui la griglia scorre all'apertura di una vista
ib_show_nowbooleantrueLa linea rossa dell'ora corrente
ib_toolbarbooleantrueLa barra degli strumenti: Oggi, precedente, successivo, il titolo, il menu delle viste
ib_week_numbersbooleanfalseI numeri di settimana ISO, nell'angolo della griglia oraria e davanti a ogni riga del mese
ib_read_onlybooleanfalseNiente si sposta, si ridimensiona né si crea con il mouse; Canc non chiede più nulla
ib_all_day_bandbooleantrueLa fascia « giornata intera » sopra la griglia oraria
ib_tooltipsbooleantrueIl tooltip di ogni appuntamento, scritto dai modelli di tooltip
ib_veto_changesbooleanfalseChiede prima di applicare uno spostamento o un ridimensionamento: solleva ue_appointment_changing, che può rifiutare
is_card_templatestring"[b]{subject}[/b]{?location}; {location}{/location}"Il modello della scheda: viste giorno e settimana, agenda, barre del mese — vedere I modelli
is_month_templatestring"{!all_day}{start} {/all_day}{subject}"Una riga della vista mese, per un appuntamento contenuto in un giorno
is_tooltip_title_templatestring"{subject}"Il titolo del tooltip di un appuntamento
is_tooltip_templatestringl'ora, il luogo, l'organizzatoreIl testo del tooltip di un appuntamento — vedere I modelli
is_group_bystringGROUP_NONEGROUP_RESOURCE: una colonna per risorsa sotto ogni giorno, più una colonna (nessuna) alla fine quando un appuntamento non ha una risorsa nota al calendario
is_filterstring""Mostra solo gli appuntamenti che contengono questo testo (oggetto, luogo, organizzatore, descrizione, campi); "" li mostra tutti
is_time_formatstring"hh:mm"Come si scrive un'ora: "hh:mm", "h:mm AM/PM"… (token di I modelli)
ii_agenda_daysinteger7Quanti giorni elenca la vista agenda
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 del componente (un appuntamento ha il suo, scritto dai modelli)
is_super_tooltip_titlestring""Titolo del tooltip arricchito (ha la precedenza su is_tooltip)
is_super_tooltip_textstring""Testo del tooltip arricchito (formattazione con tag accettata)
is_super_tooltip_imagestring""Immagine del tooltip arricchito

Proprietà di un appuntamento #

Un appuntamento si pilota tramite il suo handle, of_appointment("chiave") — creato al primo accesso, resta valido in seguito. Una proprietà letta chiede al componente quanto vale adesso: dopo un trascinamento, is_start e is_end dicono già dove l'utente l'ha rilasciato.

// A handle used once fits on one line
uo_sched.of_appointment(/*key*/ "a1").is_status = n_pbt_scheduler_appointment.STATUS_TENTATIVE
ProprietàTipoPredefinitoRuolo
is_subjectstringquello di of_add_appointmentL'oggetto, ciò che la scheda mostra per primo ({subject})
is_start · is_endstringquelli di of_add_appointmentInizio e fine, "yyyy-mm-dd hh:mm", fine esclusiva; per una giornata intera, date "yyyy-mm-dd", entrambi i giorni inclusi. Qualsiasi altra scrittura (22/09/2026 09:00) è conservata ma mai disegnata
ib_all_daybooleanfalseOccupa giornate intere: disegnato nella fascia « giornata intera »
is_location · is_organizer · is_descriptionstring""Il luogo ({location}), l'organizzatore ({organizer}), un testo più lungo ({description})
is_resourcestring""La chiave della sua risorsa: la sua colonna quando il calendario raggruppa per risorsa, il suo colore quando non ha categoria
is_categorystring""La chiave della sua categoria: il colore della scheda
is_statusstringSTATUS_BUSYIl « Mostra come » di Outlook (STATUS_*), disegnato dalla striscia a sinistra
ib_recurring · ib_private · ib_reminderbooleanfalsePiccoli segni sulla scheda: una ricorrenza, un appuntamento privato, un promemoria
ib_cancelledbooleanfalseUn appuntamento annullato è disegnato vuoto
ib_read_onlybooleanfalseL'utente non può né spostarlo, né ridimensionarlo, né chiederne l'eliminazione
ib_visiblebooleantrueLo nasconde senza rimuoverlo

Come ogni item, un appuntamento porta anche il tooltip comune (is_tooltip, is_super_tooltip_title, is_super_tooltip_text, is_super_tooltip_image) — che allora sostituisce quello dei modelli — e i colori dell'item: il_accent ricolora la scheda e la sua striscia, il_back_color, il_text_color, il_back_color_hover e il_text_color_hover la dipingono a riposo e al passaggio del mouse.

Proprietà di una risorsa e di una categoria #

ProprietàHandleRuolo
is_labeln_pbt_scheduler_resourceIl nome visualizzato sopra la sua colonna quando il calendario raggruppa per risorsa ({resource_label})
il_colorn_pbt_scheduler_resourceIl colore dei suoi appuntamenti che non hanno categoria; -1 = l'accento
ib_visiblen_pbt_scheduler_resourcefalse nasconde la sua colonna e i suoi appuntamenti
is_labeln_pbt_scheduler_categoryIl suo nome ({category_label})
il_colorn_pbt_scheduler_categoryIl colore dei suoi appuntamenti; -1 = l'accento. Una categoria non è disegnata per sé: il tooltip e i cinque colori di elemento che eredita vengono conservati e riletti, senza effetto visibile

Costanti #

FamigliaCostantiPortate da
VistaVIEW_DAY, VIEW_WORK_WEEK, VIEW_WEEK, VIEW_MONTH, VIEW_AGENDAil componente (is_view)
RaggruppamentoGROUP_NONE, GROUP_RESOURCEil componente (is_group_by)
Ruolo di una colonnaROLE_KEY, ROLE_SUBJECT, ROLE_START, ROLE_END, ROLE_ALL_DAY, ROLE_LOCATION, ROLE_ORGANIZER, ROLE_DESCRIPTION, ROLE_RESOURCE, ROLE_CATEGORY, ROLE_STATUS, ROLE_RECURRING, ROLE_PRIVATE, ROLE_REMINDER, ROLE_CANCELLED, ROLE_READ_ONLYil componente (of_map)
StatoSTATUS_BUSY, STATUS_TENTATIVE, STATUS_FREE, STATUS_OOF, STATUS_ELSEWHEREl'handle dell'appuntamento (is_status)

Le costanti si leggono sull'oggetto che le porta: u_pbt_scheduler.VIEW_MONTH per una proprietà del componente, n_pbt_scheduler_appointment.STATUS_OOF per una proprietà di un appuntamento.


Metodi #

Appuntamenti #

MetodoRuolo
of_add_appointment (string as_key, string as_subject, string as_start, string as_end)Aggiunge un appuntamento: la sua chiave (unica), il suo oggetto, inizio e fine "yyyy-mm-dd hh:mm". Tutto il resto passa dal suo handle. Restituisce 0 una volta aggiunto, -5 quando la chiave è vuota, contiene / o `, o è **già presa** (un appuntamento non si aggiorna così: lo fa il suo handle), o quando l'inizio — o una fine indicata — non è scritto yyyy-mm-dd o yyyy-mm-dd hh:mm (String(ldt) scrive 22/09/2026 su una postazione francese: usi l'overload datetime), -2` quando il componente non è creato
of_add_appointment (string as_key, string as_subject, datetime adt_start, datetime adt_end)Lo stesso, da due datetime; una fine nulla vale l'inizio. Per una giornata intera, la fine è l'ultimo giorno stesso, incluso: due volte la stessa data = un giorno. Restituisce 0 una volta aggiunto, -5 quando la chiave è vuota, contiene / o ` o è già presa, o quando l'inizio è nullo, -2` quando il componente non è creato
of_appointment (string as_key)L'handle di un appuntamento (n_pbt_scheduler_appointment), creato al primo accesso — vedere Proprietà di un appuntamento
of_remove_appointment (string as_key)Rimuove un appuntamento. Restituisce 0 una volta rimosso, -5 quando il calendario non ha alcun appuntamento con questa chiave, -2 quando il componente non è creato
of_clear_appointments ( )Rimuove tutti gli appuntamenti; risorse, categorie e opzioni restano. Restituisce 0 una volta inviato, -2 quando il componente non è creato
of_set_field (string as_key, string as_field, string as_value)Dà a un appuntamento un campo Suo, per i modelli: dopo of_set_field("a1", "customer", "ACME"), {customer} scrive ACME sulla sua scheda. Restituisce 0 una volta impostato, -5 quando il campo è vuoto o il calendario non ha alcun appuntamento con questa chiave, -2 quando il componente non è creato
of_get_field (string as_key, string as_field)Legge dal vivo un campo di un appuntamento: uno dei Suoi (of_set_field) o una colonna del DataStore da cui proviene; "" quando non ne ha

DataStore #

MetodoRuolo
of_from_datastore (datastore ads)Il ponte DataStore: una riga = un appuntamento, la sua chiave = il suo numero di riga, ogni colonna = un campo dei modelli. Sostituisce gli appuntamenti visualizzati. Restituisce 0 una volta caricato, -5 quando il DataStore non è valido o non ha colonne, -2 quando il componente non è creato
of_map (string as_role, string as_column)Dà un ruolo (ROLE_*) a una colonna il cui nome non lo dice: of_map(ROLE_SUBJECT, "title_text"). Prima o dopo of_from_datastore: dopo, ogni riga viene riletta com'è ora — un appuntamento rimosso resta rimosso, uno trascinato resta dove è stato rilasciato, i campi di of_set_field e gli appuntamenti aggiunti a mano restano. Restituisce 0 una volta impostato, -5 quando il ruolo non è una delle costanti ROLE_* o quando la colonna non è una di quelle del DataStore dell'ultimo of_from_datastore; un nuovo ROLE_KEY dà a ogni riga una nuova chiave, e gli handle delle vecchie vengono liberati, -2 quando il componente non è creato

Risorse e categorie #

MetodoRuolo
of_add_resource (string as_key, string as_label)Aggiunge una risorsa — una persona, una sala, una macchina; il suo colore e la sua visibilità passano da of_resource. Restituisce 0 una volta aggiunta, -5 quando la chiave è vuota, contiene / o `, o è già presa, -2` quando il componente non è creato
of_resource (string as_key)L'handle di una risorsa (n_pbt_scheduler_resource), creato al primo accesso
of_remove_resource (string as_key)Rimuove una risorsa; i suoi appuntamenti restano — raggruppati per risorsa, nella colonna (nessuna). Restituisce 0 una volta rimossa, -5 quando il calendario non ha alcuna risorsa con questa chiave, -2 quando il componente non è creato
of_clear_resources ( )Rimuove tutte le risorse. Restituisce 0 una volta inviato, -2 quando il componente non è creato
of_add_category (string as_key, string as_label, long al_color)Aggiunge una categoria di colore: gli appuntamenti il cui is_category la nomina ne prendono il colore (-1 = l'accento). Restituisce 0 una volta aggiunta, -5 quando la chiave è vuota, contiene / o `, o è già presa, -2` quando il componente non è creato
of_category (string as_key)L'handle di una categoria (n_pbt_scheduler_category), creato al primo accesso
of_remove_category (string as_key)Rimuove una categoria; i suoi appuntamenti tornano all'accento. Restituisce 0 una volta rimossa, -5 quando il calendario non ha alcuna categoria con questa chiave, -2 quando il componente non è creato
of_clear_categories ( )Rimuove tutte le categorie. Restituisce 0 una volta inviato, -2 quando il componente non è creato
MetodoRuolo
of_next ( )Il giorno, la settimana o il mese successivo — la freccia della barra degli strumenti. Restituisce 0 una volta inviato, -2 quando il componente non è creato
of_previous ( )Il giorno, la settimana o il mese precedente. Restituisce 0 una volta inviato, -2 quando il componente non è creato
of_go_to_today ( )Torna a oggi — il pulsante Oggi. Restituisce 0 una volta inviato, -2 quando il componente non è creato
of_select_appointment (string as_key)Seleziona un appuntamento ("" = nessuno), come un clic: solleva ue_selection_changed (nulla se è già la selezione). Restituisce 0 una volta selezionato, -5 quando il calendario non ha alcun appuntamento con questa chiave, -2 quando il componente non è creato
of_selected_key ( )La chiave dell'appuntamento selezionato, "" quando nessuno — letta dal vivo
of_show_appointment (string as_key)Porta un appuntamento in vista: va al suo giorno, scorre fino alla sua ora e lo seleziona, come un clic: solleva ue_selection_changed. Un giorno che la settimana lavorativa non mostra (un sabato) fa passare la vista alla settimana intera, e ue_view_changed lo segnala. Restituisce 0 una volta mostrato, -5 quando il calendario non ha alcun appuntamento con questa chiave, -2 quando il componente non è creato
of_scroll_to_time (string as_time)Fa scorrere la griglia oraria fino a un'ora, "hh:mm". Restituisce 0 una volta inviato, -5 quando l'ora è vuota, -2 quando il componente non è creato
of_first_visible_date ( ) · of_last_visible_date ( )Il primo e l'ultimo giorno che la vista mostra, "yyyy-mm-dd" — letti dal vivo
of_shown_count ( )Restituisce il numero di appuntamenti visualizzati nell'intervallo a schermo: dopo is_filter, quelli nascosti, le risorse nascoste e il limite della modalità demo (i primi 12 di quell'intervallo); of_count conta tutto il calendario

Event #

EventSollevato quando
ue_appointment_clicked (string as_key)Un appuntamento è stato cliccato (e selezionato)
ue_appointment_opened (string as_key)Doppio clic su un appuntamento, o Invio su quello selezionato: apra il Suo editor
ue_appointment_rclicked (string as_key, long al_x, long al_y)Clic destro su un appuntamento. al_x / al_y sono pixel dello schermo
ue_appointment_changing (string as_key, string as_start, string as_end, string as_resource)Prima che uno spostamento o un ridimensionamento sia applicato, solo se ib_veto_changes è vero. Restituisca false per rimettere l'appuntamento dov'era; true per impostazione predefinita
ue_appointment_moved (string as_key, string as_start, string as_end, string as_resource)L'utente ha trascinato un appuntamento: il suo nuovo inizio, la sua nuova fine e la sua risorsa. Il calendario lo mostra già lì; lo salvi (una riga di DataStore: SetItem sulla riga Long(as_key))
ue_appointment_resized (string as_key, string as_start, string as_end)L'utente ha trascinato un bordo di un appuntamento: il suo nuovo inizio e la sua nuova fine
ue_range_selected (string as_start, string as_end, boolean ab_all_day, string as_resource)L'utente ha percorso delle caselle vuote con il mouse: l'intervallo, per crearvi un appuntamento. Percorso nella fascia « giornata intera » o nella vista mese, sono giorni interi: ab_all_day vale true, solo date, l'ultima inclusa
ue_new_requested (string as_start, string as_end, boolean ab_all_day, string as_resource)L'utente chiede un nuovo appuntamento: doppio clic su una casella o un giorno vuoto, o il + di un'intestazione di giorno (raggruppato per risorsa: di un'intestazione di risorsa). Un giorno intero arriva come sole date, la fine inclusa: due volte la stessa data = un giorno
ue_delete_requested (string as_key)Canc è stato premuto sull'appuntamento selezionato. Lo rimuova (of_remove_appointment) una volta che la Sua applicazione è d'accordo
ue_slot_rclicked (string as_start, boolean ab_all_day, string as_resource, long al_x, long al_y)Clic destro su una casella o un giorno vuoto; per un giorno, as_start è la sua sola data. al_x / al_y sono pixel dello schermo
ue_selection_changed (string as_key)L'appuntamento selezionato è cambiato ("" = nessuno): un clic, o of_select_appointment / of_show_appointment dal vostro codice
ue_view_changed (string as_view)La vista è cambiata: l'utente ne ha scelta un'altra nella barra degli strumenti o ha aperto un giorno con il suo « +N », il vostro codice ha impostato is_view, o of_show_appointment ha fatto passare la settimana lavorativa alla settimana intera per mostrare un giorno festivo
ue_date_changed (string as_first, string as_last)L'intervallo visibile è cambiato (navigazione, vista, data): il suo primo e ultimo giorno, "yyyy-mm-dd", inclusi. Sollevato anche alla prima visualizzazione (sull'intervallo di oggi), poi di nuovo quando il Suo codice imposta is_date o is_view: una finestra che li imposta all'apertura ne riceve due; e dopo ogni of_reset, che svuota il calendario: è una richiesta di dati, non un gesto. È qui che si caricano gli appuntamenti dell'intervallo
ue_ready ( )Il componente ha finito di caricarsi; tutto ciò che era 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 suo colore di sfondo del tema; l'userobject l'ha già adottato (backcolor)

I modelli #

Ciò che una scheda, una riga del mese e un tooltip dicono non è fisso: è un modello che scrive Lei, in testo formattato ([b], [br], [color=…], [symbol=…]…) con dei campi tra graffe. Quattro proprietà li portano: is_card_template (schede delle viste giorno e settimana, agenda, barre del mese), is_month_template (una riga della vista mese), is_tooltip_title_template e is_tooltip_template (il tooltip). Il modello di tooltip predefinito è:

[symbol=clock] {when}{?location}[br][symbol=location] {location}{/location}{?organizer}[br][symbol=person] {organizer}{/organizer}

La sintassi #

ScritturaEffetto
{subject}Il valore del campo, con escape: una [ nell'oggetto si visualizza, non apre un tag
{start:dddd d mmmm}Un campo data in un formato (token qui sotto)
{?location}…{/location}Scrive il blocco solo se il campo dice qualcosa che non è un NO: né vuoto, né 0, N, no o false
{!all_day}…{/all_day}Scrive il blocco solo se il campo è vuoto (o falso)
{description:raw}Inserisce il valore come formattazione, senza escape — per un campo che contiene già dei tag
{{ · }}Una graffa letterale

I formati di data #

I token sono quelli di PowerBuilder; i nomi dei giorni e dei mesi seguono la lingua di visualizzazione. Un testo tra virgolette è scritto così com'è. Gli stessi token servono a is_time_format.

TokenScrive
yyyy · yyL'anno, 2026 · 26
mmmm · mmmIl nome del mese, lungo · corto
mm · mIl mese, 09 · 9 — o i minuti subito dopo un'ora, come in PowerBuilder
dddd · dddIl nome del giorno, lungo · corto
dd · dIl giorno del mese, 05 · 5
hh · hL'ora, 09 · 9 (su 12 ore con AM/PM)
nn · nI minuti, 05 · 5
AM/PM · am/pmL'indicatore del mattino o del pomeriggio

I campi #

CampoValore
key · subject · location · organizer · descriptionLa chiave e i testi dell'appuntamento
resource · resource_labelLa chiave della sua risorsa · il suo nome
category · category_labelLa chiave della sua categoria · il suo nome
status · status_labelLo stato (busy…) · la sua etichetta, tradotta nella lingua di visualizzazione
all_day · recurring · private · reminder · cancelledtrue, o vuoto: pensati per {?…} e {!…}
start · endL'ora di inizio · di fine, nel formato is_time_format (vuota per una giornata intera); con un formato, la data e l'ora — per una giornata intera, {end:…} è l'ultimo giorno, come lo rilegge is_end
dateIl primo giorno, per esteso; con un formato, l'inizio formattato
time09:00-10:30, o « Tutto il giorno »
whenLa frase completa: giorno, ore, e il giorno di fine quando differisce
duration45 min, 1 h 30, 2 days (tradotto)
i SuoiOgni campo impostato da of_set_field, e ogni colonna del DataStore di of_from_datastore, con il suo nome. Un valore che è una data accetta un formato: {due_date:dd/mm}

Un campo sconosciuto scrive una stringa vuota.

I simboli #

Il tag di testo formattato [symbol=nome] pone un simbolo integrato, monocromatico, disegnato nel colore del testo che lo circonda — segue il tema, il passaggio del mouse e il colore della scheda, senza file da distribuire: clock, location, person, people, calendar, repeat, lock, bell, phone, mail, video, note, tag, link, check, star, info, warning. Un nome sconosciuto si visualizza così com'è.


Cosa può fare l'utente senza una riga di codice #

Il calendario non crea, non modifica e non elimina nulla da sé oltre al trascinamento: chiede, la Sua applicazione decide. ib_read_only disattiva tutti questi gesti in una volta, ib_read_only su un appuntamento li disattiva solo per lui.

Da tastiera, una volta raggiunto il calendario:

TastoEffetto
InvioApre l'appuntamento selezionato → ue_appointment_opened
CancChiede l'eliminazione dell'appuntamento selezionato → ue_delete_requested (niente se il calendario o l'appuntamento è in sola lettura)
Freccia su / Freccia giùSeleziona l'appuntamento precedente / successivo della vista, nell'ordine dell'ora di inizio → ue_selection_changed
Pag su / Pag giùIl giorno, la settimana o il mese precedente / successivo
Alt+HomeTorna a oggi
EscAnnulla un trascinamento in corso

Esempi #

Gli appuntamenti di un DataStore, e cosa ne fa l'utente #

Il DataStore ids_appts (variabile d'istanza) ha le colonne subject, start_date, end_date, location, room, category e customer. Le prime quattro svolgono il loro ruolo per nome; room lo riceve da of_map.

// open event of the window : the appointments, retrieved the way your application already does
ids_appts = create datastore
ids_appts.dataobject = "d_appointments"
ids_appts.SetTransObject(SQLCA)
ids_appts.Retrieve()

// "room" is not a role name : say which role it plays, then load every row
uo_sched.of_map(/*role*/ u_pbt_scheduler.ROLE_RESOURCE, /*column*/ "room")
uo_sched.of_from_datastore(/*ads*/ ids_appts)
// ue_appointment_moved event of uo_sched : (string as_key, string as_start, string as_end, string as_resource)
// Local variables
long ll_row

// The key of a row loaded by of_from_datastore is its row number
ll_row = Long(as_key)
ids_appts.SetItem(ll_row, "start_date", DateTime(Date(Left(as_start, 10)), Time(Mid(as_start, 12))))
ids_appts.SetItem(ll_row, "end_date", DateTime(Date(Left(as_end, 10)), Time(Mid(as_end, 12))))
ids_appts.SetItem(ll_row, "room", as_resource)

// Save when YOUR application decides : here, at once
ids_appts.Update()
// ue_appointment_resized event of uo_sched : (string as_key, string as_start, string as_end)
// Local variables
long ll_row

// Only the times change : same row, same two columns
ll_row = Long(as_key)
ids_appts.SetItem(ll_row, "start_date", DateTime(Date(Left(as_start, 10)), Time(Mid(as_start, 12))))
ids_appts.SetItem(ll_row, "end_date", DateTime(Date(Left(as_end, 10)), Time(Mid(as_end, 12))))
ids_appts.Update()

Creare ed eliminare #

// ue_new_requested event of uo_sched : (string as_start, string as_end, boolean ab_all_day, string as_resource)
// Local variables
long ll_row

// A new row, prefilled with the slot the user chose
ll_row = ids_appts.InsertRow(0)
ids_appts.SetItem(ll_row, "subject", "New appointment")
ids_appts.SetItem(ll_row, "start_date", DateTime(Date(Left(as_start, 10)), Time(Mid(as_start, 12))))
ids_appts.SetItem(ll_row, "end_date", DateTime(Date(Left(as_end, 10)), Time(Mid(as_end, 12))))
ids_appts.SetItem(ll_row, "room", as_resource)

// Reload (the row numbers are the keys), then bring the new one into view
uo_sched.of_from_datastore(/*ads*/ ids_appts)
uo_sched.of_show_appointment(/*key*/ String(ll_row))
// ue_delete_requested event of uo_sched : (string as_key)
// Ask first : the calendar never deletes by itself
if MessageBox("Delete", "Delete this appointment?", Question!, YesNo!) = 2 then return
ids_appts.DeleteRow(Long(as_key))
ids_appts.Update()

// The rows after it changed number : reload
uo_sched.of_from_datastore(/*ads*/ ids_appts)

Una colonna per sala #

// The rooms, each with its own colour, side by side under each day
uo_sched.of_set_redraw(/*on*/ false)
uo_sched.of_add_resource(/*key*/ "r1", /*label*/ "Room A")
uo_sched.of_add_resource(/*key*/ "r2", /*label*/ "Room B")
uo_sched.of_resource(/*key*/ "r1").il_color = RGB(15, 108, 189)
uo_sched.of_resource(/*key*/ "r2").il_color = RGB(31, 158, 117)
uo_sched.is_group_by = u_pbt_scheduler.GROUP_RESOURCE
uo_sched.is_view = u_pbt_scheduler.VIEW_DAY

// Each appointment names its room
uo_sched.of_add_appointment(/*key*/ "k1", /*subject*/ "Kickoff", /*start*/ "2026-09-22 09:00", /*end*/ "2026-09-22 10:00")
uo_sched.of_appointment(/*key*/ "k1").is_resource = "r1"
uo_sched.of_add_appointment(/*key*/ "k2", /*subject*/ "Interview", /*start*/ "2026-09-22 10:30", /*end*/ "2026-09-22 11:30")
uo_sched.of_appointment(/*key*/ "k2").is_resource = "r2"
uo_sched.of_set_redraw(/*on*/ true)
// A checkbox of the window hides Room B and its appointments, like unticking a calendar in Outlook
uo_sched.of_resource(/*key*/ "r2").ib_visible = cbx_room_b.checked

Schede e tooltip Suoi #

// The card : the time, the subject in bold, the customer (a DataStore column) when there is one
uo_sched.is_card_template = "{start} [b]{subject}[/b]{?customer}[br][symbol=people] {customer}{/customer}"

// The month line : a small lock on the private ones
uo_sched.is_month_template = "{?private}[symbol=lock] {/private}{subject}"

// The tooltip : the date written out, the duration, the status
uo_sched.is_tooltip_title_template = "{subject}"
uo_sched.is_tooltip_template = "[symbol=calendar] {start:dddd d mmmm}, {time} ({duration})[br][symbol=info] {status_label}"

Rifiutare uno spostamento #

// Ask before any move or resize is applied
uo_sched.ib_veto_changes = true
// ue_appointment_changing event of uo_sched : (string as_key, string as_start, string as_end, string as_resource) returns boolean
// 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

Caricare solo ciò che si vede #

Su anni di storico, inutile leggere tutto: ue_date_changed fornisce l'intervallo a schermo a ogni navigazione, e alla prima visualizzazione. Qui d_appointments prende due argomenti datetime, inizio e fine dell'intervallo.

// ue_date_changed event of uo_sched : (string as_first, string as_last)
// The last day is INCLUDED : read up to the start of the day after
ids_appts.Retrieve(DateTime(Date(as_first)), DateTime(RelativeDate(Date(as_last), 1)))
uo_sched.of_from_datastore(/*ads*/ ids_appts)

Il Suo menu su un appuntamento #

// ue_appointment_rclicked event of uo_sched : (string as_key, long al_x, long al_y)
// Local variables
m_appointment lm_menu

// Remember which appointment the menu is about, then open YOUR menu under the pointer
is_menu_key = as_key
lm_menu = create m_appointment
lm_menu.m_popup.PopMenu(parent.PointerX(), parent.PointerY())
destroy lm_menu

Buone pratiche #

Limiti della 4.0 #

Ciò che il calendario non fa — da sapere prima di sceglierlo:

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à

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