stepbar — u_pbt_stepbar #
← Komponentenreferenz · Inhalt des Handbuchs
Schrittleiste eines Assistenten: die bereits durchlaufenen Schritte, der aktuelle und die noch bevorstehenden, waagerecht oder senkrecht.
▶ Live ansehen — Demoanwendung, Kachel Stepbar: die Vorschau, der zugehörige Code und diese Seite, nebeneinander.
Auf einen Blick #
| Userobject | u_pbt_stepbar |
| Item-Klasse | n_pbt_stepbar_step (ein Schritt) |
| Wofür | Dem Benutzer zeigen, wo er in einem Assistenten, einem mehrseitigen Formular oder einem Genehmigungsprozess steht |
| Prinzip | Sie deklarieren die Schritte und verschieben dann ii_current: Die Zustände ergeben sich von selbst |
Schnellstart #
// open-Event des Fensters
uo_steps.of_add_step(/*key*/ "account", /*label*/ "Konto")
uo_steps.of_add_step(/*key*/ "profile", /*label*/ "Profil")
uo_steps.of_add_step(/*key*/ "payment", /*label*/ "Zahlung")
uo_steps.of_add_step(/*key*/ "done", /*label*/ "Bestätigung")
// Aktueller Schritt (1 = der erste)
uo_steps.ii_current = 1
// Schaltflaeche Weiter des Assistenten : der naechste Schritt, ausgeblendete und deaktivierte werden uebersprungen
uo_steps.of_next()
// Schaltflaeche Zurueck
uo_steps.of_previous()
Das Modell: ein Schritt, drei automatische Zustände #
Ein Schritt hat keinen Zustand, den Sie von Hand verwalten müssten. Er ergibt sich aus seiner Position relativ zu ii_current:
| Position | Zustand | Darstellung |
|---|---|---|
| Vor dem aktuellen Schritt | done — abgeschlossen | Abgehaktes Abzeichen |
| Der aktuelle Schritt | current — in Bearbeitung | Hervorgehobenes Abzeichen |
| Nach dem aktuellen Schritt | todo — bevorstehend | Nummeriertes Abzeichen, dezenter Farbton |
Drei weitere Zustände werden nie automatisch erreicht: Sie erzwingen sie für einen Schritt — error, wenn er fehlgeschlagen ist, warning, wenn er durchlaufen ist, aber noch etwas zu prüfen bleibt, skipped, wenn er übersprungen wurde (siehe weiter unten).
Eigenschaften #
| Eigenschaft | Typ | Standard | Zweck |
|---|---|---|---|
ii_current | integer | 1 | Aktueller Schritt, ab 1 nummeriert (Anzahl der Schritte + 1 = alles erledigt). Das Setzen löst ue_step_changed aus, wenn sich die Leiste bewegt. Der aktuelle Schritt wird über seine Identität verfolgt: Einen Schritt davor hinzuzufügen, zu entfernen oder zu verschieben ändert den aktuellen Schritt nicht. Vor den Schritten gesetzt, bleibt der Wert erhalten und gilt, sobald der Schritt existiert. Ein ausgeblendeter aktueller Schritt lässt keinen Schritt „in Bearbeitung“ sichtbar. „Alles erledigt" ist am letzten Schritt dieses Moments verankert: Ein danach hinzugefügter Schritt wird zum aktuellen Schritt (und löst ue_step_changed aus); ein davor eingefügter ändert nichts |
is_position | string | "top" | Ausrichtung: top / bottom (waagerechte Leiste) oder start / end (senkrechte Leiste) — Konstanten POSITION_TOP, POSITION_BOTTOM, POSITION_START, POSITION_END. START/END sind logisch und folgen der Schreibrichtung |
is_navigation_mode | string | "free" | Was ein Klick erreichen darf: NAV_FREE (jeder Schritt, die Vorgabe), NAV_BACKWARD (nur die bereits durchlaufenen Schritte — zurückgehen, nie vorwärts springen), NAV_VISITED (jeder bereits erreichte Schritt außer dem aktuellen — nach einem Schritt zurück bleiben die weiter vorn erreichten Schritte einen Klick entfernt) oder NAV_NONE (nichts: eine reine Fortschrittsanzeige, allein von Ihrem Code gesteuert). Was anklickbar bleibt, löst ue_step_clicked aus; die Leiste selbst bewegt sich bei einem Klick nie |
is_overflow_mode | string | "auto" | Zu viele Schritte für die Breite: OVERFLOW_AUTO verdichtet die Leiste unterhalb einer lesbaren Untergrenze je Schritt (jeder Schritt wird zu einem Punkt, nur der aktuelle behält seine Beschriftung, und alle bleiben anklickbar), OVERFLOW_SCROLL behält die Beschriftungen und scrollt, wobei der aktuelle Schritt im Blick bleibt, OVERFLOW_SHRINK quetscht sie bis zur Auslassung. Eine senkrechte Leiste verdichtet nie |
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 eines Schritts — n_pbt_stepbar_step #
Erhältlich über of_step(id):
| Eigenschaft | Typ | Standard | Zweck |
|---|---|---|---|
is_state | string | STATE_TODO | Erzwingt den Zustand des Schritts: STATE_TODO, STATE_CURRENT, STATE_DONE, STATE_ERROR, STATE_WARNING (durchlaufen, aber mit etwas zu prüfen: bernsteinfarbene Markierung mit „!“, bernsteinfarbene Beschriftung), STATE_SKIPPED (übersprungen, weder erledigt noch offen: hohle Markierung mit gestricheltem Ring und „–“, Beschriftung kursiv). Bildschirmleser sagen sie als „mit Warnung“ und „übersprungen“ an; nach beiden gilt die Linie als zurückgelegt, wie nach einem erledigten Schritt. STATE_AUTO = zurück zur automatischen Berechnung; beim Zurücklesen kommt der tatsächliche Zustand des Schritts, nicht der erzwungene. Auf einen Schlüssel gesetzt, der keinen Schritt bezeichnet, wird er ignoriert |
is_text | string | — | Ändert die Bezeichnung des Schritts, Rich-Text-Auszeichnung zulässig |
is_description | string | "" | Zweite Zeile des Schritts — „Optional", ein Datum, ein Betrag. Rich-Text-Auszeichnung zulässig. Wird einem Screenreader als Beschreibung des Schritts angesagt, nach dessen Namen. Eine leere Zeichenfolge entfernt sie; eine verdichtete Leiste lässt sie weg, um einzeilig zu bleiben |
is_image | string | "" | Anstelle der Schrittnummer angezeigtes Symbol (zulässige Formen) |
ib_enabled | boolean | true | Schritt aktiv; ein deaktivierter Schritt reagiert nicht mehr auf Klicks |
ib_visible | boolean | true | Blendet den Schritt aus, ohne ihn aus dem Modell zu entfernen |
Methoden #
| Methode | Zweck | |
|---|---|---|
of_add_step (string as_key, string as_label) | Fügt einen Schritt am Ende der Leiste hinzu. Liefert 0 nach der Anwendung, -5 bei einem leeren Schlüssel, einem Schlüssel mit / oder ` | oder einem bereits vorhandenen Schlüssel, -2` wenn die Komponente nicht erzeugt ist |
of_add_step (string as_key, string as_label, string as_icon_file) | Dasselbe, mit dem Symbol anstelle der Schrittnummer. Liefert 0 nach der Anwendung, -5 bei einem leeren Schlüssel, einem Schlüssel mit / oder ` | oder einem bereits vorhandenen Schlüssel, -2` wenn die Komponente nicht erzeugt ist |
of_add_step (string as_key, string as_label, string as_icon_file, string as_desc) | Dasselbe, mit Symbol und zweiter Zeile. Liefert 0 nach der Anwendung, -5 bei einem leeren Schlüssel, einem Schlüssel mit / oder ` | oder einem bereits vorhandenen Schlüssel, -2` wenn die Komponente nicht erzeugt ist |
of_insert_step (string as_key, string as_label, integer ai_index) | Fügt einen Schritt an der angegebenen Position ein (ab 1 gezählt; 0 oder weniger = an erster Stelle, über das Ende hinaus = am Ende). Liefert 0 nach der Anwendung, -5 bei einem leeren Schlüssel, einem Schlüssel mit / oder ` | oder einem bereits vorhandenen Schlüssel, -2` wenn die Komponente nicht erzeugt ist |
of_insert_step (string as_key, string as_label, string as_icon_file, integer ai_index) | Dasselbe, mit dem Symbol. Liefert 0 nach der Anwendung, -5 bei einem leeren Schlüssel, einem Schlüssel mit / oder ` | oder einem bereits vorhandenen Schlüssel, -2` wenn die Komponente nicht erzeugt ist |
of_insert_step (string as_key, string as_label, string as_icon_file, string as_desc, integer ai_index) | Dasselbe, mit Symbol und zweiter Zeile. Liefert 0 nach der Anwendung, -5 bei einem leeren Schlüssel, einem Schlüssel mit / oder ` | oder einem bereits vorhandenen Schlüssel, -2` wenn die Komponente nicht erzeugt ist |
of_move_step (string as_key, integer ai_index) | Verschiebt einen vorhandenen Schritt; der aktuelle Schritt bleibt aktuell. Liefert 0 nach der Anwendung, -5 bei einem leeren Schlüssel oder einem Schlüssel, der keinen Schritt bezeichnet, -2 wenn die Komponente nicht erzeugt ist | |
of_next ( ) | Wechselt zum nächsten Schritt und überspringt die ausgeblendeten und deaktivierten — genau jene, auf denen ii_current + 1 landen würde. Hält beim letzten erreichbaren an. Der Navigationsmodus wird nicht herangezogen: er beschränkt den Benutzer, nicht Ihren Code. Es wird nicht gefragt, aber ue_step_changed wird ausgelöst. Liefert 0 nach der Anwendung, -2 wenn die Komponente nicht erzeugt ist | |
of_previous ( ) | Wechselt zum vorherigen Schritt, dieselben Regeln. Aus der Position „alles erledigt“ kehrt er zum letzten Schritt zurück. Liefert 0 nach der Anwendung, -2 wenn die Komponente nicht erzeugt ist | |
of_remove_step (string as_key) | Entfernt einen Schritt; die übrigen behalten ihren Zustand. Wird der aktuelle Schritt entfernt, geht die Leiste zum nächsten erreichbaren Schritt (oder zu „alles erledigt“) und löst ue_step_changed aus. Liefert 0 nach der Anwendung, -5 bei einem leeren Schlüssel oder einem Schlüssel, der keinen Schritt bezeichnet, -2 wenn die Komponente nicht erzeugt ist | |
of_clear_steps ( ) | Leert die Leiste. Die Leiste beginnt wieder beim ersten Schritt: die danach hinzugefügten Schritte bilden einen neuen Ablauf. Liefert 0 nach der Anwendung, -2 wenn die Komponente nicht erzeugt ist | |
of_step (string as_key) → n_pbt_stepbar_step | Handle auf einen Schritt, um seine Eigenschaften zu setzen | |
of_reset ( ) | Leert die Schritte und setzt alle Eigenschaften auf ihren Standard 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 |
Das dritte Argument ist das Symbol, wie überall sonst in der Bibliothek (
of_add_itemder Listbar,of_add_panelder Statusleiste,of_add_tileder Tilesbox). Die zweite Zeile folgt danach.
Events #
| Event | Ausgelöst wenn |
|---|---|
ue_step_clicked (integer ai_index, string as_key) | Der Benutzer hat einen Schritt angeklickt. Die Leiste bewegt sich nicht: Skripten Sie dieses Ereignis, führen Sie Ihre Prüfungen durch und setzen Sie dann ii_current, wenn Sie einverstanden sind |
ue_step_changed (integer ai_from_index, string as_from_key, integer ai_index, string as_key) | Die Leiste hat sich bewegt: ii_current wurde auf einen anderen Schritt gesetzt, of_next / of_previous aufgerufen, der aktuelle Schritt entfernt oder ein Schritt nach „alles erledigt" hinzugefügt. Ein Klick landet hier nie |
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) |
Die Leiste navigiert NICHT von selbst. Ein Klick meldet (ue_step_clicked) und sonst nichts: Die Leiste bleibt, wo sie ist. Sie selbst verschieben sie, indem Sie ii_current setzen oder of_next / of_previous aufrufen — und diese Bewegungen melden sich über ue_step_changed.
Diese Aufteilung ist keine Einschränkung, sie ist der Sinn der Komponente: Eine Schrittleiste spiegelt einen Ablauf wider, den Ihre Anwendung steuert. Schritt 3 zu erreichen bedeutet in der Regel, dass ein Formular gültig war und ein Datensatz gespeichert wurde — das kann kein Klick für Sie entscheiden.
ue_step_clicked trägt den angezielten Schritt, ue_step_changed zusätzlich den verlassenen — mit fachlichem Bezeichner ebenso wie mit Rang. Mit diesem Paar protokollieren oder speichern Sie den verlassenen Schritt; die Regel „zurück ja, vorwärts springen nein" schreibt sich mit NAV_BACKWARD.
is_navigation_modebleibt der Filter für den Klick:NAV_NONElöst überhaupt nichts mehr aus,NAV_BACKWARDlässt nur die bereits abgeschlossenen Schritte anklicken.NAV_VISITEDgeht weiter: Jeder bereits erreichte Schritt bleibt anklickbar, auch vor dem aktuellen — wer zu Schritt 2 zurückgegangen ist, um etwas zu korrigieren, kehrt mit einem Klick zu dem bereits erreichten Schritt 4 zurück, wasNAV_BACKWARDnie erlaubt. Eine neue Schrittliste vergisst, was erreicht wurde, und ein eingefügter Schritt wurde nie erreicht.
Über die Tastatur #
Die Leiste ist ein einziger Tabulatorstopp: einmal erreicht, lässt sie sich vollständig über die Tastatur durchlaufen.
| Taste | Wirkung |
|---|---|
| Pfeile | Verschieben den Fokus von einem Schritt zum nächsten, umlaufend; ausgeblendete, deaktivierte oder unerreichbare Schritte (siehe is_navigation_mode) werden übersprungen |
| Pos1 / Ende | Erster / letzter erreichbarer Schritt |
| Eingabe oder Leertaste | Meldet einen Klick auf den fokussierten Schritt (ue_step_clicked) — die Leiste bewegt sich dadurch nicht |
Die Pfeile wählen nicht aus, anders als die Registerkarten eines dockcontainer: sie verschieben den Fokus. Eingabe oder Leertaste auf einem Schritt meldet den Klick (ue_step_clicked), wie die Maus; Ihre Anwendung verschiebt die Leiste. Eine Leiste mit acht Schritten per Tastatur zu durchlaufen darf keine acht Klicks senden.
Jeder Schritt ist eine echte Schaltfläche: sie trägt ihre Beschriftung und ihren Zustand in ihrem gesprochenen Namen („Konto - abgeschlossen"), der aktuelle Schritt ist mit aria-current="step" markiert, und ein deaktivierter Schritt ist eine deaktivierte Schaltfläche — nicht bloß ausgegrauter Text. Der nummerierte Punkt wird nicht vorgelesen: ein Rang lehrt nichts.
Beispiele #
Im Assistenten weitergehen #
// Die vier Schritte des Assistenten, der Reihe nach
uo_steps.of_add_step(/*key*/ "account", /*label*/ "Konto")
uo_steps.of_add_step(/*key*/ "profile", /*label*/ "Profil")
uo_steps.of_add_step(/*key*/ "payment", /*label*/ "Zahlung")
uo_steps.of_add_step(/*key*/ "done", /*label*/ "Bestätigung")
// Die Schritte 1 und 2 wechseln automatisch auf "abgeschlossen" (Haken)
uo_steps.ii_current = 3
Einen Schritt als fehlerhaft kennzeichnen #
// Der Zustand eines Schritts wird ueber sein Handle erzwungen
uo_steps.of_step(/*key*/ "profile").is_state = n_pbt_stepbar_step.STATE_ERROR
// Sobald das Problem behoben ist, uebergibt man wieder an die automatische Berechnung
uo_steps.of_step(/*key*/ "profile").is_state = n_pbt_stepbar_step.STATE_AUTO
Übersprungener Schritt, zu prüfender Schritt, wieder vorwärts #
// Die vier Schritte der Bestellung
uo_steps.of_add_step(/*key*/ "cart", /*label*/ "Warenkorb")
uo_steps.of_add_step(/*key*/ "coupon", /*label*/ "Gutschein")
uo_steps.of_add_step(/*key*/ "delivery", /*label*/ "Lieferung")
uo_steps.of_add_step(/*key*/ "payment", /*label*/ "Zahlung")
// Der Kunde hat keinen Gutscheincode : der Schritt wird uebersprungen, weder erledigt noch offen
uo_steps.of_step(/*key*/ "coupon").is_state = n_pbt_stepbar_step.STATE_SKIPPED
// Adresse nicht geprueft : der Schritt ist durchlaufen, aber zu pruefen
uo_steps.of_step(/*key*/ "delivery").is_state = n_pbt_stepbar_step.STATE_WARNING
// Jeder bereits erreichte Schritt bleibt anklickbar, auch vor dem aktuellen
uo_steps.is_navigation_mode = u_pbt_stepbar.NAV_VISITED
// Der Assistent hat Schritt 4 erreicht und geht zum Warenkorb zurueck : Schritte 2 bis 4 bleiben einen Klick entfernt
uo_steps.ii_current = 4
uo_steps.ii_current = 1
Senkrechte Leiste #
// POSITION_START / POSITION_END : die Leiste wird senkrecht gezeichnet, ideal am Rand eines Formulars
uo_steps.is_position = uo_steps.POSITION_START
// Das DRITTE Argument ist das Symbol : es tritt an die Stelle der Schrittnummer
uo_steps.of_add_step(/*key*/ "account", /*label*/ "Konto", /*icon_file*/ "mono:img\packimages.dll:svg/samples/folder-open")
Erweiterte Bezeichnungen auf zwei Zeilen #
// Die Bezeichnung eines Schritts nimmt Rich-Text-Auszeichnung an
uo_steps.of_add_step(/*key*/ "account", /*label*/ "[b]Konto[/b][br][size=9](Anmeldung)")
uo_steps.of_add_step(/*key*/ "profile", /*label*/ "[b]Profil[/b][br][size=9](Ihre Angaben)")
uo_steps.of_add_step(/*key*/ "payment", /*label*/ "[b]Zahlung[/b][br][size=9](Karte)")
uo_steps.of_add_step(/*key*/ "done", /*label*/ "[accent][b]Fertig[/b][/accent]")
// Der Benutzer ist bei Schritt 2 : Schritt 1 erscheint als abgeschlossen
uo_steps.ii_current = 2
Navigation per Klick #
// event ue_step_clicked de uo_steps : (integer ai_index, string as_key)
// Die Leiste hat sich NICHT bewegt : hier wird entschieden.
if ai_index > uo_steps.ii_current then
MessageBox("Assistent", "Schliessen Sie den aktuellen Schritt zuerst ab.")
return
end if
uo_steps.ii_current = ai_index
Bedingter Schritt #
// Ein bereits bekannter Kunde hat keinen Schritt "Profil" auszufuellen
uo_steps.of_step(/*key*/ "profile").ib_visible = false
Best Practices #
- Geben Sie jedem Schritt einen stabilen fachlichen Bezeichner (
"payment"): Genau diesen erhalten Sie inue_step_clickedundue_step_changed, nicht eine Nummer, die sich bei der geringsten Einfügung verschiebt. - Lassen Sie die Komponente die Zustände berechnen; erzwingen Sie
is_statenur für den Fehlerfall. - Der Klick auf einen Schritt ist nur ein Signal: Sie entscheiden, ob Sie den Sprung erlauben oder nicht, insbesondere zu einem noch nicht erreichten Schritt.
- Klammern Sie die Deklaration der Schritte mit
of_set_redraw(false)/of_set_redraw(true)ein, wenn es viele sind. - Rufen Sie
of_reset()auf, bevor Sie dieselbe Leiste für einen anderen Assistenten wiederverwenden.
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 |
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.