tab — u_pbt_tab #
← Komponentenreferenz · Inhalt des Handbuchs
Moderne Registerkarten, die echte PowerBuilder-Steuerelemente hosten: verschiebbare Registerleiste, Symbole je Registerkarte, schließbare Registerkarten, Umsortieren mit der Maus.
▶ Live ansehen — Demoanwendung, Kachel Tab: die Vorschau, der zugehörige Code und diese Seite, nebeneinander.
Auf einen Blick #
| Userobject | u_pbt_tab |
| Item-Klasse | n_pbt_tab_page (eine Seite = eine Registerkarte) |
| Wofür | Eine PowerBuilder-tab durch eine gestaltete Leiste ersetzen und dabei Ihre vorhandenen Masken als Seiten beibehalten |
| Opt-in-Optionen | ib_reorderable, ib_veto_selection, ib_veto_close |
Der entscheidende Punkt: Eine Seite ist kein HTML-Entwurf, sondern ein PowerBuilder-dragobject — ein Userobject, eine DataWindow, eine Gruppe von Steuerelementen oder sogar eine weitere PBToolboxAI-Komponente. Die Komponente übernimmt das Positionieren, das Anpassen der Größe sowie das Ein- und Ausblenden beim Wechsel der Registerkarte. Siehe Echte PowerBuilder-Steuerelemente hosten.
Schnellstart #
// open-Event des Fensters : jede Seite ist ein PB-Steuerelement, das bereits auf dem Fenster liegt
uo_tabs.of_add_page(/*key*/ "customers", /*title*/ "Kunden", /*page*/ uo_page_customers)
uo_tabs.of_add_page(/*key*/ "invoices", /*title*/ "Rechnungen", /*page*/ uo_page_invoices, /*closable*/ true)
// Ein Symbol je Registerkarte, am Handle der Seite gesetzt
uo_tabs.of_page(/*key*/ "customers").is_icon = "mono:img\customers.svg"
uo_tabs.of_page(/*key*/ "invoices").is_icon = "mono:img\invoice.svg"
// Die erste Registerkarte anzeigen
uo_tabs.of_select_page(/*key*/ "customers")
// Event ue_selection_changed von uo_tabs : (string as_from_key, string as_key)
// Ein leerer Schluessel : keine Registerkarte wird mehr angezeigt (alle ausgeblendet)
if as_key <> "" then of_load_page(as_key)
Eigenschaften #
| Eigenschaft | Typ | Standard | Zweck |
|---|---|---|---|
is_position | string | "top" | Platzierung der Leiste: top, bottom (waagerechte Leiste), start, end (senkrechte Leiste). Konstanten POSITION_TOP, POSITION_BOTTOM, POSITION_START, POSITION_END. START/END sind logisch und folgen der Schreibrichtung |
is_overflow_mode | string | "menu" | Was eine für ihre Registerkarten zu kleine Leiste tut. menu (Standard) hält jede Registerkarte lesbar: Was nicht mehr hineinpasst, verlässt die Leiste, und die Schaltfläche ··· listet alle auf, wobei die aktive stets sichtbar bleibt. compact behält alle in der Leiste und lässt sie schrumpfen, bis auf den Platz, den ein abgeschnittener Text braucht. Konstanten OVERFLOW_MENU, OVERFLOW_COMPACT |
ib_reorderable | boolean | false | Opt-in: Der Benutzer kann die Registerkarten umsortieren, indem er ihre Kopfzeile mit der Maus zieht (löst ue_tab_reordered aus) |
ib_veto_selection | boolean | false | Nachfragen, bevor die aktive Registerkarte wechselt — eine Geste des Benutzers (Klick, Tastatur, Tastenkürzel, Registerkartenliste) und of_select_page: löst ue_selection_changing aus, das ablehnen kann; ein abgelehntes of_select_page liefert -4. Standardmäßig deaktiviert, wie jedes abbrechbare Ereignis: auf true setzen, um ablehnen zu können (nicht gespeicherte Arbeit). Jede Frage einer Geste kostet einen Hin- und Rückweg zu PowerBuilder (~35 ms) |
ib_veto_close | boolean | false | Nachfragen, bevor der Benutzer eine Registerkarte schließt (Kreuz, Mittelklick, Kontextmenü, Entf): löst ue_tab_closing aus, das ablehnen kann. Standardmäßig deaktiviert: auf true setzen, um eine Seite mit nicht gespeicherter Arbeit zu behalten |
ib_context_menu | boolean | true | Integriertes Kontextmenü auf einer Registerkarten-Kopfzeile: Schließen, Andere schließen, Rechts davon schließen, Alle schließen, ausgegraut, wenn sie kein Ziel haben. Standardmäßig aktiv. Der Rechtsklick wählt zuerst die Registerkarte aus: Lehnt die Anwendung den Wechsel ab, öffnet sich kein Menü. Mit ib_veto_close läuft jedes Schließen über ue_tab_closing, eine Frage pro Seite: die Seite mit ungespeicherter Arbeit lehnt allein ab und bleibt offen, während ihre Nachbarn gehen. Auf false wählt ein Rechtsklick die Registerkarte aus und löst ue_tab_rclicked aus: Öffnen Sie dort Ihr eigenes Menü |
ib_cycle_keys | boolean | true | Strg+Tab / Strg+Umschalt+Tab und Strg+Bild ab / Strg+Bild auf wechseln die Registerkarte, von der Leiste und aus einer gehosteten Seite heraus. Standardmäßig aktiv. Setzen Sie es auf false, wenn eine Seite diese Tasten selbst braucht: ein mehrzeiliges Feld, das einen Tabulator eingibt, ein natives PowerBuilder-Tab auf einer Seite |
is_close_mode | string | "always" | Wo das Kreuz einer schließbaren Registerkarte erscheint: always (Standard) auf jeder schließbaren Registerkarte, active nur auf der aktiven, hover auf der aktiven und auf der unter dem Mauszeiger. Der Platz des Kreuzes bleibt erhalten: Eine Registerkarte ändert unter dem Mauszeiger nie ihre Breite. Mittelklick und Entf schließen weiterhin. Konstanten CLOSE_ALWAYS, CLOSE_ACTIVE, CLOSE_HOVER |
ii_strip_width | integer | 0 | Breite einer senkrechten Leiste (POSITION_START / POSITION_END) in Pixeln. 0 (Standard) = die Breite, die die Titel verlangen, aber nie mehr als 40 % der Komponente: Ein langer Titel endet dann mit Auslassungspunkten, und die gehostete Seite behält ihren Platz. Eine waagerechte Leiste ignoriert es |
is_theme_style | string | "" | Visueller Stil der Komponente (Konstanten THEME_STYLE_*); leer = der der Anwendung, bei jeder Änderung übernommen |
is_theme_mode | string | "" | Helle oder dunkle Variante (Konstanten THEME_MODE_*); leer = die der Anwendung, bei jeder Änderung übernommen |
il_theme_accent | long | -1 | Akzentfarbe dieser Komponente (-1 = Akzent der Anwendung, sonst der des Designs) |
is_tooltip | string | "" | Einfacher Tooltip beim Überfahren der Komponente |
is_super_tooltip_title | string | "" | Titel des erweiterten Tooltips (hat Vorrang vor is_tooltip) |
is_super_tooltip_text | string | "" | Text des erweiterten Tooltips (Rich-Markup zulässig) |
is_super_tooltip_image | string | "" | Bild des erweiterten Tooltips |
Eigenschaften einer Seite — n_pbt_tab_page #
Über of_page(id) bezogen, lassen sie sich im laufenden Betrieb ändern, ohne die Leiste neu aufzubauen.
| Eigenschaft | Typ | Standard | Zweck |
|---|---|---|---|
is_title | string | "" | Beschriftung der Registerkarte. Akzeptiert die Rich-Text-Auszeichnung |
is_icon | string | "" | Symbol der Registerkarte (zulässige Formen: Pfad, mono:, tint:, DLL-Ressource). Leer = kein Symbol |
ib_enabled | boolean | true | false graut die Registerkarte aus: Kein Klick, keine Taste, kein Tastenkürzel und kein of_select_page aktiviert sie, und sie hat kein Schließkreuz. Wird die aktive Registerkarte deaktiviert, bleibt sie aktiv und ihre Seite bedienbar: Deaktivieren Sie bei Bedarf die Seite selbst (Ihr Code weiß, ob sie bearbeitbar bleiben soll) |
ib_visible | boolean | true | false blendet die Registerkarte aus, ohne die Seite zu entfernen; wird die aktive Registerkarte ausgeblendet, wird ihre Nachbarin aktiviert (die rechte, sonst die linke); wird die letzte sichtbare ausgeblendet, wird die Seite verborgen und ue_selection_changed mit leerem Schlüssel ausgelöst |
ib_closable | boolean | false | Schließkreuz auf dieser Registerkarte. Beim Hinzufügen selten bekannt: Es wird true, sobald das enthaltene Dokument gespeichert ist, und false, solange darin ein Vorgang läuft. Ein Mittelklick auf eine schließbare Registerkarte schließt sie ebenfalls, wie ihr Kreuz |
is_shortcut | string | "" | Tastenkombination, die diese Registerkarte aktiviert: "Ctrl+2", "Alt+F", "F6"… Sie antwortet, wo immer der Benutzer im Fenster ist, die eingebettete Seite eingeschlossen — die Kombination hält die DLL, nicht die Registerleiste. So auszuwählen ist ein Klick: ue_selection_changing wird gefragt, wenn ib_veto_selection aktiv ist, ue_selection_changed folgt; eine deaktivierte oder ausgeblendete Registerkarte ignoriert sie. "" entfernt sie. Schreiben Sie es, sobald die Seite hinzugefügt ist: Auf einem Schlüssel ohne Seite wird nichts registriert, und of_get_last_error() der Komponente sagt warum |
ib_modified | boolean | false | Die Seite enthält nicht gespeicherte Arbeit: Ein Punkt tritt an die Stelle ihres Kreuzes (das Kreuz kehrt unter dem Mauszeiger zurück) oder folgt dem Titel einer nicht schließbaren Registerkarte; ein Bildschirmleser hört „Geändert“ |
is_badge | string | "" | Ein Zähler nach dem Titel, in den Farben des Akzents: "3", "12", "!"… "" entfernt ihn |
is_tooltip | string | "" | Einfacher Tooltip beim Überfahren des Items |
is_super_tooltip_title | string | "" | Titel des erweiterten Item-Tooltips (hat Vorrang vor is_tooltip) |
is_super_tooltip_text | string | "" | Text des erweiterten Item-Tooltips (Rich-Markup zulässig) |
is_super_tooltip_image | string | "" | Bild des erweiterten Item-Tooltips |
il_accent | long | -1 | Akzent dieser Seite: Er unterstreicht ihre Registerkarte, solange sie die aktive ist (auf der Seite zur Seitenfläche), und färbt ihren Tastatur-Fokusrahmen. -1 gibt ihr den Akzent der Komponente zurück |
il_back_color | long | -1 | Hintergrund dieser Registerkarte, aktiv oder nicht (-1 = der der Komponente, der dem Design folgt) |
il_text_color | long | -1 | Textfarbe dieser Registerkarte (-1 = die der Komponente) |
il_back_color_hover | long | -1 | Hintergrund dieser Registerkarte unter dem Mauszeiger (-1 = der der Komponente) |
il_text_color_hover | long | -1 | Textfarbe dieser Registerkarte unter dem Mauszeiger (-1 = die der Komponente) |
Methoden #
| Methode | Zweck | |
|---|---|---|
of_add_page (string as_key, string as_title, dragobject ado_page) | Fügt eine nicht schließbare Registerkarte ohne Symbol hinzu und hostet das Steuerelement. Liefert 0 nach der Anwendung, -5 wenn der Schlüssel leer ist, ein / oder ` | enthält, bereits vergeben ist oder die Seite fehlt oder bereits gehostet ist (von dieser Registerkarte unter einem anderen Schlüssel oder von einer anderen Komponente): dann wird nichts hinzugefügt, -2` wenn die Komponente nicht erzeugt ist |
of_add_page (string as_key, string as_title, dragobject ado_page, boolean ab_closable) | Dasselbe, mit Schließkreuz, wenn ab_closable. Liefert 0 nach der Anwendung, -5 wenn der Schlüssel leer ist, ein / oder ` | enthält, bereits vergeben ist oder die Seite fehlt oder bereits gehostet ist (von dieser Registerkarte unter einem anderen Schlüssel oder von einer anderen Komponente): dann wird nichts hinzugefügt, -2` wenn die Komponente nicht erzeugt ist |
of_add_page (string as_key, string as_title, dragobject ado_page, boolean ab_closable, string as_icon) | Dasselbe, mit dem Symbol im selben Aufruf gesetzt (die Registerkarte erscheint von Anfang an vollständig). Liefert 0 nach der Anwendung, -5 wenn der Schlüssel leer ist, ein / oder ` | enthält, bereits vergeben ist oder die Seite fehlt oder bereits gehostet ist (von dieser Registerkarte unter einem anderen Schlüssel oder von einer anderen Komponente): dann wird nichts hinzugefügt, -2` wenn die Komponente nicht erzeugt ist |
of_add_page (string as_key, string as_title) | Fügt eine Registerkarte ohne ihr Steuerelement hinzu: Sie erscheint sofort, und ue_page_needed fordert das Steuerelement an, wenn die Seite zum ersten Mal gezeigt wird — das CreateOnDemand eines PowerBuilder-Tabs (siehe of_supply_page). Nicht schließbar, ohne Symbol. Liefert 0 nach der Anwendung, -5 wenn der Schlüssel leer ist, ein / oder ` | enthält oder bereits vergeben ist: Dann wird nichts hinzugefügt, -2` wenn die Komponente nicht erzeugt ist |
of_add_page (string as_key, string as_title, boolean ab_closable, string as_icon) | Dasselbe, mit der Angabe, ob die Registerkarte schließbar ist, und mit ihrem Symbol. Liefert 0 nach der Anwendung, -5 wenn der Schlüssel leer ist, ein / oder ` | enthält oder bereits vergeben ist: Dann wird nichts hinzugefügt, -2` wenn die Komponente nicht erzeugt ist |
of_insert_page (string as_key, string as_title, dragobject ado_page, integer ai_index) | Fügt die Seite hinzu und verschiebt sie anschließend an die Position ai_index (1 = die erste). Liefert 0 nach der Anwendung, -5 bei denselben Ablehnungen wie of_add_page, -2 wenn die Komponente nicht erzeugt ist. Eine Position 0 oder kleiner ist die erste, über das Ende hinaus die letzte. Kann die Registerkarte nicht an ihren Platz gesetzt werden, wird die Seite wieder entfernt und der Code geliefert | |
of_insert_page (string as_key, string as_title, dragobject ado_page, boolean ab_closable, string as_icon, integer ai_index) | Ebenso, mit dem, was of_add_page sagt: ob der Tab schließbar ist, und sein Symbol. Liefert 0 nach der Anwendung, -5 bei denselben Ablehnungen wie of_add_page, -2 wenn die Komponente nicht erzeugt ist. Eine Position 0 oder kleiner ist die erste, über das Ende hinaus die letzte. Kann die Registerkarte nicht an ihren Platz gesetzt werden, wird die Seite wieder entfernt und der Code geliefert | |
of_move_page (string as_key, integer ai_index) | Verschiebt eine vorhandene Registerkarte an die Position ai_index (1 = die erste); ihre gehostete Seite und die Auswahl bleiben erhalten. Liefert 0 nach der Anwendung, -5 wenn der Schlüssel keine Seite bezeichnet, -2 wenn die Komponente nicht erzeugt ist. Eine Position 0 oder kleiner ist die erste, über das Ende hinaus die letzte; eine Registerkarte, die bereits an ihrem Platz ist, bewegt nichts und meldet nichts | |
of_select_page (string as_key) | Aktiviert eine Registerkarte wie ein Klick darauf: bei aktivem ib_veto_selection wird zuerst ue_selection_changing gefragt; dann folgt ue_selection_changed wie bei einem Klick (direkt nach Ihrem Skript, aus der Ereigniswarteschlange), und of_selected_key() liefert direkt danach bereits den neuen Schlüssel. Ist die Registerkarte schon aktiv, wird nichts gefragt und nichts ausgelöst. Liefert 0 nach der Anwendung (oder wenn schon aktiv), -4 wenn Ihr ue_selection_changing abgelehnt hat (nichts bewegt sich), -5 wenn der Schlüssel keine Seite bezeichnet oder die Seite nicht angezeigt werden kann (ausgeblendet, deaktiviert, jenseits der Demo-Grenze) — auch wenn danach gar keine Seite aktiv ist, -2 wenn die Komponente nicht erzeugt ist | |
of_remove_page (string as_key) | Entfernt die Registerkarte und gibt das Steuerelement an sein ursprüngliches Fenster zurück, ausgeblendet. Das Steuerelement bleibt nutzbar und kann anderswo gehostet werden. Löst ue_tab_closed nicht aus: Ihr Code hat es getan. War es die aktive Seite, wird ihre Nachbarin aktiv. Liefert 0 nach der Anwendung, -5 wenn der Schlüssel keine Seite bezeichnet, -2 wenn die Komponente nicht erzeugt ist | |
of_selected_key ( ) | Bezeichner der aktiven Registerkarte, "", wenn keine aktiv ist | |
of_get_layout ( ) | Liest die aktuelle Anordnung als JSON zurück: die Reihenfolge der Registerkarten und deren Sichtbarkeit. Speichern (Datei, Datenbank, Registry) und beim nächsten Start mit of_set_layout zurückgeben. Dasselbe Paar trägt auf jeder umsortierbaren Komponente dieselben Namen | |
of_set_layout (string as_layout_json) | Stellt eine mit of_get_layout gelesene oder über ue_layout_changed empfangene Anordnung wieder her. Was die Anordnung nicht nennt, behält seinen Platz am Ende: Eine gestern gespeicherte Anordnung darf seither Hinzugefügtes nicht verschwinden lassen. Ändert sie die Reihenfolge oder die Sichtbarkeit, wird ue_layout_changed einmal ausgelöst; eine Anordnung, die nichts ändert, wird nicht gemeldet. Blendet sie die aktive Registerkarte aus, wird ihre Nachbarin aktiv und ue_selection_changed meldet es. Liefert 0 nach der Anwendung, -5 wenn der Text leer oder kein gültiges JSON ist, -2 wenn die Komponente nicht erzeugt ist | |
of_supply_page (string as_key, dragobject ado_page) | Gibt einer ohne Steuerelement hinzugefügten Seite (of_add_page(key, title)) ihr Steuerelement — in ue_page_needed oder wann immer Ihr Code bereit ist. Die angezeigte Seite zeigt es sofort; eine andere hält es verborgen, bis sie ausgewählt wird. Liefert 0 nach dem Hosten, -5 wenn der Schlüssel keine Seite nennt, die Seite ihr Steuerelement schon hat oder das Steuerelement fehlt oder bereits gehostet ist, -2 wenn die Komponente nicht erzeugt ist | |
of_page (string as_key) | n_pbt_tab_page-Handle der Seite (beim ersten Zugriff erzeugt). Für jeden Schlüssel wird ein Handle geliefert, auch für einen ohne Seite: Prüfen Sie mit of_has | |
of_refresh_page (string as_key) | Frischt die Darstellung einer außerhalb des Bildschirms aufgebauten Seite auf, ohne Flackern. Liefert 0, -5 wenn der Schlüssel keine Seite bezeichnet, -2 wenn die Komponente nicht erzeugt ist | |
of_relayout ( ) | Veröffentlicht den Seitenbereich erneut, damit das gehostete Steuerelement neu positioniert wird (nützlich nach einer verzögerten Anzeige). Liefert 0 nach der Anwendung, -2 wenn die Komponente nicht erzeugt ist | |
of_preload_icons (string as_icons[]) | Wärmt beim Start einen Satz Symbole vor: Eine später geöffnete Registerkarte zeigt ihr Symbol sofort. Liefert 0 nach der Anwendung, -2 wenn die Komponente nicht erzeugt ist | |
of_reset ( ) | Leert die Leiste: Jede gehostete Seite wird an ihr ursprüngliches Fenster zurückgegeben, danach kehrt die Komponente in ihren Neuzustand zurück. Liefert 0 nach der Anwendung, -2 wenn die Komponente nicht erzeugt ist | |
of_set_redraw (boolean) | Fasst eine Folge von Änderungen zu einer einzigen Darstellung zusammen. Liefert 0 nach der Anwendung, -2 wenn die Komponente nicht erzeugt ist | |
of_save_as_png (string) · of_save_as_jpg (string) | Exportiert die Darstellung als Bild. Liefert 0 nach dem Schreiben des Bildes, -4 wenn das Schreiben fehlschlägt, -2 wenn die Komponente nicht erzeugt ist |
of_add_pagegibt einen negativen Code zurück, wenn der Bezeichner leer ist, bereits verwendet wird oder wenn das übergebene Steuerelement ungültig oder bereits gehostet ist.
Wenn zu viele Registerkarten offen sind — sie schrumpfen, um in das Band zu passen, aber nie unter eine lesbare Breite: Symbol und Schließkreuz beanspruchen ihren Platz zusätzlich zum Titel, nie auf dessen Kosten. Was nicht mehr hineinpasst, wird aus dem Band genommen, und an dessen Ende erscheint eine Schaltfläche ···: Sie öffnet die Liste aller sichtbaren Registerkarten, die aktive angehakt, und die Auswahl wechselt dorthin. Die aktive Registerkarte bleibt immer sichtbar. Das Band scrollt nicht — diese Schaltfläche ist der Weg zu den Registerkarten außerhalb des Rahmens. Nichts zu programmieren, das Verhalten ist automatisch.
Tastatur und Maus — Strg+Tab und Strg+Bild ab wechseln zur nächsten Registerkarte, Strg+Umschalt+Tab und Strg+Bild auf zur vorherigen: Es zählen nur Registerkarten, die aktiv werden können (ausgeblendete und ausgegraute werden übersprungen), und der Durchlauf beginnt am Ende wieder von vorn. Diese Tasten wirken, wenn die Tastatur im Registerkartenband oder in einer Seite ist, die es hostet — ein PowerBuilder-Steuerelement der Seite ebenso wie eine andere darin platzierte Komponente; aus einem Steuerelement außerhalb des Tabs bleiben sie beim Fenster. Es ist eine Geste des Benutzers: ue_selection_changing wird gestellt, wenn ib_veto_selection aktiv ist, danach folgt ue_selection_changed. Ein Mittelklick auf eine schließbare Registerkarte schließt sie, genau wie ihr Kreuz: dieselbe Frage ue_tab_closing, wenn ib_veto_close aktiv ist, danach ue_tab_closed; auf einer ausgegrauten oder nicht schließbaren Registerkarte bewirkt er nichts. Nichts zu programmieren. Umschalt+F10 oder die Menütaste auf einer Registerkarte öffnet ihr Menü unter der Registerkarte; Strg+Umschalt+Pfeil verschiebt die Registerkarte mit Fokus, wenn ib_reorderable auf true steht. Braucht eine Seite Strg+Tab selbst, setzen Sie ib_cycle_keys auf false.
Events #
| Event | Ausgelöst wenn |
|---|---|
ue_selection_changed (string as_from_key, string as_key) | Die aktive Registerkarte hat gewechselt, durch eine Geste (ein Klick, die Tastatur einschließlich Strg+Tab, ein Tastenkürzel, die Registerkartenliste), durch of_select_page (ein Befehl Ihres Codes löst es ebenfalls aus, wie SelectTab SelectionChanged auslöst) oder weil eine Registerkarte geht (geschlossen, entfernt, ausgeblendet). Dieselben Argumente wie ue_selection_changing: Frage und Ergebnis lesen sich gleich, und as_from_key ist die verlassene Seite — auch wenn es sie nicht mehr gibt. Ein leeres as_key bedeutet, dass keine Registerkarte mehr angezeigt werden kann: alle Seiten sind verborgen. Das Schließen der aktiven Registerkarte löst ue_selection_changed(geschlossen, Nachbarin) und dann ue_tab_closed(geschlossen) aus. Eine ohne Steuerelement hinzugefügte Seite erhält ue_page_needed vor diesem Event |
ue_tab_closed (string as_key) | Der Benutzer hat eine Registerkarte geschlossen: ihr Kreuz, ein Mittelklick darauf, das Kontextmenü oder die Entf-Taste. Die Registerkarte ist bereits entfernt und die Seite an ihr Fenster zurückgegeben. of_remove_page löst es nie aus: Ihr Code hat es getan |
ue_tab_reordered (string as_key, integer ai_index) | Der Benutzer hat eine Kopfzeile an einer neuen Stelle abgelegt — mit der Maus oder mit Strg+Umschalt+Pfeil auf einer Registerkarte mit Fokus (ib_reorderable). Nur ausgelöst, wenn sich die Reihenfolge wirklich geändert hat. ai_index ist die neue Position, beginnend bei 1, wie of_move_page |
ue_layout_changed (string as_layout_json) | Die zu speichernde Anordnung hat sich geändert: Der Benutzer hat eine Kopfzeile gezogen, oder Ihr Code hat eine Registerkarte verschoben (of_move_page, of_insert_page), aus- bzw. wieder eingeblendet (ib_visible) oder eine Anordnung angewendet (of_set_layout) — einmal pro echter Änderung, einmal für eine Folge unter of_set_redraw(false). Das Hinzufügen, Schließen oder Entfernen einer Registerkarte löst es nicht aus: Die Reihenfolge der anderen ändert sich nicht. Trägt die gesamte Anordnung, nicht nur das Verschobene: Das Speichern ist eine einzige Zuweisung |
ue_selection_changing (string as_from_key, string as_key) → boolean | Abbrechbar, wird vor dem Wechsel der aktiven Registerkarte gestellt — durch eine Geste des Benutzers oder durch of_select_page —, wenn ib_veto_selection auf true steht (standardmäßig deaktiviert). Geben Sie false zurück, um auf der Seite zu bleiben: nichts bewegt sich, und of_select_page liefert -4 |
ue_tab_closing (string as_key) → boolean | Abbrechbar, wird vor dem Schließen einer Registerkarte durch den Benutzer gestellt, wenn ib_veto_close auf true steht (standardmäßig deaktiviert). Benannt als Paar zu ue_tab_closed: closing / closed. Geben Sie false zurück, um die Registerkarte (und ihre gehostete Seite) offen zu halten |
ue_tab_rclicked (string as_key, long al_x, long al_y) | Rechtsklick auf eine Registerkarten-Kopfzeile — oder Umschalt+F10 / die Menütaste auf einer Registerkarte mit Fokus —, wenn ib_context_menu auf false steht: Die Registerkarte wird zuerst ausgewählt (über ue_selection_changing, wenn es aktiviert ist — eine abgelehnte Auswahl löst nichts aus), dann liefert dieses Event ihren Schlüssel und al_x, al_y in Bildschirmpixeln (der Mauszeiger; per Tastatur die linke untere Ecke der Registerkarte) — was of_show eines contextmenu erwartet. Ein PowerBuilder-Menü öffnet sich am Mauszeiger des Fensters: PopMenu(PointerX(), PointerY()). Eine deaktivierte Registerkarte löst nichts aus; ein Event pro Rechtsklick |
ue_tab_double_clicked (string as_key) | Doppelklick auf eine Registerkarten-Kopfzeile (das DoubleClicked eines PowerBuilder-Tabs): Seite umbenennen, abtrennen, vergrößern — Ihr Code entscheidet. Der erste Klick hat die Registerkarte bereits ausgewählt. Nur eine Geste; eine deaktivierte Registerkarte löst nichts aus |
ue_page_needed (string as_key) | Eine ohne Steuerelement hinzugefügte Seite (of_add_page(key, title)) wird gleich gezeigt: Erzeugen Sie hier ihr Steuerelement (OpenUserObject…) und übergeben Sie es mit of_supply_page. Ausgelöst vor ue_selection_changed und bevor of_select_page zurückkehrt; einmal pro Anzeige, bei der nächsten erneut, solange die Seite kein Steuerelement hat. Bis dahin zeigt der Inhalt das Design |
ue_ready ( ) | Die Komponente ist fertig geladen; alles zuvor Gesendete wurde nachgespielt |
ue_runtime_missing ( ) | Die WebView2-Runtime fehlt: die Komponente bleibt leer |
ue_bg_color (long al_color) | Die Komponente hat ihre Design-Hintergrundfarbe berechnet; das Userobject hat sie bereits übernommen (backcolor) |
Beispiele #
Ein Ordner mit fachlichen Seiten #
// open-Event : die Seiten-Userobjects liegen bereits auf dem Fenster
uo_tabs.of_set_redraw(/*on*/ false)
// Eine Registerkarte je Seiten-Userobject
uo_tabs.of_add_page(/*key*/ "identity", /*title*/ "Identität", /*page*/ uo_identity)
uo_tabs.of_add_page(/*key*/ "addresses", /*title*/ "Adressen", /*page*/ uo_addresses)
uo_tabs.of_add_page(/*key*/ "accounting", /*title*/ "Buchhaltung", /*page*/ uo_accounting)
// Ein Symbol je Registerkarte, am Handle der Seite gesetzt
uo_tabs.of_page(/*key*/ "identity").is_icon = "mono:img\user.svg"
uo_tabs.of_page(/*key*/ "addresses").is_icon = "mono:img\map.svg"
uo_tabs.of_page(/*key*/ "accounting").is_icon = "mono:img\euro.svg"
// Ein einziges Rendern fuer alles, dann wird die erste Registerkarte angezeigt
uo_tabs.of_set_redraw(/*on*/ true)
uo_tabs.of_select_page(/*key*/ "identity")
Schließbare Dokumente, bei Bedarf geöffnet #
// Local variables
string ls_key, ls_label
// Ein Dokument in einer neuen schliessbaren Registerkarte oeffnen : Schluessel und Titel
ls_key = "report42"
ls_label = "Bericht 42"
uo_tabs.of_add_page(/*key*/ ls_key, /*title*/ ls_label, /*page*/ uo_editor, /*closable*/ true, /*icon*/ "mono:img\doc.svg")
uo_tabs.of_select_page(/*key*/ ls_key)
// Event ue_tab_closed von uo_tabs : (string as_key)
// Die Registerkarte ist bereits entfernt ; es bleibt nur, Ihre Fachdaten freizugeben.
of_free_document(as_key)
// Das Kreuz nur auf der aktiven Registerkarte, ein Punkt auf einer Seite mit
// nicht gespeicherter Arbeit, und ein Zaehler auf einer anderen
uo_tabs.is_close_mode = uo_tabs.CLOSE_ACTIVE
uo_tabs.of_page(/*key*/ "report42").ib_modified = true
uo_tabs.of_page(/*key*/ "inbox").is_badge = "3"
Seiten bei Bedarf erzeugen #
Eine schwere Seite muss nicht existieren, bevor sie besucht wird: Fügen Sie sie ohne ihr Steuerelement hinzu und erzeugen Sie es in ue_page_needed, wie das CreateOnDemand eines PowerBuilder-Tabs.
// open-Event des Fensters : die schweren Seiten werden OHNE ihr Steuerelement hinzugefuegt
uo_tabs.of_add_page(/*key*/ "orders", /*title*/ "Auftraege")
uo_tabs.of_add_page(/*key*/ "history", /*title*/ "Verlauf")
// Event ue_page_needed von uo_tabs : (string as_key)
// Local variables
u_orders luo_orders
// Die Seite wird zum ersten Mal gezeigt : ihr Steuerelement erzeugen, dann uebergeben
if as_key = "orders" then
parent.OpenUserObject(luo_orders)
uo_tabs.of_supply_page(/*key*/ as_key, /*page*/ luo_orders)
end if
Umsortieren mit der Maus #
// The user may drag a tab to a new place
uo_tabs.ib_reorderable = true
// Event ue_tab_reordered von uo_tabs : (string as_key, integer ai_index)
// ai_index = neue Position, beginnend bei 1 (wie of_move_page) : wir speichern die gewaehlte Reihenfolge.
of_save_order(as_key, ai_index)
Senkrechte Leiste #
// Registerleiste an der linken Seite, nuetzlich bei langen Beschriftungen
uo_tabs.is_position = uo_tabs.POSITION_START
Eine Registerkarte je nach Rechten grau ausblenden oder verbergen #
// Der Weg fuehrt immer ueber das Handle der Seite
uo_tabs.of_page(/*key*/ "accounting").ib_enabled = of_is_allowed("accounting")
uo_tabs.of_page(/*key*/ "audit").ib_visible = gb_expert_mode
Auf die Auswahl reagieren #
// Event ue_selection_changed von uo_tabs : (string as_from_key, string as_key)
choose case as_key
case "identity" ; uo_identity.of_refresh()
case "addresses" ; uo_addresses.of_refresh()
case "accounting" ; uo_accounting.of_refresh()
end choose
Einen Registerkartenwechsel oder ein Schließen ablehnen #
// Beide Fragen muessen EINGESCHALTET werden: ohne diese Zeilen fragt die
// Komponente nichts und wechselt oder schliesst sofort.
uo_tabs.ib_veto_selection = true
uo_tabs.ib_veto_close = true
// Event ue_selection_changing von uo_tabs : (string as_from_key, string as_key)
// FALSE zurueckzugeben haelt den Benutzer auf der Seite, die er verlaesst.
if of_page_modified(as_from_key) then
if MessageBox("Änderungen", "Ohne Speichern verlassen?", Question!, YesNo!) = 2 then
return false
end if
end if
return true
// Event ue_tab_closing von uo_tabs : (string as_key)
// FALSE zurueckzugeben haelt die Registerkarte und ihre gehostete Seite offen.
return not of_page_modified(as_key)
Wieder mit einer leeren Leiste beginnen #
// of_reset gibt JEDE gehostete Seite an ihr urspruengliches Fenster zurueck, bevor geleert wird
uo_tabs.of_reset()
uo_tabs.of_add_page(/*key*/ "home", /*title*/ "Startseite", /*page*/ uo_home)
Best Practices #
- Die gehosteten Steuerelemente müssen vor dem Aufruf vorhanden sein: Legen Sie sie zur Entwurfszeit auf das Fenster, die Komponente kümmert sich um das Ausblenden und das Neupositionieren.
- Laden Sie die Seiten einmal im
open-Event und steuern Sie danach nur noch die Auswahl: Das ist schneller, als fortlaufend Seiten hinzuzufügen und zu entfernen. - Rufen Sie
of_preload_iconsbeim Start auf, wenn Ihre Registerkarten Symbole tragen: Andernfalls zeigt sich beim ersten Öffnen einer ausgeblendeten Registerkarte eine kurze Verzögerung, bevor das Symbol erscheint. - Beide Fragen sind opt-in: Setzen Sie
ib_veto_selection/ib_veto_closeauftrue, um einen Registerkartenwechsel oder ein Schließen ablehnen zu können (ein leer gelassenes Ereignis erlaubt die Aktion immer). Jede Frage kostet einen Hin- und Rückweg zu PowerBuilder. - Ein gehostetes Steuerelement ist ein natives Fenster: Es zeichnet sich über der Web-Ebene. Kein visueller Effekt der Komponente kann darüber hinweggehen.
- Vergessen Sie
of_reset()nicht, bevor Sie eine Leiste neu aufbauen: Ohne diesen Aufruf schlägt die Wiederverwendung eines Seitenbezeichners fehl und die vorherigen Steuerelemente bleiben sichtbar. - Für Bereiche, die sich in der Größe ändern und abdocken lassen, statt sich gegenseitig ausschließender Seiten, greifen Sie besser zu dockcontainer.
- Mit der Tastatur folgt die Registerleiste ihrer Achse: Links/Rechts (bei Schreibrichtung von rechts nach links vertauscht), Oben/Unten in den Positionen
start/end, Pos1/Ende, Eingabe oder Leertaste zum Aktivieren, Entf zum Schließen einer schließbaren Registerkarte. Deaktivierte und aus der Leiste verdrängte Registerkarten werden übersprungen. - Viele schwere Seiten? Fügen Sie sie ohne ihr Steuerelement hinzu (
of_add_page(key, title)) und erzeugen Sie jede inue_page_needed: Die Maske öffnet sich schnell, und nur besuchte Seiten existieren.
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.
| Mitglieder | Rolle | Beschrieben in |
|---|---|---|
of_count · of_keys_at · of_has | Durchlaufen, was die Komponente enthält | 3.2 Die Items |
of_reset | Die Komponente zurücksetzen | 3.6 Eine Komponente zurücksetzen: of_reset() |
of_register_shortcut · of_clear_shortcuts | Tastenkürzel der Komponente | 3.5 Tastenkombinationen |
of_is_created · of_is_ready · of_get_last_error | Ob sie entstanden ist, ob sie bereit ist, was fehlschlug | 3.7 Diagnose |
of_save_as_png · of_save_as_jpg | Die Darstellung als Bild exportieren | 3.8 Die Darstellung als Bild exportieren |
of_set_redraw | Änderungen zu einem einzigen Neuzeichnen bündeln | 3.10 Best Practices |
of_preload_icons | Symbole ohne Verzögerung | Sofortige Anzeige: of_icon |
of_set_translation | Eine Beschriftung der Komponente übersetzen | 5.2 Eine Beschriftung anpassen: of_set_translation |
of_focus_webview | Der Komponente den Fokus geben | 6.4 Tastatur und Fokus |
of_print · of_print_to_pdf | Drucken oder ein PDF schreiben | 6.9 Drucken |
of_set_property · of_get_property · of_component_name | Eine Eigenschaft über ihren Namen steuern | 3.1 Die Eigenschaften-Engine |
is_accessible_name · is_accessible_description | Name und Beschreibung, die ein Bildschirmleser sagt | 3.4 Optionale Eigenschaften und Events |
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.