PBToolboxAI v3 ← Site

listbar — u_pbt_listbar #

← Komponentenreferenz · Inhalt des Handbuchs

Seitliche Navigationsleiste: einklappbare Abschnitte im Akkordeon-Stil, die Einträge mit Symbol enthalten, mit einem Akzentband auf dem aktuellen Eintrag und dem Einklappen zu einer Symbolleiste.

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


Auf einen Blick #

Userobjectu_pbt_listbar
Item-Klassenn_pbt_listbar_section (Abschnitt) → n_pbt_listbar_item (Eintrag)
WofürEin aus Schaltflächen zusammengebasteltes Seitenmenü durch eine strukturierte, gestaltete und einklappbare Navigation ersetzen
Opt-in-Optionenib_auto_width, ib_reorderable

Dies ist die einzige Komponente der Bibliothek, die ib_auto_width veröffentlicht: Ihre natürliche Breite hat tatsächlich eine Bedeutung, da die eingeklappte Leiste deutlich schmaler ist als die ausgeklappte Leiste. Der übliche Fall ist im Übrigen bereits abgedeckt, ohne dass etwas zu aktivieren wäre — ib_collapsed = true verkleinert die Leiste auf die Symbolleiste und gibt ihr die Breite beim Ausklappen zurück.


Schnellstart #

// open-Event des Fensters

uo_nav.of_add_section(/*key*/ "nav", /*titel*/ "Navigation")
uo_nav.of_add_item(/*keys*/ "nav/accueil",   /*beschriftung*/ "Startseite",   /*symbol*/ "mono:img\home.svg")
uo_nav.of_add_item(/*keys*/ "nav/documents", /*beschriftung*/ "Dokumente", /*symbol*/ "mono:img\doc.svg")
uo_nav.of_add_item(/*keys*/ "nav/recherche", /*beschriftung*/ "Suche", /*symbol*/ "mono:img\find.svg")

uo_nav.of_add_section(/*key*/ "config", /*titel*/ "Einstellungen")
uo_nav.of_add_item(/*keys*/ "config/preferences", /*beschriftung*/ "Voreinstellungen", /*symbol*/ "mono:img\gear.svg")

// Die Auswahl wird auf dem EINTRAG gesetzt, ueber seinen vollstaendigen Pfad
uo_nav.of_select_item("nav", "accueil")
// Event ue_selection_changed von uo_nav : (string as_from_keys, string as_keys)
choose case as_keys
    case "nav/accueil"       ; of_ouvrir_accueil()
    case "nav/documents"     ; of_ouvrir_documents()
    case "config/preferences"; of_ouvrir_preferences()
end choose

Zwei Ebenen, ein zwingender Pfad #

Ein Eintragsbezeichner ist nur innerhalb seines Abschnitts eindeutig: Es gibt daher keine Abkürzung zum Eintrag. Jeder Zugriff führt über den Abschnitt, was die Schreibweise eindeutig macht — siehe Hierarchien.

// Komponente  ->  Abschnitt      ->  Eintrag     ->  Eigenschaft
uo_nav        .of_section("nav") .of_item("docs") .is_text = "Documents"

Auch die Events tragen den vollständigen Pfad, und den verlassenen Eintrag dazu: ue_selection_changed(as_from_keys, as_keys).


Eigenschaften #

EigenschaftTypStandardZweck
ib_collapsedbooleanfalsetrue klappt die Leiste zu einer Symbolleiste ein: Die Beschriftungen verschwinden, die Symbole bleiben anklickbar
ib_auto_widthbooleanfalseOpt-in: dasselbe für die Breite, auch im ausgeklappten Zustand (die Leiste richtet sich nach der längsten Beschriftung). Das Einklappen zur Symbolleiste schrumpft dagegen bereits von selbst; ue_auto_width folgt in beiden Fällen
ib_reorderablebooleanfalseOpt-in: Der Benutzer kann einen Eintrag mit der Maus verschieben. Die Bewegung bleibt innerhalb seines Abschnitts — eine Eintrags-Kennung ist nur dort eindeutig, ein Wechsel brächte also das Risiko zweier gleicher Schlüssel (löst ue_item_reordered aus)
ib_veto_selectionbooleantrueNachfragen, bevor die Auswahl umspringt (löst ue_selection_changing aus, das ablehnen kann). Standardmäßig aktiv: Wird nichts geskriptet, ist der Wechsel immer erlaubt. Auf false setzen, um den Hin- und Rückweg zu PowerBuilder (~35 ms) dort zu sparen, wo er auffiele — Tastaturnavigation, in einer Schleife verschobene Auswahl
is_theme_stylestringfluentVisueller Stil der Komponente (Konstanten THEME_STYLE_*)
is_theme_modestringlightHelle oder dunkle Variante (Konstanten THEME_MODE_*)
il_theme_accentlong-1Akzentfarbe dieser Komponente (-1 = Akzent des Designs)
is_tooltipstring""Einfacher Tooltip beim Überfahren der Komponente
is_super_tooltip_titlestring""Titel des erweiterten Tooltips (hat Vorrang vor is_tooltip)
is_super_tooltip_textstring""Text des erweiterten Tooltips (Rich-Markup zulässig)
is_super_tooltip_imagestring""Bild des erweiterten Tooltips

Eigenschaften eines Abschnitts — n_pbt_listbar_section #

EigenschaftTypStandardZweck
is_titlestring""Titel des Abschnitts. Akzeptiert die Rich-Text-Auszeichnung. Ein leerer Titel zeigt gar keine Kopfzeile an: Der Abschnitt wird zu einer einfachen, unsichtbaren Gruppierung
ib_collapsedbooleanfalseAkkordeon: true klappt die Einträge dieses Abschnitts ein. Die Kopfzeile bleibt sichtbar, ihr Chevron dreht sich

Eigenschaften eines Eintrags — n_pbt_listbar_item #

EigenschaftTypStandardZweck
is_textstring""Beschriftung des Eintrags, im laufenden Betrieb änderbar, ohne die Leiste neu aufzubauen. Akzeptiert die Rich-Text-Auszeichnung
is_imagestring""Symbol, im laufenden Betrieb änderbar (akzeptierte Formen: Pfad, mono:, tint:, DLL-Ressource)
ib_enabledbooleantruefalse graut den Eintrag aus und blockiert seinen Klick
ib_visiblebooleantruefalse blendet den Eintrag aus, ohne ihn aus der Leiste zu entfernen
of_is_selected ( ) → boolean——Ist dieser Eintrag der ausgewählte? Nur lesend, und mit Absicht: die Auswahl ist ein Zustand der ganzen Leiste, kein Merker je Eintrag. Zum Setzen of_select auf der Komponente — das immer das Ereignis auslöst
is_tooltipstring""Einfacher Tooltip beim Überfahren des Items
is_super_tooltip_titlestring""Titel des erweiterten Item-Tooltips (hat Vorrang vor is_tooltip)
is_super_tooltip_textstring""Text des erweiterten Item-Tooltips (Rich-Markup zulässig)
is_super_tooltip_imagestring""Bild des erweiterten Item-Tooltips

Methoden #

Auf der Komponente #

MethodeZweck
of_add_section (string as_key, string as_text)Fügt einen Abschnitt hinzu. Liefert 0 (-5 bei einem ungültigen Argument, -2 wenn die Komponente nicht erzeugt ist), wie jede Strukturgeste: das Handle kommt von of_section("nav"), wenn Sie eine Eigenschaft setzen wollen
of_insert_section (string as_key, string as_text, integer ai_index)Fügt einen Abschnitt an der gewünschten Position ein (erste Position = 1) statt am Ende. Der Index zählt Abschnitte, nicht Zeilen. Ein bereits vergebener Name bleibt unangetastet: zwei Abschnitte unter einem Namen machten jede Adresse ihrer Einträge mehrdeutig. Liefert 0 nach der Anwendung, -5 bei einem ungültigen Argument (leerer Schlüssel, falsche Adresse), -2 wenn die Komponente nicht erzeugt ist
of_move_section (string as_key, integer ai_index)Verschiebt einen Abschnitt auf Position ai_index, mitsamt seinen Einträgen. Nur die Kopfzeile zu verschieben ließe seine Einträge in den Abschnitt fallen, der dann über ihnen steht. 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_section (string as_key)Entfernt einen Abschnitt und alles darin. Ihn zu leeren und die Einträge zu behalten machte sie zu Waisen: sie trügen eine Abschnitts-Kennung, die nichts mehr benennt. Liefert 0 nach der Anwendung, -5 bei einem ungültigen Argument (leerer Schlüssel, falsche Adresse), -2 wenn die Komponente nicht erzeugt ist
of_section (string as_key)Handle eines vorhandenen Abschnitts (beim ersten Zugriff erzeugt)
of_add_item (string as_keys, string as_text, string as_image)Fügt einen Eintrag an seiner Adresse hinzu, "nav/accueil": der Abschnitt, in dem er landet, dann seine eigene Id. Liefert 0 (-5 bei einem ungültigen Argument, -2 wenn die Komponente nicht erzeugt ist) — -5, wenn das übergeordnete Element kein Abschnitt ist. Eine Überladung lässt das Symbol weg
of_item (string as_keys)Handle eines Eintrags, über seine Adresse (beim ersten Zugriff erzeugt)
of_insert_item (string as_keys, string as_text, integer ai_index)Fügt einen Eintrag an der Position ai_index innerhalb seines Abschnitts ein. Liefert 0 nach der Anwendung, -5 bei einem ungültigen Argument (leerer Schlüssel, falsche Adresse), -2 wenn die Komponente nicht erzeugt ist
of_insert_item (string as_keys, string as_text, string as_image, integer ai_index)Ebenso, mit dem Symbol des Eintrags: of_add_item nimmt eines entgegen, also muss auch das Einfügen eines annehmen können. Liefert 0 nach der Anwendung, -5 bei einem ungültigen Argument (leerer Schlüssel, falsche Adresse), -2 wenn die Komponente nicht erzeugt ist
of_move_item (string as_keys, integer ai_index)Verschiebt einen vorhandenen Eintrag innerhalb seines Abschnitts und behält dabei seinen Zustand bei. 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_item (string as_keys)Entfernt einen Eintrag, bezeichnet durch sein Paar Abschnitt / Bezeichner. 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 ( )Leert die Leiste: alle Abschnitte und alle Einträge. Liefert 0 nach der Anwendung, -2 wenn die Komponente nicht erzeugt ist
of_select_item (string as_keys)Wählt einen Eintrag aus — exakt gleichbedeutend mit einem Klick des Benutzers: ue_selection_changing wird zuerst gefragt, dann meldet ue_selection_changed den Wechsel. Liefert 0 nach der Anwendung, -5 bei einem ungültigen Argument (leerer Schlüssel, falsche Adresse), -2 wenn die Komponente nicht erzeugt ist
of_get_layout ( )Liest die aktuelle Anordnung als JSON zurück: die Abschnitte in ihrer Reihenfolge, jeder mit seinen Einträgen in Reihenfolge und dem Zustand eingeklappt. 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. Das Anwenden löst kein Event aus — Sie haben sie geliefert. 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_selection ( )Lässt keinen Eintrag ausgewählt. Wird wie jeder andere Wechsel gemeldet. Liefert 0 nach der Anwendung, -2 wenn die Komponente nicht erzeugt ist
of_selected_key ( )Adresse des ausgewählten Eintrags — "nav/docs", "" wenn keiner ausgewählt ist. Genau das, was ue_selection_changed Ihnen übergibt: ein Vergleich bleibt ein Vergleich und wird kein Zusammensetzen. Immer der aktuelle: ein Klick und of_select_item laufen beide über das Event
of_reset ( )Leert die Leiste und bringt die Komponente anschließend 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

Auf einem Abschnitt — n_pbt_listbar_section #

MethodeZweck

Events #

EventAusgelöst wenn
ue_selection_changed (string as_from_keys, string as_keys)Die Auswahl ist umgesprungen — durch Klick oder über of_select_item. Dieselben Argumente wie ue_selection_changing: Frage und Ergebnis lesen sich gleich, und das Paar as_from_* bezeichnet den verlassenen Eintrag (leer, wenn es keinen gibt)
ue_section_toggled (string as_key, boolean ab_collapsed)Der Benutzer klappt einen Abschnitt über dessen Kopfzeile ein oder aus
ue_item_reordered (string as_keys, integer ai_index)Der Benutzer hat das Ziehen eines Eintrags beendet. ai_index ist sein neuer Rang innerhalb seines Abschnitts, ab 1, wie of_move_item. Bewahren Sie diese Reihenfolge auf, um dem Benutzer seine Leiste so zurückzugeben, wie er sie verlassen hat
ue_layout_changed (string as_layout_json)Die Anordnung hat sich geändert — der Benutzer hat etwas umsortiert, oder Ihr eigener Code. Trägt die gesamte Anordnung, nicht nur das Verschobene: Das Speichern ist eine einzige Zuweisung
ue_selection_changing (string as_from_keys, string as_keys) → booleanAbbrechbar, wird vor dem Umspringen der Auswahl gestellt. Standardmäßig ausgelöst; ib_veto_selection = false entfernt sie. Geben Sie false zurück, um den Benutzer dort zu halten, wo er ist
ue_auto_width (long al_width)Die Komponente hat ihre ideale Breite neu berechnet — erfordert ib_auto_width = true
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 #

Vollständiges Seitenmenü #


uo_nav.of_set_redraw(false)

uo_nav.of_add_section("dossiers", "Ordner")
uo_nav.of_add_item("dossiers/recents",  "Zuletzt verwendet",  "mono:img\clock.svg")
uo_nav.of_add_item("dossiers/clients",  "Kunden",  "mono:img\user.svg")
uo_nav.of_add_item("dossiers/archives", "Archiv", "mono:img\box.svg")

uo_nav.of_add_section("outils", "Werkzeuge")
uo_nav.of_add_item("outils/import", "Importieren", "mono:img\import.svg")
uo_nav.of_add_item("outils/export", "Exportieren", "mono:img\export.svg")

uo_nav.of_set_redraw(true)
uo_nav.of_select_item("dossiers", "recents")

Einklappbare Leiste, die Platz freigibt #

// Zur Symbolleiste einklappen : die Leiste schrumpft von selbst (und nimmt ihre
// Breite wieder an, wenn Sie sie ausklappen).
uo_nav.ib_collapsed = true
// Event ue_auto_width von uo_nav : (long al_width)
// Die Leiste hat gerade ihre ideale Breite angenommen : was rechts davon liegt, neu ausrichten.
uo_contenu.x     = uo_nav.x + al_width
uo_contenu.width = parent.width - uo_contenu.x

Akkordeon: einen Abschnitt einklappen #

// Den selten benutzten Archiv-Abschnitt einklappen
uo_nav.of_section("archives").ib_collapsed = true
// Event ue_section_toggled von uo_nav : (string as_keys, boolean ab_collapsed)
of_enregistrer_preference("section_" + as_keys, String(ab_collapsed))

Auf die Navigation reagieren #

// Event ue_selection_changed von uo_nav : (string as_from_keys, string as_keys)
// Die Adresse traegt beide Ebenen : zwei Abschnitte koennen beide einen Eintrag "liste" haben.
n_pbt_utils lnv_utils   // autoinstantiate : nichts zu erzeugen, nichts zu zerstoeren
string ls_ids[]

if lnv_utils.of_split_path(as_keys, ls_ids) < 2 then return
choose case ls_ids[1]
    case "dossiers" ; of_ouvrir_dossier(ls_ids[2])
    case "outils"   ; of_lancer_outil(ls_ids[2])
end choose

Einen Auswahlwechsel ablehnen #

// Die Frage wird STANDARDMAESSIG gestellt: nichts zu aktivieren. Diese Zeile tut
// das Gegenteil und entfernt sie, wo die Abwaegung nichts bringt und kostet.
uo_nav.ib_veto_selection = false
// Event ue_selection_changing von uo_nav :
//   (string as_from_keys, string as_keys)
// FALSE zurueckzugeben haelt den Benutzer auf dem Eintrag, den er verlaesst.
if of_saisie_en_cours(as_from_keys) then
    MessageBox("Eingabe", "Schließen Sie die laufende Akte ab, bevor Sie navigieren.")
    return false
end if
return true

Einen Eintrag im laufenden Betrieb aktualisieren #

n_pbt_listbar_item lnv_entree

// Der vollstaendige Pfad ist zwingend : Komponente -> Abschnitt -> Eintrag
lnv_entree = uo_nav.of_section("dossiers").of_item("recents")
lnv_entree.is_text  = "Zuletzt verwendet (12)"
lnv_entree.is_image = "mono:img\clock_full.svg"
// Je nach Berechtigungen ausgrauen oder ausblenden, ohne die Leiste neu aufzubauen
uo_nav.of_section("outils").of_item("import").ib_enabled = of_a_le_droit("import")
uo_nav.of_section("outils").of_item("export").ib_visible = gb_mode_expert

Auswahl aus dem Code gesteuert #

// Die Auswahl woanders setzen : das Akzentband folgt
uo_nav.of_select_item("dossiers", "clients")

// Oder sie vollstaendig loeschen
uo_nav.of_clear_selection()

Die Leiste neu aufbauen #

// of_clear leert Abschnitte und Eintraege ; of_reset stellt zusaetzlich die Standardwerte der Komponente wieder her
uo_nav.of_clear()
of_construire_menu_selon_profil()

Best Practices #

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