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 #
| Userobject | u_pbt_scheduler |
| Classi degli item | n_pbt_scheduler_appointment (un appuntamento, of_appointment) · n_pbt_scheduler_resource (una risorsa, of_resource) · n_pbt_scheduler_category (una categoria, of_category) |
| Serve per | Pianificazione 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à demo | I 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.
| Vista | Cosa mostra |
|---|---|
VIEW_DAY | Un giorno su una griglia oraria |
VIEW_WORK_WEEK | I giorni lavorativi della settimana (is_work_days) — la vista predefinita |
VIEW_WEEK | I sette giorni, a partire da ii_first_day_of_week |
VIEW_MONTH | Sei settimane; un appuntamento di più giorni si estende come barra sui suoi giorni |
VIEW_AGENDA | Un 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.
- La fine è esclusiva. Un appuntamento dalle 09:00 alle 10:00 finisce alle 10:00: il successivo, che inizia alle 10:00, non si sovrappone. Senza fine, un appuntamento dura 30 minuti.
- Una data senza ora include i suoi due giorni.
"2026-09-24"→"2026-09-25"conib_all_day = trueè il 24 e il 25. Per una giornata intera l'ora è ignorata: una colonna datetime di DataWindow, che porta00:00:00, dà dei giorni, l'ultimo incluso. - Ciò che il calendario accetta anche:
"2026-09-22T09:30", i secondi, e il testo di una colonna datetime di DataWindow.of_add_appointmentha un overload che prende duedatetime. - Ciò che gli event restituiscono: le date nella forma in cui le avete scritte —
"yyyy-mm-dd hh:mm", fine esclusiva, per un appuntamento con orario; solo date, entrambi i giorni inclusi, per una giornata intera. È anche ciò cheis_starteis_endrileggono sull'handle.
// 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:
| Ruolo | Nomi riconosciuti senza of_map |
|---|---|
ROLE_SUBJECT | subject, title |
ROLE_START · ROLE_END | start, start_date, starts · end, end_date, ends |
ROLE_ALL_DAY · ROLE_READ_ONLY | all_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_CANCELLED | il nome del ruolo: key, location, organizer, description, resource, category, status, recurring, private, reminder, cancelled |
- Una colonna booleana vale vero per
1,true,Yoyes. Una colonnastatusporta i valori diSTATUS_*(busy,tentative,free,oof,elsewhere). Ogni nome è riconosciuto anche con il prefissois_: is_private, poichéprivateè una parola riservata di PowerScript. - Tutte le colonne, con ruolo o no, sono campi dei modelli: una colonna
customersi scrive{customer}sulla scheda, e si legge conof_get_field. - Una colonna che svolge
ROLE_KEYsostituisce il numero di riga come chiave: da riservare ai dati che non ricarica da quel DataStore. I suoi valori devono essere unici e non vuoti: una riga che non lo rispetta (o il cui valore contiene/o|) tiene il suo numero di riga come chiave, eue_script_errorlo segnala una volta. - Il calendario non modifica mai il DataStore: Le dice cosa ha fatto l'utente (
ue_appointment_moved,ue_appointment_resized), Lei esegueSetItem, poiUpdate()quando la Sua applicazione lo decide. - Dopo un
InsertRow, unDeleteRow, unSorto unFilter, i numeri di riga cambiano: richiamiof_from_datastore.
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à | Tipo | Predefinito | Ruolo |
|---|---|---|---|
is_view | string | VIEW_WORK_WEEK | La 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_date | string | oggi | Il 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_now | string | "" | « 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_week | integer | 1 | Primo giorno della settimana, in numeri ISO come is_work_days: 1 = lunedì … 7 = domenica; 0 è accettato per domenica |
is_work_days | string | "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_end | string | "08:00" · "17:00" | L'orario di lavoro, "hh:mm": il resto della giornata è ombreggiato |
is_day_start · is_day_end | string | "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_minutes | integer | 30 | Il passo della griglia in minuti: 5, 10, 15, 20, 30 o 60. Un trascinamento vi si allinea |
ii_hour_height | integer | 48 | L'altezza di un'ora, in pixel |
is_scroll_time | string | "08:00" | L'ora a cui la griglia scorre all'apertura di una vista |
ib_show_now | boolean | true | La linea rossa dell'ora corrente |
ib_toolbar | boolean | true | La barra degli strumenti: Oggi, precedente, successivo, il titolo, il menu delle viste |
ib_week_numbers | boolean | false | I numeri di settimana ISO, nell'angolo della griglia oraria e davanti a ogni riga del mese |
ib_read_only | boolean | false | Niente si sposta, si ridimensiona né si crea con il mouse; Canc non chiede più nulla |
ib_all_day_band | boolean | true | La fascia « giornata intera » sopra la griglia oraria |
ib_tooltips | boolean | true | Il tooltip di ogni appuntamento, scritto dai modelli di tooltip |
ib_veto_changes | boolean | false | Chiede prima di applicare uno spostamento o un ridimensionamento: solleva ue_appointment_changing, che può rifiutare |
is_card_template | string | "[b]{subject}[/b]{?location}; {location}{/location}" | Il modello della scheda: viste giorno e settimana, agenda, barre del mese — vedere I modelli |
is_month_template | string | "{!all_day}{start} {/all_day}{subject}" | Una riga della vista mese, per un appuntamento contenuto in un giorno |
is_tooltip_title_template | string | "{subject}" | Il titolo del tooltip di un appuntamento |
is_tooltip_template | string | l'ora, il luogo, l'organizzatore | Il testo del tooltip di un appuntamento — vedere I modelli |
is_group_by | string | GROUP_NONE | GROUP_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_filter | string | "" | Mostra solo gli appuntamenti che contengono questo testo (oggetto, luogo, organizzatore, descrizione, campi); "" li mostra tutti |
is_time_format | string | "hh:mm" | Come si scrive un'ora: "hh:mm", "h:mm AM/PM"… (token di I modelli) |
ii_agenda_days | integer | 7 | Quanti giorni elenca la vista agenda |
is_theme_style | string | "" | Stile visivo del componente (costanti THEME_STYLE_*); vuoto = quello dell'applicazione, seguito a ogni cambio |
is_theme_mode | string | "" | Variante chiara o scura (costanti THEME_MODE_*); vuoto = quella dell'applicazione, seguita a ogni cambio |
il_theme_accent | long | -1 | Colore d'accento di questo componente (-1 = accento dell'applicazione, o quello del tema) |
is_tooltip | string | "" | Tooltip semplice del componente (un appuntamento ha il suo, scritto dai modelli) |
is_super_tooltip_title | string | "" | Titolo del tooltip arricchito (ha la precedenza su is_tooltip) |
is_super_tooltip_text | string | "" | Testo del tooltip arricchito (formattazione con tag accettata) |
is_super_tooltip_image | string | "" | 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à | Tipo | Predefinito | Ruolo |
|---|---|---|---|
is_subject | string | quello di of_add_appointment | L'oggetto, ciò che la scheda mostra per primo ({subject}) |
is_start · is_end | string | quelli di of_add_appointment | Inizio 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_day | boolean | false | Occupa giornate intere: disegnato nella fascia « giornata intera » |
is_location · is_organizer · is_description | string | "" | Il luogo ({location}), l'organizzatore ({organizer}), un testo più lungo ({description}) |
is_resource | string | "" | La chiave della sua risorsa: la sua colonna quando il calendario raggruppa per risorsa, il suo colore quando non ha categoria |
is_category | string | "" | La chiave della sua categoria: il colore della scheda |
is_status | string | STATUS_BUSY | Il « Mostra come » di Outlook (STATUS_*), disegnato dalla striscia a sinistra |
ib_recurring · ib_private · ib_reminder | boolean | false | Piccoli segni sulla scheda: una ricorrenza, un appuntamento privato, un promemoria |
ib_cancelled | boolean | false | Un appuntamento annullato è disegnato vuoto |
ib_read_only | boolean | false | L'utente non può né spostarlo, né ridimensionarlo, né chiederne l'eliminazione |
ib_visible | boolean | true | Lo 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à | Handle | Ruolo |
|---|---|---|
is_label | n_pbt_scheduler_resource | Il nome visualizzato sopra la sua colonna quando il calendario raggruppa per risorsa ({resource_label}) |
il_color | n_pbt_scheduler_resource | Il colore dei suoi appuntamenti che non hanno categoria; -1 = l'accento |
ib_visible | n_pbt_scheduler_resource | false nasconde la sua colonna e i suoi appuntamenti |
is_label | n_pbt_scheduler_category | Il suo nome ({category_label}) |
il_color | n_pbt_scheduler_category | Il 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 #
| Famiglia | Costanti | Portate da |
|---|---|---|
| Vista | VIEW_DAY, VIEW_WORK_WEEK, VIEW_WEEK, VIEW_MONTH, VIEW_AGENDA | il componente (is_view) |
| Raggruppamento | GROUP_NONE, GROUP_RESOURCE | il componente (is_group_by) |
| Ruolo di una colonna | ROLE_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_ONLY | il componente (of_map) |
| Stato | STATUS_BUSY, STATUS_TENTATIVE, STATUS_FREE, STATUS_OOF, STATUS_ELSEWHERE | l'handle dell'appuntamento (is_status) |
Le costanti si leggono sull'oggetto che le porta:
u_pbt_scheduler.VIEW_MONTHper una proprietà del componente,n_pbt_scheduler_appointment.STATUS_OOFper una proprietà di un appuntamento.
Metodi #
Appuntamenti #
| Metodo | Ruolo | |
|---|---|---|
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 #
| Metodo | Ruolo |
|---|---|
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 #
| Metodo | Ruolo | |
|---|---|---|
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 |
Navigazione e selezione #
| Metodo | Ruolo |
|---|---|
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 #
| Event | Sollevato 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 #
| Scrittura | Effetto |
|---|---|
{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.
| Token | Scrive |
|---|---|
yyyy · yy | L'anno, 2026 · 26 |
mmmm · mmm | Il nome del mese, lungo · corto |
mm · m | Il mese, 09 · 9 — o i minuti subito dopo un'ora, come in PowerBuilder |
dddd · ddd | Il nome del giorno, lungo · corto |
dd · d | Il giorno del mese, 05 · 5 |
hh · h | L'ora, 09 · 9 (su 12 ore con AM/PM) |
nn · n | I minuti, 05 · 5 |
AM/PM · am/pm | L'indicatore del mattino o del pomeriggio |
I campi #
| Campo | Valore |
|---|---|
key · subject · location · organizer · description | La chiave e i testi dell'appuntamento |
resource · resource_label | La chiave della sua risorsa · il suo nome |
category · category_label | La chiave della sua categoria · il suo nome |
status · status_label | Lo stato (busy…) · la sua etichetta, tradotta nella lingua di visualizzazione |
all_day · recurring · private · reminder · cancelled | true, o vuoto: pensati per {?…} e {!…} |
start · end | L'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 |
date | Il primo giorno, per esteso; con un formato, l'inizio formattato |
time | 09:00-10:30, o « Tutto il giorno » |
when | La frase completa: giorno, ore, e il giorno di fine quando differisce |
duration | 45 min, 1 h 30, 2 days (tradotto) |
| i Suoi | Ogni 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 #
- navigare: Oggi, precedente, successivo, e il menu delle viste della barra degli strumenti;
- spostare un appuntamento verso un'altra ora, un altro giorno o un'altra risorsa, trascinandolo — il passo segue
ii_slot_minutes; - ridimensionare un appuntamento trascinandone il bordo;
- percorrere delle caselle vuote per scegliere un intervallo →
ue_range_selected— nella fascia « giornata intera » o nella vista mese, giorni interi; - chiedere un appuntamento con un doppio clic su una casella vuota o con il + di un'intestazione di giorno (di un'intestazione di risorsa quando il calendario è raggruppato) →
ue_new_requested; - aprire un appuntamento con un doppio clic →
ue_appointment_opened, e fare clic destro su un appuntamento o una casella vuota per il Suo menu.
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:
| Tasto | Effetto |
|---|---|
| Invio | Apre l'appuntamento selezionato → ue_appointment_opened |
| Canc | Chiede 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+Home | Torna a oggi |
| Esc | Annulla 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 #
- Racchiuda una serie di aggiunte tra
of_set_redraw(/*on*/ false)/of_set_redraw(/*on*/ true): gli appuntamenti compaiono in una sola volta. - Per dati che vivono in una base, preferisca
of_from_datastorea un ciclo diof_add_appointment: un solo trasferimento, e ogni event Le restituisce la riga. - Ricarichi (
of_from_datastore) dopo ogniInsertRow,DeleteRow,SortoFilterdel DataStore: la chiave di un appuntamento è un numero di riga. - Scriva le date come
"yyyy-mm-dd hh:mm", mai nel formato regionale della postazione: è il solo che il calendario legge ovunque. - In un modello, racchiuda un campo facoltativo tra
{?campo}…{/campo}: una scheda senza luogo non mostra un « ; » orfano. - Su uno storico lungo, carichi l'intervallo visibile in
ue_date_changedpiuttosto che tutto il DataStore. - Per una regola di business (nessun appuntamento nel fine settimana, nessuna sovrapposizione in una sala),
ib_veto_changeseue_appointment_changingrifiutano prima che la scheda si muova.
Limiti della 4.0 #
Ciò che il calendario non fa — da sapere prima di sceglierlo:
- Ricorrenza: niente serie (regole RRULE), niente eccezioni, niente modifica « questa occorrenza / tutta la serie ».
ib_recurringmette solo un segno sulla scheda: ogni occorrenza è un appuntamento (una riga del DataStore) che la Sua applicazione genera da sé. Un motore di ricorrenza è previsto per una versione successiva. - Fusi orari: l'ora è locale fluttuante (vedere Le date); nessuna seconda scala oraria, nessuna conversione.
- Vista cronologica (risorse in righe, tempo in colonne) e mini-calendario di navigazione: assenti; raggruppi per risorsa (
GROUP_RESOURCE) nelle viste giorno e settimana. - iCalendar: né importazione né esportazione di file
.ics. - Stampa: nessuna; il calendario si disegna solo a schermo.
- Tastiera: si seleziona, si apre, si elimina e si naviga da tastiera, ma non si crea né si sposta un appuntamento senza il mouse.
- Data e ora in due colonne: un inizio scritto in due colonne del DataStore non si mappa; lo unisca in una colonna
datetimenella query.
Ereditato dalla base comune #
Questi membri esistono su tutti i componenti visivi — non sono propri di questo. Sono descritti una sola volta, nei capitoli trasversali; questa tabella dice solo dove leggerli.
| Membri | Ruolo | Descritto in |
|---|---|---|
of_count · of_keys_at · of_has | Percorrere ciò che il componente contiene | 3.2 Gli item |
of_reset | Riportare il componente a zero | 3.6 Riportare un componente a zero: of_reset() |
of_register_shortcut · of_clear_shortcuts | Scorciatoie da tastiera del componente | 3.5 Le scorciatoie da tastiera |
of_is_created · of_is_ready · of_get_last_error | Se è nato, se è pronto, cosa è fallito | 3.7 Diagnostica |
of_save_as_png · of_save_as_jpg | Esportare il rendering in immagine | 3.8 Esportare il rendering come immagine |
of_set_redraw | Raggruppare le modifiche in un solo ridisegno | 3.10 Buone pratiche |
of_preload_icons | Icone mostrate senza ritardo | Visualizzazione istantanea: of_icon |
of_set_translation | Tradurre una dicitura del componente | 5.2 Adattare un'etichetta: of_set_translation |
of_focus_webview | Dare il focus al componente | 6.4 Tastiera e focus |
of_print · of_print_to_pdf | Stampare, o scrivere un PDF | 6.9 Stampare |
of_set_property · of_get_property · of_component_name | Pilotare una proprietà per nome | 3.1 Il motore delle proprietà |
Due aiuti non sono ereditati: of_icon e of_escape_markup vivono su n_pbt_utils. Ne dichiari uno — n_pbt_utils lnv_utils, niente da creare — e li chiami su di esso.