dockcontainer — u_pbt_dockcontainer #
← Komponentenreferenz · Inhalt des Handbuchs
Andockbare Panels im Stil von Visual Studio: Andocken per Drag & Drop, Stapeln als Registerkarten, verstellbare Trennlinien, schwebende Fenster, automatisches Ausblenden — und Speichern bzw. Wiederherstellen der Anordnung.
▶ Live ansehen — Demoanwendung, Kachel Dock container: die Vorschau, der zugehörige Code und diese Seite, nebeneinander.
Auf einen Blick #
| Userobject | u_pbt_dockcontainer |
| Item-Klasse | n_pbt_dock_panel (ein Panel) |
| Wofür | Einem PowerBuilder-Fenster die Ergonomie einer modernen IDE geben: Die Benutzer ordnen ihre Panels selbst an, und die Anordnung ist in der nächsten Sitzung wieder da |
Wie bei tab beherbergt jedes Panel ein echtes PowerBuilder-Steuerelement (dragobject): ein Userobject, eine DataWindow oder eine weitere PBToolboxAI-Komponente. Siehe Echte PowerBuilder-Steuerelemente hosten.
Schnellstart #
// open-Event des Fensters : die Panel-Steuerelemente liegen bereits darauf
uo_dock.of_add_panel(/*key*/ "document", /*position*/ "", /*relative_to*/ "", /*size*/ 0, /*title*/ "Dokument", /*content*/ uo_editor)
// Der Explorer, am Anfang des Dokuments angedockt, 260 Pixel breit
uo_dock.of_add_panel(/*key*/ "explorer", /*position*/ uo_dock.POSITION_START, /*relative_to*/ "document", /*size*/ 260, /*title*/ "Explorer", /*content*/ uo_tree)
// Die Eigenschaften, am Ende des Dokuments angedockt, 300 Pixel breit
uo_dock.of_add_panel(/*key*/ "properties", /*position*/ uo_dock.POSITION_END, /*relative_to*/ "document", /*size*/ 300, /*title*/ "Eigenschaften", /*content*/ uo_props)
// Der zentrale Bereich : vom Docking weder schliessbar noch schwebend noch ausblendbar
uo_dock.is_main = "document"
Eigenschaften #
| Eigenschaft | Typ | Standard | Zweck |
|---|---|---|---|
is_main | string | "" | Schlüssel des Haupt-Panels: der zentrale Dokumentbereich, der weder ausgeblendet noch abgelöst werden kann und auf dem kein Panel gestapelt wird. Vor dem Hinzufügen dieses Panels gesetzt, wird er aufbewahrt und von dessen of_add_panel angewendet; "" entfernt das Haupt-Panel |
ib_veto_close | boolean | false | Opt-in: nachfragen, bevor sich ein Panel schließt — das Kreuz seiner Kopfzeile, Schließen / Andere schließen im Menü, das Kreuz eines ausgefahrenen Panels und of_close_panel (löst ue_panel_closing aus, das ablehnen kann; ein abgelehnter Befehl liefert -4). Standardmäßig aus, wie jedes abbrechbare Ereignis der Bibliothek: Setzen Sie true, um ein Panel mit nicht gespeicherter Arbeit offen zu halten |
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 |
Docking-Positionen #
Die Konstanten der Komponente speisen as_position in of_add_panel und of_move_panel:
| Konstante | Wert | Wirkung |
|---|---|---|
POSITION_START | "start" | Das neue Panel dockt an der Seite des Leseanfangs des Referenz-Panels an (links bei Schreibrichtung von links nach rechts) |
POSITION_END | "end" | … an der Seite des Leseendes |
POSITION_TOP | "top" | … darüber |
POSITION_BOTTOM | "bottom" | … darunter |
POSITION_STACK | "stack" | Das Panel wird als Registerkarte auf das Referenz-Panel gestapelt. Dieser Wert gilt, wenn as_position leer ist |
Eigenschaften eines Panels — n_pbt_dock_panel #
Über of_panel(schluessel) zu erhalten.
| Eigenschaft | Typ | Standard | Zweck |
|---|---|---|---|
is_title | string | "" | Titel, der auf der Registerkarte des Panels angezeigt wird; leer (kein Titel angegeben) zeigt die Registerkarte den Schlüssel und das Haupt-Panel hat keine Kopfzeile — ein später gegebener Titel lässt sie erscheinen. Akzeptiert die Rich-Text-Auszeichnung |
is_short_title | string | "" | Kurzform des Titels für die Stellen mit wenig Platz: die Randleiste eines angehefteten Panels (immer — sie ist ein schmaler Streifen) und eine gestapelte Registerkarte, aber erst, wenn der volle Titel dort nicht mehr passt, was gemessen und nicht geraten wird. Die Kopfzeile des Panels behält den vollen Titel. "" = keine Kurzform |
ib_visible | boolean | true | Blendet dieses Panel ein oder aus. Das Haupt-Panel lässt sich nicht ausblenden; das Ausblenden eines schwebenden Panels schließt sein Fenster, und es kehrt angedockt an seinen Platz zurück. Wieder eingeblendet, kommt es im Stapel nach vorn (ue_panel_selected folgt); in einer eingeklappten Gruppe kehrt seine Lasche auf die Leiste zurück |
ib_pinned | boolean | true | true = an Ort und Stelle fixiert; false = die ganze Gruppe des Panels (seine Registerkarten eingeschlossen) klappt zu Laschen am Rand zusammen. Eine Lasche fährt ihr Panel beim Überfahren (nach 400 ms) oder sofort per Klick aus; beim Überfahren geöffnet, klappt es wieder ein, sobald die Maus es verlässt und der Fokus nicht darin liegt, per Klick geöffnet bleibt es bis zu einem Klick daneben. Die Pin-Schaltfläche der Kopfzeile löst ue_panel_pinned für jedes Panel der Gruppe aus, und ebenso ib_pinned aus dem Code zu setzen (ein Befehl löst es wie die Geste aus); ein in eine eingeklappte Gruppe verschobenes Panel wird mit ihr eingeklappt, und ue_panel_pinned meldet es |
ib_front | boolean | true | Nur lesend: true, wenn dieses Panel dasjenige ist, das sein Stapel zeigt (angedockt, fixiert, vorn in seiner Registerleiste). Bei jedem Lesen bei der Komponente erfragt: es folgt den Klicks, den Befehlen Ihres Codes, einem davor geschlossenen oder abgekoppelten Panel. ue_panel_selected meldet, wann es sich ändert |
ib_closable | boolean | true | Darf der Benutzer dieses Panel schließen (Kreuz der Kopfzeile, Kreuz des ausgefahrenen Panels, Schließen / Andere schließen im Menü)? Beim Hinzufügen durch of_add_panel(…, ab_closable) gesetzt, jederzeit änderbar: das Kreuz und die Menüeinträge folgen sofort. of_close_panel lehnt ein nicht schließbares Panel ab (-5) |
is_header_color | string | "" | Kopfzeilenfarbe dieses Panels. Leer = das Thema entscheidet; HEADER_COLOR_ACCENT folgt der Themenakzentfarbe (auch nach einem Themenwechsel, anders als ein fester Code); sonst ein #rrggbb. Die lesbare Textfarbe wird mitgeliefert |
is_border_color | string | "" | Rahmenfarbe dieses Panels, gleiche Schreibweise. Sie umrandet den Rahmen und die Kopfzeile, die jeweils eine eigene besitzen: nur eine davon zu färben hinterlässt eine sichtbare Naht. Sie folgt dem Panel in sein Flyout |
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_back_color | long | -1 | Hintergrund der Registerkarte DIESES Panels in einem Stapel und seiner Lasche am Rand, sobald es gelöst ist (-1 = der der Komponente, folgt dem Design). Die Kopfzeile eines einzelnen Panels nimmt is_header_color |
il_text_color | long | -1 | Textfarbe der Registerkarte und der Lasche DIESES Panels (-1 = die der Komponente) |
il_back_color_hover | long | -1 | Hintergrund der Registerkarte und der Lasche DIESES Panels beim Überfahren (-1 = der der Komponente) |
il_text_color_hover | long | -1 | Textfarbe der Registerkarte und der Lasche DIESES Panels beim Überfahren (-1 = die der Komponente) |
il_accent | long | -1 | Akzent DIESES Panels (-1 = Akzent der Komponente); die Kopfzeile folgt ihm, wenn is_header_color den Wert HEADER_COLOR_ACCENT hat |
Methoden #
| Methode | Zweck |
|---|---|
of_add_panel (string as_key, string as_position, string as_relative_to, integer ai_size, string as_title, dragobject ado_content) | Fügt ein schließbares Panel hinzu und hostet das Steuerelement. as_relative_to = Schlüssel des Panels, an dem es andockt (leer = die Wurzel); ai_size = Anfangsgröße in Pixeln (0 = automatisch). Liefert 0 nach der Anwendung, -5 bei einem leeren, bereits vergebenen oder / oder einen senkrechten Strich enthaltenden Schlüssel, einem bereits gehosteten oder das Dock enthaltenden Steuerelement, einem unbekannten as_relative_to oder einem Stapeln (POSITION_STACK) auf das Haupt-Panel oder einer unbekannten Position — dann wird nichts angetastet, -6 im Demo-Modus, sobald das Dock seine drei Panels trägt (das Steuerelement bleibt sichtbar an seinem Platz), -2 wenn die Komponente nicht erzeugt ist |
of_add_panel (…, boolean ab_closable) | Dasselbe, mit ab_closable = false für ein Panel ohne Schließen-Schaltfläche. Liefert 0 nach der Anwendung, -5 bei einem leeren, bereits vergebenen oder / oder einen senkrechten Strich enthaltenden Schlüssel, einem bereits gehosteten oder das Dock enthaltenden Steuerelement, einem unbekannten as_relative_to oder einem Stapeln (POSITION_STACK) auf das Haupt-Panel oder einer unbekannten Position — dann wird nichts angetastet, -6 im Demo-Modus, sobald das Dock seine drei Panels trägt (das Steuerelement bleibt sichtbar an seinem Platz), -2 wenn die Komponente nicht erzeugt ist |
of_select_panel (string as_key) | Bringt ein Panel ins Blickfeld: nach vorn in seinem Stapel, sein Ausklapp-Panel geöffnet, wenn seine Gruppe eingeklappt ist, sein Fenster nach vorn geholt, wenn es schwebt. Kommt ein angedocktes Panel in seinem Stapel nach vorn, folgt ue_panel_selected wie bei einem Klick auf seine Registerkarte. Liefert 0 nach der Anwendung, -5 bei einem unbekannten Schlüssel oder einem AUSGEBLENDETEN Panel (es zu zeigen ist Aufgabe von ib_visible), -2 wenn die Komponente nicht erzeugt ist |
of_move_panel (string as_key, string as_target, string as_position) | Ordnet aus dem Code neu an, wie eine auf einer Andockhilfe abgelegte Registerkarte: as_target bezeichnet die Gruppe des Ziel-Panels — ein anderes Panel seines Stapels bezeichnet dieselbe Gruppe, so teilt man einen Stapel —, leer = der Außenrand des Docks. Ein in eine eingeklappte Gruppe verschobenes Panel wird mit ihr eingeklappt (ue_panel_pinned folgt), und das Panel, das in einem Stapel nach vorn kommt, löst ue_panel_selected aus. Liefert 0 nach der Anwendung, -5 bei einem unbekannten Schlüssel, einem unbekannten Ziel (as_target) oder dem Panel selbst als Ziel, einer unbekannten Position, einem Stapeln auf das Haupt-Panel oder einem Stapeln DES Haupt-Panels, -2 wenn die Komponente nicht erzeugt ist |
of_move_panel (string as_key, string as_target, string as_position, integer ai_index) | Dasselbe, mit dem Rang des Panels im Stapel des Ziels (1 = erstes, 0 oder weniger = letztes) — ein Rang, den die Maus noch nicht geben kann: eine auf einer Gruppe abgelegte Registerkarte landet immer zuletzt. Nur ein Stapel ist eine geordnete Liste: Bei POSITION_START / END / TOP / BOTTOM wird der Index ignoriert. Liefert 0 nach der Anwendung, -5 bei einem unbekannten Schlüssel, einem unbekannten Ziel (as_target) oder dem Panel selbst als Ziel, einer unbekannten Position, einem Stapeln auf das Haupt-Panel oder einem Stapeln DES Haupt-Panels, -2 wenn die Komponente nicht erzeugt ist |
of_float_panel (string as_key) | Löst das Panel in ein echtes schwebendes Fenster ab, das verschoben und in der Größe geändert werden kann; ein schon früher abgelöstes Panel erhält den Platz seines Fensters zurück. Wird es geschlossen, dockt das Panel wieder an (ue_panel_docked). Nicht das Hauptpanel (is_main): es ist der Dokumentbereich, um den sich die anderen anordnen, es baut seine eigene Kopfzeile und kann weder abgedockt noch versteckt noch geschlossen werden. ue_panel_floated folgt, wie bei der Schaltfläche der Kopfzeile, einem Doppelklick auf die Kopfzeile oder die Registerkarte oder Abkoppeln im Kontextmenü. Liefert 0 nach der Anwendung, -5 bei einem unbekannten Schlüssel, dem Haupt-Panel oder einem AUSGEBLENDETEN Panel, -2 wenn die Komponente nicht erzeugt ist |
of_close_panel (string as_key) | Schließt das Panel wie sein Kreuz: es wird ausgeblendet (ib_visible = true zeigt es wieder an) und ue_panel_closed folgt. Mit ib_veto_close = true wird zuerst ue_panel_closing gestellt. Liefert 0 nach der Anwendung, -4 wenn Ihr ue_panel_closing abgelehnt hat (das Panel bleibt), -5 bei einem unbekannten Schlüssel, dem Haupt-Panel, einem ausgeblendeten oder nicht schließbaren Panel (ib_closable = false), -2 wenn die Komponente nicht erzeugt ist |
of_notify_panel (string as_key) | Meldet neuen Inhalt: Ist das Panel nicht sichtbar, zeigt seine Registerkarte einen Zähler ungesehener Elemente, der beim Auswählen gelöscht wird. Liefert 0 nach der Anwendung, -5 bei einem ungültigen Argument (leerer Schlüssel, falsche Adresse), -2 wenn die Komponente nicht erzeugt ist |
of_clear_notify (string as_key) | Löscht diesen Zähler, ohne das Panel anzuzeigen. Das Auswählen der Registerkarte war der einzige andere Weg, was falsch ist, wenn Ihr Code weiß, dass der Inhalt selbst verschwunden ist. Liefert 0 nach der Anwendung, -5 bei einem ungültigen Argument (leerer Schlüssel, falsche Adresse), -2 wenn die Komponente nicht erzeugt ist |
of_remove_panel (string as_key) | Entfernt das Panel und gibt das Steuerelement an sein ursprüngliches Fenster zurück, an seinen Platz, in seiner Größe und mit der Sichtbarkeit, die es vor of_add_panel hatte — sichtbar, wenn es das war: für ein Panel, das sich schließt und zurückkommen kann, blendet of_close_panel (oder ib_visible = false) es aus, ohne es zurückzugeben. Liefert 0 nach der Anwendung, -5 bei einem ungültigen Argument (leerer Schlüssel, falsche Adresse), -2 wenn die Komponente nicht erzeugt ist |
of_active_panel ( ) | Liefert den Schlüssel des aktiven Panels: desjenigen, das die Tastatur hat — ein Steuerelement seines Inhalts hat den Fokus, oder seine Registerkarte oder Kopfzeile wurde zuletzt angeklickt. Leer, wenn die Tastatur in einem anderen Steuerelement desselben Fensters ist; ein Meldungsfenster, ein Menü oder ein anderes Fenster ändern nichts. Nicht das Panel vorn in seinem Stapel (ib_front des Panels). Bei jedem Aufruf bei der Komponente erfragt; ue_active_panel_changed meldet, wann es sich ändert |
of_get_layout ( ) | Liefert die aktuelle Anordnung (Baum der Aufteilungen, Verhältnisse, Registerkarten, Sichtbarkeit, schwebende Panels und die Lage ihres Fensters) als Zeichenkette, bereit zur Ablage in einer Datei, einer Datenbank oder der Registry |
of_set_layout (string as_json) | Stellt eine mit of_get_layout gewonnene Anordnung wieder her. Die Panels müssen vorher neu erstellt worden sein; Panels, die in der Anordnung fehlen — oder alle, wenn sie keines kennt —, kommen in eine Gruppe neben den anderen, nie auf das Haupt-Panel. Schwebende Panels erhalten ihr Fenster an seinem Platz zurück, auf einen Bildschirm zurückgeholt, wenn ihrer fehlt; eine Anordnung, die kein Haupt-Panel nennt, behält das aktuelle. ue_layout_changed wird einmal ausgelöst; die Panels, die sie wieder nach vorn bringt, lösen ue_panel_selected nicht aus. Liefert 0 nach der Anwendung, -5 bei einem Text, der keine Anordnung ist (kein JSON oder ohne tree): das Dock bleibt dann unverändert, -2 wenn die Komponente nicht erzeugt ist |
of_panel (string as_key) | n_pbt_dock_panel-Handle des Panels (beim ersten Zugriff erzeugt) |
of_refresh_panel (string as_key) | Frischt die Darstellung eines außerhalb des Bildschirms aufgebauten Panels auf, ohne Flackern. Liefert 0, -5 wenn der Schlüssel kein Panel bezeichnet, -2 wenn die Komponente nicht erzeugt ist |
of_relayout ( ) | Berechnet und veröffentlicht alle Bereiche neu, damit die gehosteten Steuerelemente neu positioniert werden. Liefert 0 nach der Anwendung, -2 wenn die Komponente nicht erzeugt ist |
of_reset ( ) | Leert den Container: Jedes gehostete Steuerelement geht an sein ursprüngliches Fenster zurück, die Panel-Handles werden freigegeben und die gespeicherte Anordnung wird gelöscht. 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 |
Events #
| Event | Ausgelöst wenn |
|---|---|
ue_panel_selected (string as_key) | Ein angedocktes Panel kommt in seiner Gruppe nach vorn: Klick auf seine Registerkarte, Pfeiltasten der Registerleiste, of_select_panel (ein Befehl Ihres Codes löst es ebenfalls aus) und jede andere Art, wie ein Stapel das gezeigte Panel wechselt — ein darauf gestapeltes Panel, das vorderste geschlossen, abgekoppelt, verschoben oder entfernt, ein wieder angedocktes oder wieder eingeblendetes Panel. Nach ue_panel_closed, ue_panel_floated oder ue_panel_docked, wenn eines davon es bewirkt hat. Eine wiederhergestellte Anordnung kündigt es nicht an; n_pbt_dock_panel.ib_front liest den Zustand zurück |
ue_panel_closed (string as_key) | Ein Panel wird geschlossen: das Kreuz seiner Kopfzeile, Schließen oder Andere schließen im Kontextmenü der Kopfzeile oder der Registerkarte, das Kreuz eines ausgefahrenen Panels oder of_close_panel (ein Befehl Ihres Codes löst es ebenfalls aus). Das Panel wird ausgeblendet (ib_visible = true zeigt es wieder an); mit ib_veto_close = true erst, nachdem ue_panel_closing es erlaubt hat |
ue_panel_closing (string as_key) → boolean | Abbrechbar, gestellt, bevor sich ein Panel schließt — das Kreuz seiner Kopfzeile, Schließen oder Andere schließen im Menü (eine Frage pro Panel), das Kreuz eines ausgefahrenen Panels oder of_close_panel —, und nur wenn ib_veto_close = true (standardmäßig aus). Geben Sie false zurück, um das Panel offen zu halten (nicht gespeicherte Arbeit): ue_panel_closed folgt nicht, und of_close_panel liefert -4 |
ue_panel_pinned (string as_key, boolean ab_pinned) | Ein Panel wird fixiert (true) oder für das automatische Ausblenden gelöst (false): Pin-Schaltfläche der Kopfzeile, Andock-Schaltfläche des Ausklapp-Panels, oder ib_pinned aus Ihrem Code (ein Befehl löst es ebenfalls aus), oder ein Panel, das in eine eingeklappte Gruppe oder aus ihr heraus verschoben wird |
ue_panel_floated (string as_key) | Ein Panel wird in ein schwebendes Fenster abgelöst: Schaltfläche der Kopfzeile, Doppelklick auf die Kopfzeile oder die Registerkarte, Abkoppeln im Kontextmenü, oder of_float_panel (ein Befehl Ihres Codes löst es ebenfalls aus). Eine wiederhergestellte Anordnung (of_set_layout) öffnet ihre Fenster wieder und meldet stattdessen einmal ue_layout_changed |
ue_panel_docked (string as_key) | Der BENUTZER dockt ein schwebendes Panel wieder an: er schließt sein Fenster oder doppelklickt auf dessen Titelleiste — das Panel kehrt an seinen Platz zurück |
ue_active_panel_changed (string as_key) | Das aktive Panel wechselt: ein Steuerelement eines anderen Panels erhält den Fokus (ein Klick, die Tab-Taste, ein SetFocus Ihres Codes), oder die Registerkarte oder Kopfzeile eines Panels wird angeklickt. as_key ist leer, wenn die Tastatur in ein anderes Steuerelement desselben Fensters außerhalb des Docks wechselt; ein Meldungsfenster, ein Menü oder ein anderes Fenster ändern nichts. of_active_panel liest es zurück |
ue_layout_changed (string as_json) | Die Anordnung hat sich geändert (Ziehen, Größenänderung, Andocken, ein schwebendes Fenster verschoben oder in der Größe geändert, aber auch ein geschlossenes, ausgeblendetes, ausgewähltes oder umbenanntes Panel oder ein anderes Haupt-Panel). Der Parameter trägt die neue Anordnung, bereit zum Speichern. Gebündelt: eine von of_set_redraw(false) … of_set_redraw(true) eingerahmte Folge (der Aufbau des Docks) löst es einmal aus, bei der Wiederaufnahme, wie of_set_layout; ebenso Änderungen im Abstand von weniger als 40 ms |
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) |
Mit der Maus #
Über das Ziehen von Registerkarten und Splittern hinaus wirken drei Gesten auf ein Panel — nie auf das Haupt-Panel:
| Geste | Wirkung |
|---|---|
| Doppelklick auf die Kopfzeile einer Gruppe oder auf eine Registerkarte | Löst das Panel (bei der Kopfzeile: das aktive Panel der Gruppe) in ein schwebendes Fenster ab — ue_panel_floated |
| Doppelklick auf die Titelleiste eines schwebenden Fensters | Dockt das Panel wieder an seinem Platz an, wie das Schließkreuz des Fensters — ue_panel_docked |
| Rechtsklick auf die Kopfzeile, auf eine Registerkarte oder auf eine Lasche der Leiste | Menü Abkoppeln / Automatisch ausblenden / Schließen / Andere schließen (die anderen schließbaren Panels derselben Gruppe). Automatisch ausblenden ist angehakt, solange die Gruppe eingeklappt ist: die Wahl klappt die Gruppe ein oder fixiert sie wieder — ue_panel_pinned. Ein Eintrag, der nichts bewirken kann, ist ausgegraut; mit ib_veto_close = true stellt jedes Schließen ue_panel_closing — eine Frage pro Panel |
Über die Tastatur #
Der Inhalt eines Panels ist ein echtes PowerBuilder-Steuerelement: die Tastatur gehört dort Ihrem Code, wie in jedem Fenster. Was die Komponente übernimmt, ist ihr eigener Rahmen — Kopfzeilen, Registerkarten, Splitter:
| Taste | Wirkung |
|---|---|
| Pfeile auf einer Registerkarte | Wechseln zum vorherigen / nächsten Panel der Gruppe und wählen es aus. Eine Registerkartenleiste ist ein einziger Tabulatorstopp |
| Pos1 / Ende auf einer Registerkarte | Erstes / letztes Panel der Gruppe |
| Pfeile auf einem Splitter | Verschieben die Trennung um 2 %, nur entlang der Achse des Splitters |
| Bild auf / Bild ab auf einem Splitter | Dasselbe, in Schritten von 10 % |
| Umschalt+F10 oder die Menütaste auf einer Registerkarte, einer Kopfzeilen-Schaltfläche oder einer Lasche der Leiste | Öffnet das Panel-Menü unter dem Element (per Rechtsklick öffnet es sich am Mauszeiger) |
| Esc | Bricht ein laufendes Ziehen ab, sonst schließt es das über eine Randschaltfläche geöffnete ausgefahrene Panel; ohne beides geht die Taste an das Fenster (seine Abbrechen-Schaltfläche) |
Ein Splitter ist ein fokussierbarer separator, der seine Position ansagt; die Schaltflächen der Kopfzeile (abdocken, ausblenden, schließen) tragen einen Namen, und das aktive Panel einer Gruppe ist mit aria-selected markiert. Eine Verschiebung über die Tastatur wird genau wie ein Ziehen mit der Maus über ue_layout_changed gemeldet.
Beispiele #
Ein Fenster im IDE-Stil #
// open-Event : jeder Inhalt ist ein echtes PB-Steuerelement auf dem Fenster
uo_dock.of_add_panel(/*key*/ "document", /*position*/ "", /*relative_to*/ "", /*size*/ 0, /*title*/ "Dokument", /*content*/ uo_editor)
uo_dock.of_add_panel(/*key*/ "explorer", /*position*/ uo_dock.POSITION_START, /*relative_to*/ "document", /*size*/ 260, /*title*/ "Explorer", /*content*/ uo_tree)
uo_dock.of_add_panel(/*key*/ "properties", /*position*/ uo_dock.POSITION_END, /*relative_to*/ "document", /*size*/ 300, /*title*/ "Eigenschaften", /*content*/ uo_props)
uo_dock.of_add_panel(/*key*/ "output", /*position*/ uo_dock.POSITION_BOTTOM, /*relative_to*/ "document", /*size*/ 200, /*title*/ "Ausgabe", /*content*/ uo_console)
// Ein zweites Panel als Registerkarte auf "properties" gestapelt
uo_dock.of_add_panel(/*key*/ "help", /*position*/ uo_dock.POSITION_STACK, /*relative_to*/ "properties", /*size*/ 0, /*title*/ "Hilfe", /*content*/ uo_help)
// Das Dokument ist der zentrale Bereich
uo_dock.is_main = "document"
Die Anordnung des Benutzers merken und wiederherstellen #
// close-Event des Fensters : speichern, was der Benutzer angeordnet hat
// Local variables
string ls_layout
// Die aktuelle Anordnung, bereit zum Ablegen
ls_layout = uo_dock.of_get_layout()
of_save_setting(/*name*/ "main_dock", /*value*/ ls_layout)
// open-Event : die gespeicherte Anordnung LESEN, DANN die Panels erstellen
// Local variables
string ls_layout
// Zuerst die Einstellung : der Aufbau des Docks loest ue_layout_changed aus, das sie ueberschreiben koennte
ls_layout = of_read_setting(/*name*/ "main_dock")
// Dann die Panels und die Anordnung, in EINER Folge : ein einziges ue_layout_changed, bei der Wiederaufnahme
uo_dock.of_set_redraw(/*on*/ false)
of_create_panels()
// Und die Anordnung des letzten Schliessens, falls vorhanden
if ls_layout <> "" then uo_dock.of_set_layout(/*json*/ ls_layout)
// Ende der Folge
uo_dock.of_set_redraw(/*on*/ true)
Die Reihenfolge ist zwingend:
of_set_layouterzeugt kein Panel, es ordnet nur die bereits vorhandenen neu an. Und die Einstellung wird vor dem Aufbau gelesen: jedesof_add_paneländert die Anordnung, und einue_layout_changed, das sie speichert, würde eine halb aufgebaute Anordnung über die schreiben, die Sie wiederherstellen wollten.
Änderungen fortlaufend verfolgen #
// ue_layout_changed-Event von uo_dock : (string as_json)
// Einmal pro Folge von Aenderungen ausgeloest (Aufbau, wiederhergestellte Anordnung) : unveraendert gespeichert.
of_save_setting(/*name*/ "main_dock", /*value*/ as_json)
Ein Panel über sein Handle steuern #
// Local variables
n_pbt_dock_panel lnv_panel
// Der Eigenschaftenbereich : ein Titel, der die Aenderungen zaehlt, an seinem Rand eingeklappt
lnv_panel = uo_dock.of_panel(/*key*/ "properties")
lnv_panel.is_title = "Eigenschaften (3 geändert)"
lnv_panel.ib_pinned = false // klappt zu einer Lasche am Rand zusammen
// Ein Panel ausblenden, das Administratoren vorbehalten ist
uo_dock.of_panel(/*key*/ "audit").ib_visible = gb_administrator
Aufmerksamkeit auf ein Panel im Hintergrund lenken #
// Ein Hintergrundvorgang hat in die Konsole geschrieben : melden, ohne den Fokus zu stehlen
uo_dock.of_notify_panel(/*key*/ "output")
Aus dem Code neu anordnen #
// Ein Panel verschieben, als haette der Benutzer seine Registerkarte gezogen
uo_dock.of_move_panel(/*key*/ "output", /*target*/ "document", /*position*/ "bottom")
// Es als Registerkarte auf ein anderes Panel stapeln
uo_dock.of_move_panel(/*key*/ "help", /*target*/ "properties", /*position*/ "stack")
Ein Panel auf einen zweiten Bildschirm ablösen #
// Natives schwebendes Fenster : der Benutzer kann es auf einen anderen Bildschirm legen
uo_dock.of_float_panel(/*key*/ "properties")
// ue_panel_docked-Event von uo_dock : (string as_key)
// Der Benutzer hat das schwebende Fenster geschlossen : das Panel ist zurueck.
of_log(/*msg*/ "Panel wieder angedockt : " + as_key)
Ein Panel schließen und wieder öffnen #
// ue_panel_closed-Event von uo_dock : (string as_key)
// Das Panel ist nur ausgeblendet : sein Steuerelement bleibt im Dock, nichts taucht auf dem Fenster auf.
st_status.Text = "Panel geschlossen: " + as_key
// Menue Ansicht, Eigenschaften : das Panel wieder oeffnen, vorn in seinem Stapel
uo_dock.of_panel(/*key*/ "properties").ib_visible = true
Ein Panel schließen heißt es ausblenden: sein Steuerelement bleibt gehostet, und
ib_visible = trueöffnet es wieder vorn in seinem Stapel.of_remove_panelgibt das Steuerelement an das Fenster zurück, an seinen Platz und sichtbar, wenn es das war: reservieren Sie es für ein Steuerelement, das Sie danach zerstören.
Das Schließen eines Panels mit nicht gespeicherter Arbeit ablehnen #
// open-Event des Fensters : nachfragen, bevor sich ein Panel schliesst (standardmaessig aus)
uo_dock.ib_veto_close = true
// ue_panel_closing event of uo_dock : (string as_key) returns boolean
// Der Editor enthaelt noch ungespeicherte Aenderungen : sein Panel bleibt offen.
if as_key = "editor" then
if ib_editor_modified then return false
end if
return true
// Ihr Code stellt dieselbe Frage : -4, wenn sie abgelehnt wird
if uo_dock.of_close_panel(/*key*/ "editor") = -4 then
st_status.Text = "Speichern Sie das Dokument, bevor Sie den Editor schliessen."
end if
Best Practices #
- Legen Sie immer ein Haupt-Panel mit
is_mainfest: Ohne zentralen Bereich können die Benutzer alles ausblenden und stehen vor einem leeren Fenster. - Lesen Sie die gespeicherte Anordnung vor dem Erstellen der Panels und speichern Sie sie dann bei
ue_layout_changedstatt nur beim Schließen: So geht bei einem unsauberen Beenden nichts verloren, und der Aufbau des Docks überschreibt nicht mehr, was Sie wiederherstellen wollten. of_set_layoutkommt nach denof_add_panel-Aufrufen, niemals davor.- Verwenden Sie
of_notify_panelfür Hintergrundvorgänge: Das ist weniger aufdringlich als ein Dialogfeld, und die Information bleibt sichtbar. - Ein gehostetes Steuerelement ist ein natives Fenster: Es zeichnet sich über der Web-Ebene, kein visueller Effekt der Komponente kann darüber liegen.
- Ein Steuerelement wird nur von einem Container gehostet: es einem zweiten Dock (oder einem tab) zu geben, nimmt es dem ersten weg. Ein Steuerelement, das das Dock selbst enthält, wird abgelehnt (
-5). - Ein Panel schließen heißt es ausblenden (
ib_visible = trueöffnet es wieder);of_remove_panelgibt das Steuerelement an das Fenster zurück, sichtbar, wenn es das war. - Rufen Sie
of_reset()vor jedem Neuaufbau auf: Ohne diesen Aufruf bleiben die zuvor gehosteten Steuerelemente in den geleerten Container umgehängt, und die Wiederverwendung eines Schlüssels schlägt fehl. - Für einfache, sich gegenseitig ausschließende Seiten, ohne Andocken und ohne Schweben, ist tab leichtgewichtiger.
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.