PBToolboxAI v4 ← Site

scheduler — u_pbt_scheduler #

← Komponentenreferenz · Inhalt des Handbuchs

Ein Kalender nach Art von Outlook: Ansichten Tag, Arbeitswoche, Woche, Monat und Agenda, ein Ganztagsband, Ziehen und Ablegen zum Verschieben und Größenändern, Ressourcen nebeneinander, Farb-Kategorien, und Karten und Tooltips, die von Vorlagen geschrieben werden. Er wird Termin für Termin gefüllt oder mit einem einzigen Aufruf aus einem DataStore — und jede Geste des Benutzers gibt Ihnen die zu aktualisierende Zeile zurück.

▶ Live ansehen — Demoanwendung, Kachel Scheduler: die Vorschau, der zugehörige Code und diese Seite, nebeneinander.


Auf einen Blick #

Userobjectu_pbt_scheduler
Item-Klassenn_pbt_scheduler_appointment (ein Termin, of_appointment) · n_pbt_scheduler_resource (eine Ressource, of_resource) · n_pbt_scheduler_category (eine Kategorie, of_category)
WofürDienstplan eines Teams, Buchung von Räumen oder Maschinen, Terminkalender eines Vertreters, Patiententermine — alles, was auf Tagen und Stunden liegt
Grenze im DemomodusDie ersten 12 Termine des sichtbaren Bereichs, nach Beginn; die übrigen bleiben im Speicher, ohne angezeigt zu werden — siehe Der Demomodus

Schnellstart #

// 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)

Den Kalender verstehen #

Die Ansichten #

is_view wählt die Ansicht, is_date den Tag, um den sie aufgebaut wird: seine Woche, sein Monat. Der Benutzer ändert beides über die Symbolleiste der Komponente (Heute, zurück, weiter, Ansichtsmenü) — beide Eigenschaften werden live zurückgelesen, und ue_view_changed / ue_date_changed melden es, ob die Änderung vom Benutzer oder von Ihrem Code kommt.

AnsichtWas sie zeigt
VIEW_DAYEin Tag auf einem Stundenraster
VIEW_WORK_WEEKDie Arbeitstage der Woche (is_work_days) — die Standardansicht
VIEW_WEEKDie sieben Tage, ab ii_first_day_of_week
VIEW_MONTHSechs Wochen; ein mehrtägiger Termin erstreckt sich als Balken über seine Tage
VIEW_AGENDAEine Liste, Tag für Tag, über ii_agenda_days Tage

Datumsangaben #

Ein Datum reist als Text, "yyyy-mm-dd hh:mm" — in Methoden, Eigenschaften und Events. Es ist eine schwebende Ortszeit: keine Zeitzone, keine Sommerzeit; "2026-09-22 09:00" wird auf jedem Arbeitsplatz um 09:00 angezeigt.

// 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)))

Das Ganztagsband #

Über dem Stundenraster der Tages- und Wochenansichten nimmt ein Band die Termine mit ib_all_day und die von 24 Stunden oder mehr auf: Ein dreitägiges Seminar passt dort als ein Balken, statt drei Spalten zu erdrücken. ib_all_day_band = false entfernt es. In der Monatsansicht sind diese Termine Balken über ihre Tage; die anderen eine Zeile, geschrieben von is_month_template.

Termine aus einem DataStore #

of_from_datastore(ids) lädt den Kalender mit einem Aufruf: eine Zeile = ein Termin, und sein Schlüssel ist seine Zeilennummer — ihn gibt Ihnen jedes Event zurück, bereit für SetItem. Eine Spalte spielt eine Rolle, wenn sie deren Namen trägt oder wenn of_map sie ihr gibt:

RolleOhne of_map erkannte Namen
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_CANCELLEDder Name der Rolle: key, location, organizer, description, resource, category, status, recurring, private, reminder, cancelled

Ressourcen und Gruppierung #

Eine Ressource ist das, was gebucht wird: eine Person, ein Raum, eine Maschine (of_add_resource). Ein Termin nennt sie über is_resource. Mit is_group_by = GROUP_RESOURCE teilt sich jeder Tag der Tages- und Wochenansichten in eine Spalte je Ressource, und das Ziehen einer Karte in eine andere Spalte ändert ihre Ressource — ue_appointment_moved gibt sie in as_resource zurück. ib_visible = false auf einer Ressource blendet ihre Spalte und ihre Termine aus, wie das Abwählen eines Kalenders in Outlook.

Farben, Kategorien und Status #

Die Farbe einer Karte wird in dieser Reihenfolge bestimmt: das auf diesem Termin gesetzte il_accent, dann die Farbe seiner Kategorie (of_add_category, is_category), dann die seiner Ressource, dann der Akzent des Designs. Der Streifen links zeigt den Status (is_status, Outlooks „Anzeigen als“: gebucht, mit Vorbehalt, frei, abwesend, woanders); ein Termin mit ib_cancelled wird hohl gezeichnet, und ib_recurring, ib_private, ib_reminder setzen ein kleines Zeichen auf die Karte.


Eigenschaften #

EigenschaftTypStandardRolle
is_viewstringVIEW_WORK_WEEKDie angezeigte Ansicht (VIEW_*). Live zurückgelesen: Der Benutzer ändert sie über die Symbolleiste. Sie zu setzen löst ue_view_changed aus, wie das Ansichtsmenü (nichts, wenn sich die Ansicht nicht ändert)
is_datestringheuteDer angezeigte Tag, "yyyy-mm-dd": Die Ansicht wird um ihn herum aufgebaut (seine Woche, sein Monat). Live zurückgelesen: Die Pfeile verschieben ihn. Einmal gesetzt, verschiebt is_now ihn nicht mehr; "" gibt die Ansicht an heute zurück
is_nowstring""„Jetzt“, für die Linie der aktuellen Uhrzeit und die Schaltfläche Heute: "" = die Uhr des Arbeitsplatzes; "yyyy-mm-dd hh:mm" fixiert sie (Vorführung, Test, Wiedergabe). Solange is_date nie gesetzt wurde, geht die Ansicht zu ihrem Tag
ii_first_day_of_weekinteger1Erster Tag der Woche, in ISO-Nummern wie is_work_days: 1 = Montag … 7 = Sonntag; 0 wird für Sonntag akzeptiert
is_work_daysstring"1|2|3|4|5"Die Arbeitstage, ISO-Nummern mit | verbunden (1 = Montag … 7 = Sonntag, 0 für Sonntag akzeptiert): Sie bilden die Arbeitswoche, die anderen werden schattiert
is_work_start · is_work_endstring"08:00" · "17:00"Die Arbeitszeit, "hh:mm": Der Rest des Tages wird schattiert
is_day_start · is_day_endstring"00:00" · "24:00"Die Stunden, die das Stundenraster zeigt; was außerhalb liegt, wird am Rand seiner Spalte gezählt („▲ 1 früher“, „▼ 1 später“), zusammen mit dem, was der Bildlauf über oder unter der Ansicht verbirgt; ein Klick auf die Markierung holt den nächsten verborgenen Termin in die Ansicht
ii_slot_minutesinteger30Der Rasterschritt in Minuten: 5, 10, 15, 20, 30 oder 60. Ein Ziehen rastet darauf ein
ii_hour_heightinteger48Die Höhe einer Stunde, in Pixeln
is_scroll_timestring"08:00"Die Uhrzeit, zu der das Raster beim Öffnen einer Ansicht scrollt
ib_show_nowbooleantrueDie rote Linie der aktuellen Uhrzeit
ib_toolbarbooleantrueDie Symbolleiste: Heute, zurück, weiter, der Titel, das Ansichtsmenü
ib_week_numbersbooleanfalseISO-Wochennummern, in der Ecke des Stundenrasters und vor jeder Monatszeile
ib_read_onlybooleanfalseNichts lässt sich mit der Maus verschieben, in der Größe ändern oder erstellen; Entf fragt nichts mehr an
ib_all_day_bandbooleantrueDas Ganztagsband über dem Stundenraster
ib_tooltipsbooleantrueDer Tooltip jedes Termins, geschrieben von den Tooltip-Vorlagen
ib_veto_changesbooleanfalseFragt nach, bevor ein Verschieben oder eine Größenänderung angewendet wird: löst ue_appointment_changing aus, das ablehnen kann
is_card_templatestring"[b]{subject}[/b]{?location}; {location}{/location}"Die Vorlage der Karte: Tages- und Wochenansichten, Agenda, Monatsbalken — siehe Die Vorlagen
is_month_templatestring"{!all_day}{start} {/all_day}{subject}"Eine Zeile der Monatsansicht, für einen Termin innerhalb eines Tages
is_tooltip_title_templatestring"{subject}"Der Titel des Tooltips eines Termins
is_tooltip_templatestringZeit, Ort, OrganisatorDer Text des Tooltips eines Termins — siehe Die Vorlagen
is_group_bystringGROUP_NONEGROUP_RESOURCE: eine Spalte je Ressource unter jedem Tag, dazu eine Spalte (keine) am Ende, wenn ein Termin keine dem Kalender bekannte Ressource hat
is_filterstring""Zeigt nur die Termine, die diesen Text enthalten (Betreff, Ort, Organisator, Beschreibung, Felder); "" zeigt alle
is_time_formatstring"hh:mm"Wie eine Uhrzeit geschrieben wird: "hh:mm", "h:mm AM/PM"… (Kürzel aus Die Vorlagen)
ii_agenda_daysinteger7Wie viele Tage die Agendaansicht auflistet
is_theme_stylestring""Visueller Stil der Komponente (Konstanten THEME_STYLE_*); leer = der der Anwendung, bei jeder Änderung übernommen
is_theme_modestring""Helle oder dunkle Variante (Konstanten THEME_MODE_*); leer = die der Anwendung, bei jeder Änderung übernommen
il_theme_accentlong-1Akzentfarbe dieser Komponente (-1 = Akzent der Anwendung, sonst der des Designs)
is_tooltipstring""Einfacher Tooltip der Komponente (ein Termin hat seinen eigenen, von den Vorlagen geschrieben)
is_super_tooltip_titlestring""Titel des erweiterten Tooltips (hat Vorrang vor is_tooltip)
is_super_tooltip_textstring""Text des erweiterten Tooltips (Rich-Text-Auszeichnung erlaubt)
is_super_tooltip_imagestring""Bild des erweiterten Tooltips

Eigenschaften eines Termins #

Ein Termin wird über sein Handle gesteuert, of_appointment("schlüssel") — beim ersten Zugriff erstellt, bleibt es danach gültig. Eine gelesene Eigenschaft fragt die Komponente, was sie jetzt wert ist: Nach einem Ziehen sagen is_start und is_end bereits, wo der Benutzer ihn abgelegt hat.

// A handle used once fits on one line
uo_sched.of_appointment(/*key*/ "a1").is_status = n_pbt_scheduler_appointment.STATUS_TENTATIVE
EigenschaftTypStandardRolle
is_subjectstringder von of_add_appointmentDer Betreff, was die Karte zuerst zeigt ({subject})
is_start · is_endstringdie von of_add_appointmentBeginn und Ende, "yyyy-mm-dd hh:mm", Ende exklusiv; bei einem Ganztagstermin Daten "yyyy-mm-dd", beide Tage eingeschlossen. Jede andere Schreibweise (22/09/2026 09:00) wird gespeichert, aber nie gezeichnet
ib_all_daybooleanfalseBelegt ganze Tage: im Ganztagsband gezeichnet
is_location · is_organizer · is_descriptionstring""Der Ort ({location}), der Organisator ({organizer}), ein längerer Text ({description})
is_resourcestring""Der Schlüssel seiner Ressource: seine Spalte, wenn der Kalender nach Ressource gruppiert, seine Farbe, wenn er keine Kategorie hat
is_categorystring""Der Schlüssel seiner Kategorie: die Farbe der Karte
is_statusstringSTATUS_BUSYOutlooks „Anzeigen als“ (STATUS_*), durch den Streifen links gezeichnet
ib_recurring · ib_private · ib_reminderbooleanfalseKleine Zeichen auf der Karte: eine Serie, ein privater Termin, eine Erinnerung
ib_cancelledbooleanfalseEin abgesagter Termin wird hohl gezeichnet
ib_read_onlybooleanfalseDer Benutzer kann ihn weder verschieben noch in der Größe ändern noch seine Löschung anfordern
ib_visiblebooleantrueBlendet ihn aus, ohne ihn zu entfernen

Wie jedes Item trägt ein Termin auch den gemeinsamen Tooltip (is_tooltip, is_super_tooltip_title, is_super_tooltip_text, is_super_tooltip_image) — der dann den der Vorlagen ersetzt — und die Item-Farben: il_accent färbt die Karte und ihren Streifen um, il_back_color, il_text_color, il_back_color_hover und il_text_color_hover malen sie in Ruhe und beim Überfahren.

Eigenschaften einer Ressource und einer Kategorie #

EigenschaftHandleRolle
is_labeln_pbt_scheduler_resourceDer Name über seiner Spalte, wenn der Kalender nach Ressource gruppiert ({resource_label})
il_colorn_pbt_scheduler_resourceDie Farbe seiner Termine ohne Kategorie; -1 = der Akzent
ib_visiblen_pbt_scheduler_resourcefalse blendet seine Spalte und seine Termine aus
is_labeln_pbt_scheduler_categoryIhr Name ({category_label})
il_colorn_pbt_scheduler_categoryDie Farbe ihrer Termine; -1 = der Akzent. Eine Kategorie wird nicht selbst gezeichnet: der Tooltip und die fünf geerbten Elementfarben werden gespeichert und zurückgelesen, ohne sichtbare Wirkung

Konstanten #

FamilieKonstantenGetragen von
AnsichtVIEW_DAY, VIEW_WORK_WEEK, VIEW_WEEK, VIEW_MONTH, VIEW_AGENDAdie Komponente (is_view)
GruppierungGROUP_NONE, GROUP_RESOURCEdie Komponente (is_group_by)
Rolle einer SpalteROLE_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_ONLYdie Komponente (of_map)
StatusSTATUS_BUSY, STATUS_TENTATIVE, STATUS_FREE, STATUS_OOF, STATUS_ELSEWHEREdas Termin-Handle (is_status)

Konstanten werden auf dem Objekt gelesen, das sie trägt: u_pbt_scheduler.VIEW_MONTH für eine Eigenschaft der Komponente, n_pbt_scheduler_appointment.STATUS_OOF für eine Eigenschaft eines Termins.


Methoden #

Termine #

MethodeRolle
of_add_appointment (string as_key, string as_subject, string as_start, string as_end)Fügt einen Termin hinzu: seinen Schlüssel (eindeutig), seinen Betreff, Beginn und Ende "yyyy-mm-dd hh:mm". Alles Weitere läuft über sein Handle. Liefert 0, sobald hinzugefügt, -5, wenn der Schlüssel leer ist, / oder ` enthält oder **schon vergeben** ist (ein Termin wird so nicht aktualisiert: das macht sein Handle), oder wenn der Beginn — oder ein angegebenes Ende — nicht als yyyy-mm-dd oder yyyy-mm-dd hh:mm geschrieben ist (String(ldt) schreibt auf einem französischen Arbeitsplatz 22/09/2026: nehmen Sie die datetime-Überladung), -2`, wenn die Komponente nicht erstellt ist
of_add_appointment (string as_key, string as_subject, datetime adt_start, datetime adt_end)Dasselbe, aus zwei datetime-Werten; ein Null-Ende entspricht dem Beginn. Für einen ganzen Tag ist das Ende der letzte Tag selbst, eingeschlossen: zweimal dasselbe Datum = ein Tag. Liefert 0, sobald hinzugefügt, -5, wenn der Schlüssel leer ist, / oder ` enthält oder schon vergeben ist, oder wenn der Beginn null ist, -2`, wenn die Komponente nicht erstellt ist
of_appointment (string as_key)Das Handle eines Termins (n_pbt_scheduler_appointment), beim ersten Zugriff erstellt — siehe Eigenschaften eines Termins
of_remove_appointment (string as_key)Entfernt einen Termin. Liefert 0, sobald entfernt, -5, wenn der Kalender keinen Termin mit diesem Schlüssel hat, -2, wenn die Komponente nicht erstellt ist
of_clear_appointments ( )Entfernt alle Termine; Ressourcen, Kategorien und Optionen bleiben. Liefert 0, sobald gesendet, -2, wenn die Komponente nicht erstellt ist
of_set_field (string as_key, string as_field, string as_value)Gibt einem Termin ein eigenes Feld für die Vorlagen: Nach of_set_field("a1", "customer", "ACME") schreibt {customer} ACME auf seine Karte. Liefert 0, sobald gesetzt, -5, wenn das Feld leer ist oder der Kalender keinen Termin mit diesem Schlüssel hat, -2, wenn die Komponente nicht erstellt ist
of_get_field (string as_key, string as_field)Liest ein Feld eines Termins live: eines Ihrer eigenen (of_set_field) oder eine Spalte des DataStores, aus dem er stammt; "", wenn es keines gibt

DataStore #

MethodeRolle
of_from_datastore (datastore ads)Die DataStore-Brücke: eine Zeile = ein Termin, sein Schlüssel = seine Zeilennummer, jede Spalte = ein Feld der Vorlagen. Ersetzt die angezeigten Termine. Liefert 0, sobald geladen, -5, wenn der DataStore ungültig ist oder keine Spalte hat, -2, wenn die Komponente nicht erstellt ist
of_map (string as_role, string as_column)Gibt einer Spalte, deren Name es nicht sagt, eine Rolle (ROLE_*): of_map(ROLE_SUBJECT, "title_text"). Vor oder nach of_from_datastore: danach wird jede Zeile so neu gelesen, wie sie jetzt ist — ein entfernter Termin bleibt entfernt, ein gezogener bleibt, wo er losgelassen wurde, die Felder von of_set_field und die von Hand hinzugefügten Termine bleiben. Liefert 0, sobald gesetzt, -5, wenn die Rolle keine der Konstanten ROLE_* ist oder die Spalte nicht zum DataStore des letzten of_from_datastore gehört; ein neues ROLE_KEY gibt jeder Zeile einen neuen Schlüssel, und die Handles der alten werden freigegeben, -2, wenn die Komponente nicht erstellt ist

Ressourcen und Kategorien #

MethodeRolle
of_add_resource (string as_key, string as_label)Fügt eine Ressource hinzu — eine Person, einen Raum, eine Maschine; Farbe und Sichtbarkeit laufen über of_resource. Liefert 0, sobald hinzugefügt, -5, wenn der Schlüssel leer ist, / oder ` enthält oder schon vergeben ist, -2`, wenn die Komponente nicht erstellt ist
of_resource (string as_key)Das Handle einer Ressource (n_pbt_scheduler_resource), beim ersten Zugriff erstellt
of_remove_resource (string as_key)Entfernt eine Ressource; ihre Termine bleiben — nach Ressource gruppiert, in der Spalte (keine). Liefert 0, sobald entfernt, -5, wenn der Kalender keine Ressource mit diesem Schlüssel hat, -2, wenn die Komponente nicht erstellt ist
of_clear_resources ( )Entfernt alle Ressourcen. Liefert 0, sobald gesendet, -2, wenn die Komponente nicht erstellt ist
of_add_category (string as_key, string as_label, long al_color)Fügt eine Farbkategorie hinzu: Die Termine, deren is_category sie nennt, nehmen ihre Farbe an (-1 = der Akzent). Liefert 0, sobald hinzugefügt, -5, wenn der Schlüssel leer ist, / oder ` enthält oder schon vergeben ist, -2`, wenn die Komponente nicht erstellt ist
of_category (string as_key)Das Handle einer Kategorie (n_pbt_scheduler_category), beim ersten Zugriff erstellt
of_remove_category (string as_key)Entfernt eine Kategorie; ihre Termine kehren zum Akzent zurück. Liefert 0, sobald entfernt, -5, wenn der Kalender keine Kategorie mit diesem Schlüssel hat, -2, wenn die Komponente nicht erstellt ist
of_clear_categories ( )Entfernt alle Kategorien. Liefert 0, sobald gesendet, -2, wenn die Komponente nicht erstellt ist
MethodeRolle
of_next ( )Der nächste Tag, die nächste Woche oder der nächste Monat — der Pfeil der Symbolleiste. Liefert 0, sobald gesendet, -2, wenn die Komponente nicht erstellt ist
of_previous ( )Der vorige Tag, die vorige Woche oder der vorige Monat. Liefert 0, sobald gesendet, -2, wenn die Komponente nicht erstellt ist
of_go_to_today ( )Zurück zu heute — die Schaltfläche Heute. Liefert 0, sobald gesendet, -2, wenn die Komponente nicht erstellt ist
of_select_appointment (string as_key)Wählt einen Termin aus ("" = keinen), wie ein Klick: löst ue_selection_changed aus (nichts, wenn er schon die Auswahl ist). Liefert 0, sobald ausgewählt, -5, wenn der Kalender keinen Termin mit diesem Schlüssel hat, -2, wenn die Komponente nicht erstellt ist
of_selected_key ( )Der Schlüssel des ausgewählten Termins, "", wenn keiner — live gelesen
of_show_appointment (string as_key)Holt einen Termin ins Bild: geht zu seinem Tag, scrollt zu seiner Uhrzeit und wählt ihn aus, wie ein Klick: löst ue_selection_changed aus. Ein Tag, den die Arbeitswoche nicht zeigt (ein Samstag), schaltet die Ansicht auf die ganze Woche, und ue_view_changed meldet es. Liefert 0, sobald angezeigt, -5, wenn der Kalender keinen Termin mit diesem Schlüssel hat, -2, wenn die Komponente nicht erstellt ist
of_scroll_to_time (string as_time)Scrollt das Stundenraster zu einer Uhrzeit, "hh:mm". Liefert 0, sobald gesendet, -5, wenn die Uhrzeit leer ist, -2, wenn die Komponente nicht erstellt ist
of_first_visible_date ( ) · of_last_visible_date ( )Der erste und der letzte Tag, den die Ansicht zeigt, "yyyy-mm-dd" — live gelesen
of_shown_count ( )Liefert die Anzahl der im sichtbaren Bereich angezeigten Termine: nach is_filter, den ausgeblendeten, den ausgeblendeten Ressourcen und der Obergrenze des Demomodus (die ersten 12 dieses Bereichs); of_count zählt den ganzen Kalender

Events #

EventAusgelöst, wenn
ue_appointment_clicked (string as_key)Ein Termin wurde angeklickt (und ausgewählt)
ue_appointment_opened (string as_key)Doppelklick auf einen Termin oder Eingabe auf dem ausgewählten: Öffnen Sie Ihren Editor
ue_appointment_rclicked (string as_key, long al_x, long al_y)Rechtsklick auf einen Termin. al_x / al_y sind Bildschirm-Pixel
ue_appointment_changing (string as_key, string as_start, string as_end, string as_resource)Bevor ein Verschieben oder eine Größenänderung angewendet wird, nur wenn ib_veto_changes wahr ist. Geben Sie false zurück, um den Termin an seinen Platz zurückzusetzen; standardmäßig true
ue_appointment_moved (string as_key, string as_start, string as_end, string as_resource)Der Benutzer hat einen Termin gezogen: sein neuer Beginn, sein neues Ende und seine Ressource. Der Kalender zeigt ihn bereits dort; speichern Sie ihn (eine DataStore-Zeile: SetItem auf Zeile Long(as_key))
ue_appointment_resized (string as_key, string as_start, string as_end)Der Benutzer hat einen Rand eines Termins gezogen: sein neuer Beginn und sein neues Ende
ue_range_selected (string as_start, string as_end, boolean ab_all_day, string as_resource)Der Benutzer hat leere Felder mit der Maus überstrichen: der Bereich, um darauf einen Termin anzulegen. Im Ganztagesband oder in der Monatsansicht überstrichen, sind es ganze Tage: ab_all_day ist true, nur Daten, der letzte eingeschlossen
ue_new_requested (string as_start, string as_end, boolean ab_all_day, string as_resource)Der Benutzer fordert einen neuen Termin an: Doppelklick auf ein leeres Feld oder einen leeren Tag, oder das + eines Tageskopfs (nach Ressource gruppiert: eines Ressourcenkopfs). Ein ganzer Tag kommt als reine Daten, das Ende eingeschlossen: zweimal dasselbe Datum = ein Tag
ue_delete_requested (string as_key)Entf wurde auf dem ausgewählten Termin gedrückt. Entfernen Sie ihn (of_remove_appointment), sobald Ihre Anwendung zustimmt
ue_slot_rclicked (string as_start, boolean ab_all_day, string as_resource, long al_x, long al_y)Rechtsklick auf ein leeres Feld oder einen leeren Tag; bei einem Tag ist as_start sein Datum allein. al_x / al_y sind Bildschirm-Pixel
ue_selection_changed (string as_key)Der ausgewählte Termin hat sich geändert ("" = keiner): ein Klick, oder of_select_appointment / of_show_appointment aus Ihrem Code
ue_view_changed (string as_view)Die Ansicht hat sich geändert: Der Benutzer hat in der Symbolleiste eine andere gewählt oder einen Tag über sein „+N“ geöffnet, Ihr Code hat is_view gesetzt, oder of_show_appointment hat die Arbeitswoche auf die ganze Woche umgestellt, um einen freien Tag zu zeigen
ue_date_changed (string as_first, string as_last)Der sichtbare Bereich hat sich geändert (Navigation, Ansicht, Datum): sein erster und letzter Tag, "yyyy-mm-dd", eingeschlossen. Auch bei der ersten Anzeige ausgelöst (für den heutigen Bereich), dann erneut, wenn Ihr Code is_date oder is_view setzt: Ein Fenster, das sie beim Öffnen setzt, erhält zwei; und nach jedem of_reset, das den Kalender leert: eine Anfrage nach Daten, keine Geste. Hier werden die Termine des Bereichs geladen
ue_ready ( )Die Komponente ist fertig geladen; alles zuvor Gesendete wurde nachgespielt
ue_runtime_missing ( )Die WebView2-Laufzeit fehlt: Die Komponente bleibt leer
ue_bg_color (long al_color)Die Komponente hat ihre Hintergrundfarbe des Designs berechnet; das Userobject hat sie bereits übernommen (backcolor)

Die Vorlagen #

Was eine Karte, eine Monatszeile und ein Tooltip sagen, ist nicht festgelegt: Es ist eine Vorlage, die Sie schreiben, in Rich Text ([b], [br], [color=…], [symbol=…]…) mit Feldern in geschweiften Klammern. Vier Eigenschaften tragen sie: is_card_template (Karten der Tages- und Wochenansichten, Agenda, Monatsbalken), is_month_template (eine Zeile der Monatsansicht), is_tooltip_title_template und is_tooltip_template (der Tooltip). Die Standardvorlage des Tooltips lautet:

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

Die Syntax #

SchreibweiseWirkung
{subject}Der Wert des Felds, maskiert: Ein [ im Betreff wird angezeigt, es öffnet kein Tag
{start:dddd d mmmm}Ein Datumsfeld in einem Format (Kürzel unten)
{?location}…{/location}Schreibt den Block nur, wenn das Feld etwas sagt, das kein NEIN ist: nicht leer und nicht 0, N, no oder false
{!all_day}…{/all_day}Schreibt den Block nur, wenn das Feld leer (oder falsch) ist
{description:raw}Fügt den Wert als Auszeichnung ein, ohne ihn zu maskieren — für ein Feld, das bereits Tags enthält
{{ · }}Eine wörtliche geschweifte Klammer

Die Datumsformate #

Die Kürzel sind die von PowerBuilder; Tages- und Monatsnamen folgen der Anzeigesprache. Ein Text in Anführungszeichen wird unverändert geschrieben. Dieselben Kürzel dienen is_time_format.

KürzelSchreibt
yyyy · yyDas Jahr, 2026 · 26
mmmm · mmmDer Monatsname, lang · kurz
mm · mDer Monat, 09 · 9 — oder die Minuten direkt nach einer Stunde, wie in PowerBuilder
dddd · dddDer Tagesname, lang · kurz
dd · dDer Tag des Monats, 05 · 5
hh · hDie Stunde, 09 · 9 (12-Stunden-Format mit AM/PM)
nn · nDie Minuten, 05 · 5
AM/PM · am/pmDie Vormittags- oder Nachmittagsangabe

Die Felder #

FeldWert
key · subject · location · organizer · descriptionDer Schlüssel und die Texte des Termins
resource · resource_labelDer Schlüssel seiner Ressource · ihr Name
category · category_labelDer Schlüssel seiner Kategorie · ihr Name
status · status_labelDer Status (busy…) · seine Bezeichnung, in die Anzeigesprache übersetzt
all_day · recurring · private · reminder · cancelledtrue oder leer: gemacht für {?…} und {!…}
start · endDie Anfangs- · Endzeit im Format is_time_format (leer bei einem Ganztagstermin); mit einem Format Datum und Uhrzeit — bei einem Ganztagstermin ist {end:…} der letzte Tag, wie is_end ihn liest
dateDer erste Tag, ausgeschrieben; mit einem Format der formatierte Beginn
time09:00-10:30 oder „Ganztägig“
whenDer vollständige Satz: Tag, Uhrzeiten und der Endtag, wenn er abweicht
duration45 min, 1 h 30, 2 days (übersetzt)
Ihre eigenenJedes durch of_set_field gesetzte Feld und jede Spalte des DataStores von of_from_datastore, unter ihrem Namen. Ein Wert, der ein Datum ist, nimmt ein Format an: {due_date:dd/mm}

Ein unbekanntes Feld schreibt eine leere Zeichenkette.

Die Symbole #

Das Rich-Text-Tag [symbol=name] setzt ein eingebautes Symbol, einfarbig, in der Farbe des umgebenden Texts gezeichnet — es folgt dem Design, dem Überfahren und der Farbe der Karte, ohne mitzuliefernde Datei: clock, location, person, people, calendar, repeat, lock, bell, phone, mail, video, note, tag, link, check, star, info, warning. Ein unbekannter Name wird unverändert angezeigt.


Was der Benutzer ohne eine Zeile Code tun kann #

Der Kalender erstellt, ändert und löscht nichts von selbst über das Ziehen hinaus: Er fragt, Ihre Anwendung entscheidet. ib_read_only schaltet alle diese Gesten auf einmal ab, ib_read_only auf einem Termin nur für diesen.

Mit der Tastatur, sobald der Kalender den Fokus hat:

TasteWirkung
EingabeÖffnet den ausgewählten Termin → ue_appointment_opened
EntfFordert das Löschen des ausgewählten Termins an → ue_delete_requested (nichts, wenn Kalender oder Termin schreibgeschützt ist)
Pfeil oben / Pfeil untenWählt den vorigen / nächsten Termin der Ansicht, in der Reihenfolge ihres Beginns → ue_selection_changed
Bild auf / Bild abDer vorige / nächste Tag, Woche oder Monat
Alt+Pos1Zurück zu heute
EscBricht ein laufendes Ziehen ab

Beispiele #

Termine aus einem DataStore und was der Benutzer damit macht #

Der DataStore ids_appts (Instanzvariable) hat die Spalten subject, start_date, end_date, location, room, category und customer. Die ersten vier spielen ihre Rolle über ihren Namen; room erhält sie von 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()

Anlegen und löschen #

// 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)

Eine Spalte je Raum #

// 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

Eigene Karten und Tooltips #

// 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}"

Ein Verschieben ablehnen #

// 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

Nur laden, was sichtbar ist #

Bei jahrelanger Historie muss nicht alles gelesen werden: ue_date_changed liefert bei jeder Navigation und bei der ersten Anzeige den sichtbaren Bereich. Hier nimmt d_appointments zwei datetime-Argumente, Beginn und Ende des Bereichs.

// 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)

Ihr Menü auf einem Termin #

// 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

Best Practices #

Grenzen der 4.0 #

Was der Kalender nicht kann — gut zu wissen, bevor Sie ihn wählen:

Vom gemeinsamen Sockel geerbt #

Diese Mitglieder gibt es bei jeder visuellen Komponente — sie sind nicht dieser eigen. Sie werden einmal in den übergreifenden Kapiteln beschrieben; diese Tabelle sagt nur, wo man sie liest.

MitgliederRolleBeschrieben in
of_count · of_keys_at · of_hasDurchlaufen, was die Komponente enthält3.2 Die Items
of_resetDie Komponente zurücksetzen3.6 Eine Komponente zurücksetzen: of_reset()
of_register_shortcut · of_clear_shortcutsTastenkürzel der Komponente3.5 Tastenkombinationen
of_is_created · of_is_ready · of_get_last_errorOb sie entstanden ist, ob sie bereit ist, was fehlschlug3.7 Diagnose
of_save_as_png · of_save_as_jpgDie Darstellung als Bild exportieren3.8 Die Darstellung als Bild exportieren
of_set_redrawÄnderungen zu einem einzigen Neuzeichnen bündeln3.10 Best Practices
of_preload_iconsSymbole ohne VerzögerungSofortige Anzeige: of_icon
of_set_translationEine Beschriftung der Komponente übersetzen5.2 Eine Beschriftung anpassen: of_set_translation
of_focus_webviewDer Komponente den Fokus geben6.4 Tastatur und Fokus
of_print · of_print_to_pdfDrucken oder ein PDF schreiben6.9 Drucken
of_set_property · of_get_property · of_component_nameEine Eigenschaft über ihren Namen steuern3.1 Die Eigenschaften-Engine

Zwei Helfer werden nicht geerbt: of_icon und of_escape_markup liegen auf n_pbt_utils. Deklarieren Sie eines — n_pbt_utils lnv_utils, nichts zu erzeugen — und rufen Sie sie darauf auf.

← Komponentenreferenz · Inhalt des Handbuchs