PBToolboxAI v4 ← Site

statusbar — u_pbt_statusbar #

← Komponentenreferenz · Inhalt des Handbuchs

Statusleiste aus Bereichen: Rich-Text, Symbole, feste oder automatische Breiten, Ausrichtung nach links oder rechts, anklickbare Bereiche, ein Mini-Fortschrittsbalken und farbige Zustände.

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


Auf einen Blick #

Userobjectu_pbt_statusbar
Item-Klassen_pbt_statusbar_panel (Bereich) · n_pbt_statusbar_menu_item (Listeneintrag)
WofürAm unteren Fensterrand den Zustand der Anwendung anzeigen: Kontext, Fortschritt, dezente Hinweise
Opt-in-Optionen—

Schnellstart #

// open-Event des Fensters
// of_add_panel(id, Text, Symbol, Ausrichtung, Breite)
// ueber den Schluessel findet man den Bereich wieder ; Breite 0 = an den Text angepasst
uo_status.of_add_panel(/*key*/ "state",  /*text*/ "Bereit",           /*icon_file*/ "", /*align*/ uo_status.ALIGN_START,  /*width*/ 0)
uo_status.of_add_panel(/*key*/ "pos",   /*text*/ "Zeile 12, Sp. 4", /*icon_file*/ "", /*align*/ uo_status.ALIGN_START,  /*width*/ 0)
uo_status.of_add_panel(/*key*/ "clock", /*text*/ "12:00",          /*icon_file*/ "", /*align*/ uo_status.ALIGN_END, /*width*/ 140)
// Einen Bereich jederzeit ueber seinen Bezeichner aktualisieren
uo_status.of_panel(/*key*/ "state").is_text = "Wird gespeichert..."

Das Modell: Bereiche mit Schlüssel #

Die Leiste ist eine Folge von Bereichen, die der Reihe nach hinzugefügt werden. Ein Bereich erhält bei der Erstellung einen Bezeichner: Über ihn finden Sie ihn später wieder, um seinen Text, sein Symbol oder seinen Zustand zu ändern.

Der Bezeichner ist ein Adressierungsschlüssel, kein Schalter für Interaktivität:

// Der Bereich zeigt einen neuen Text
uo_status.of_panel(/*key*/ "state").is_text = "3 Datensaetze geaendert"

Siehe Gemeinsame Basis · Die Items.


Eigenschaften #

EigenschaftTypStandardZweck
ib_show_resize_gripbooleanfalseZeigt den Größenänderungsgriff in der Ecke am Ende der Leiste an; daran ziehen ändert die Fenstergröße (bei Leserichtung von rechts nach links von der Ecke unten links). Er wird nur gezeichnet, solange sich das Fenster so vergrößern lässt: maximiert oder ohne veränderbaren Rahmen verschwindet er, und die Eigenschaft bleibt gesetzt
is_theme_stylestring""Visueller Stil der Komponente (Konstanten THEME_STYLE_*); leer = der der Anwendung, bei jeder Änderung übernommen
is_theme_modestring""Helle oder dunkle Variante (Konstanten THEME_MODE_*); leer = die der Anwendung, bei jeder Änderung übernommen
il_theme_accentlong-1Akzentfarbe dieser Komponente (-1 = Akzent der Anwendung, sonst der des Designs)
is_tooltipstring""Einfacher Tooltip 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

Methoden #

MethodeZweck
of_add_panel (string as_key, string as_text, string as_icon_file, string as_align, integer ai_width)Fügt einen Bereich am Ende der Leiste hinzu. Liefert 0 nach der Anwendung, -5 wenn der Schlüssel schon vergeben ist oder / bzw. ` enthält (ein leerer Schlüssel legt einen dekorativen Bereich an), -2` wenn die Komponente nicht erzeugt ist
of_add_sep ( )Fügt an der aktuellen Position einen Gruppenumbruch ein. Bereiche trennen sich bereits durch eine feine Linie : dieser ist breiter, damit die Bereiche davor und danach als zwei Gruppen erscheinen. Zwischen zwei of_add_panel aufrufen ; er eröffnet die Gruppe des folgenden Bereichs (auf der Seite des vorigen, wenn er zuletzt kommt). Ein Trenner ist kein Bereich : er zählt weder für of_count / of_keys_at noch bei Positionen. Liefert 0 nach der Anwendung, -2 wenn die Komponente nicht erzeugt ist
of_insert_panel (string as_key, string as_text, string as_icon_file, string as_align, integer ai_width, integer ai_index)Fügt einen Bereich an einer bestimmten Position ein, in Bereichen ab 1 gezählt (0 oder weniger = zuerst, hinter dem letzten = am Ende). Dieselben Ablehnungen wie of_add_panel. Liefert 0 nach der Anwendung, -5 wenn der Schlüssel schon vergeben ist oder / bzw. ` enthält, -2` wenn die Komponente nicht erzeugt ist
of_move_panel (string as_key, integer ai_index)Verschiebt einen vorhandenen Bereich an eine andere Position, in Bereichen ab 1 gezählt. Liefert 0 nach der Anwendung, -5 bei einem leeren oder der Leiste nie übergebenen Schlüssel, -2 wenn die Komponente nicht erzeugt ist
of_remove_panel (string as_key)Entfernt einen einzelnen Bereich samt Aufklappliste ; die übrigen behalten ihren Zustand. Liefert 0 nach der Anwendung, -5 bei einem leeren oder der Leiste nie übergebenen Schlüssel, -2 wenn die Komponente nicht erzeugt ist
of_panel (string as_key) → n_pbt_statusbar_panelLiefert das Handle eines Bereichs (beim ersten Zugriff erzeugt). Ein leerer Schlüssel (dekorativer Bereich), eine Adresse oder eine Liste bezeichnen nichts: ihr Handle schreibt nirgendwohin und liest sich leer
of_flash_panel (string as_key, string as_text, long al_ms)Zeigt eine Meldung al_ms Millisekunden lang an und danach wieder den Text des Bereichs (al_ms ≤ 0 = 2 Sekunden). Die Meldung liegt ÜBER dem Text: is_text liest sich immer als Text des Bereichs, nie als Meldung. Liefert 0 nach der Anwendung, -5 bei einem leeren Schlüssel, einer Adresse oder einem Schlüssel, den die Leiste nie erhalten hat, -2 wenn die Komponente nicht erzeugt ist
of_add_menu_item (string as_keys, string as_label) · (as_keys, as_label, as_image)Fügt der Aufklappliste eines Bereichs einen Eintrag hinzu : as_keys hat zwei Ebenen, erst der Bereich, dann der Eintrag ("enc/utf8"). Ab dem ersten Eintrag wird der Bereich zur Auswahl : ein Klick öffnet die Liste, die Wahl kommt über ue_panel_menu_clicked mit derselben Adresse zurück. Eine leere Beschriftung übernimmt den Schlüssel. Liefert 0 nach der Anwendung, -5 bei einer Adresse ohne zwei Ebenen, einem der Leiste nie übergebenen Bereich oder einem schon vergebenen Eintrag, -2 wenn die Komponente nicht erzeugt ist
of_insert_menu_item (string as_keys, string as_label, integer ai_index) · (as_keys, as_label, as_image, ai_index)Fügt einen Eintrag an einer bestimmten Position ein (ab 1 gezählt). Liefert 0 nach der Anwendung, -5 bei einem ungültigen Argument (leerer Schlüssel, falsche Adresse), -2 wenn die Komponente nicht erzeugt ist
of_add_menu_separator (string as_key)Trennlinie in der Liste des Bereichs as_key. Ein Trenner hat keine Adresse: nur of_clear_menu entfernt ihn, und eine Liste nur aus Trennern ist keine Liste (weder Pfeil noch Klick). Liefert 0 nach der Anwendung, -5 bei einem leeren Schlüssel oder einem Bereich, den die Leiste nie erhalten hat, -2 wenn die Komponente nicht erzeugt ist
of_remove_menu_item (string as_keys)Entfernt einen einzelnen Eintrag; ist der letzte weg, kehrt das Panel zu dem Verhalten zurück, das ihm ib_clickable gibt. 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_menu_item (string as_keys, integer ai_index)Verschiebt einen Eintrag an eine andere Position seiner Liste. Liefert 0 nach der Anwendung, -5 bei einem ungültigen Argument (leerer Schlüssel, falsche Adresse), -2 wenn die Komponente nicht erzeugt ist
of_menu_item (string as_keys) → n_pbt_statusbar_menu_itemGibt das Handle eines Eintrags zurück (beim ersten Zugriff erzeugt), um ihn auszugrauen, abzuhaken oder umzubenennen. Eine Adresse ohne zwei Ebenen bezeichnet nichts : ihr Handle schreibt nirgendwohin und liest leer
of_clear_menu (string as_key)Entfernt die ganze Auswahlliste; das Panel kehrt zu dem Verhalten zurück, das ihm ib_clickable gibt. 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 Bereiche und alle Trenner. Liefert 0 nach der Anwendung, -2 wenn die Komponente nicht erzeugt ist
of_reset ( )Leert die Leiste und setzt alle Eigenschaften auf ihren Standard zurück. Liefert 0 nach der Anwendung, -2 wenn die Komponente nicht erzeugt ist

Die Argumente von of_add_panel #

ArgumentWerteWirkung
as_keysfrei oder ""Schlüssel des Panels, über den man es später wiederfindet. Leer = ein dekoratives Panel, weder adressierbar noch anklickbar
as_textTextInhalt des Bereichs. Die Rich-Text-Auszeichnung wird akzeptiert
as_icon_fileBildpfad, oder ""Symbol, das vor dem Text angezeigt wird (akzeptierte Formen)
as_alignALIGN_START (Standard) oder ALIGN_ENDSeite, zu der der Bereich geschoben wird. Logische Werte: START = Anfang der Leserichtung (links bei Schreibrichtung von links nach rechts). Die physischen Aliase "left" / "right" werden weiterhin akzeptiert
ai_widthPixel, oder 0Feste Breite. 0 = der Bereich passt sich seinem Inhalt an

Auf einem Bereich — n_pbt_statusbar_panel #

ElementTypStandardZweck
is_textstring""Text des Bereichs, Rich-Text-Auszeichnung wird akzeptiert
is_imagestring""Symbol des Bereichs, jederzeit änderbar
ib_enabledbooleantrueBereich ausgegraut und nicht anklickbar
ib_visiblebooleantrueBereich ausgeblendet, ohne aus der Leiste entfernt zu werden
ii_progressinteger—Mini-Fortschrittsbalken im Bereich, neben dem Text, von 0 bis 100 (über 100 ist der Balken voll und liest sich 100); ein negativer Wert blendet ihn aus. Liest sich -1, wenn der Bereich keinen Balken hat (und 0 für einen Balken bei 0 %)
is_statestring""Semantischer Zustand des Bereichs, der seinen Text färbt und seinen Anfangsrand markiert: siehe die Konstanten unten. Jeder andere Wert bedeutet keinen Zustand und liest sich leer; ein deaktivierter Bereich ist ausgegraut, Zustandsmarkierung inbegriffen
ib_indeterminatebooleanfalseBalken ohne Wert animiert, für einen Vorgang unbekannter Dauer. Unabhängig von ii_progress, das der genaue Prozentsatz bleibt
ib_clickablebooleanfalseReagiert das Panel auf den Klick. Opt-in: ein Panel bleibt reglos, solange man es nicht verlangt, und behält dabei seinen Schlüssel — es wird gesteuert und trägt einen Tooltip. Ein Panel mit Auswahlliste ist ohnehin anklickbar

Auf einem Listeneintrag — n_pbt_statusbar_menu_item #

Erhalten über of_menu_item(/*keys*/ "enc/utf8"): die Adresse hat zwei Ebenen, das Panel und dann den Eintrag. Die Liste ist ein natives Menü: eine Eigenschaft, die geändert wird, während es offen ist, zeigt sich beim nächsten Öffnen.

ElementTypStandardZweck
is_labelstring""Text des Eintrags
is_imagestring""Bild vor dem Text, jederzeit änderbar
ib_enabledbooleantrueEintrag ausgegraut: sichtbar, aber nicht wählbar
ib_checkedbooleanfalseHäkchen vor dem Eintrag, für den aktuellen Wert
ib_visiblebooleantrueEintrag aus der Liste genommen, ohne entfernt zu werden: ihn wieder zu zeigen braucht nichts weiter
// The menu of the encoding panel, entry by entry
uo_status.of_add_menu_item(/*keys*/ "enc/utf8", /*label*/ "UTF-8")
uo_status.of_add_menu_item(/*keys*/ "enc/ansi", /*label*/ "ANSI")
uo_status.of_menu_item(/*keys*/ "enc/utf8").ib_checked = true     // the current value
uo_status.of_menu_item(/*keys*/ "enc/ansi").ib_enabled = false    // not available here

Zustandskonstanten #

KonstanteWertVerwendung
STATE_NONE""Kein Zustand: normales Erscheinungsbild
STATE_INFO"info"Information
STATE_WARNING"warning"Warnung
STATE_ERROR"error"Fehler
STATE_SUCCESS"success"Erfolg

Wie bei jeder Eigenschaft mit vordefinierten Werten sollten Sie die Konstante statt der Zeichenkette verwenden:

// The panel takes the colors of a warning
uo_status.of_panel(/*key*/ "state").is_state = n_pbt_statusbar_panel.STATE_WARNING

Events #

EventAusgelöst wenn
ue_panel_clicked (string as_key)Ein anklickbarer Bereich (ib_clickable) wird angeklickt
ue_panel_double_clicked (string as_key)Ein anklickbares Panel wurde doppelt angeklickt — die klassische Abkürzung hinter Zeile 12, Sp. 4, die ein "Gehe zu Zeile" öffnet. Nie bei einem Bereich mit Auswahlliste: sein erster Klick hat die Liste geöffnet
ue_panel_rclicked (string as_key, long al_x, long al_y)Ein Bereich mit Schlüssel erhielt einen Rechtsklick — anklickbar oder nicht (ein Kontextmenü ist keine Aktivierung), nie wenn er deaktiviert ist. Ein Ereignis pro Rechtsklick. al_x und al_y sind Bildschirm-Pixel ; für ein PowerBuilder-Menü PopMenu(PointerX(), PointerY()) Ihres Fensters
ue_panel_menu_clicked (string as_keys)Ein Eintrag einer Panel-Auswahlliste wurde gewählt (siehe of_add_menu_item). as_keys trägt beide Ebenen: das Panel, dann den Eintrag — "enc/utf8". Per Tastatur öffnen Eingabe, Leertaste, Pfeil nach oben oder unten die Liste. Ein Bereich, der entfernt, deaktiviert oder ausgeblendet wird, während seine Liste offen ist, schließt sie, und nichts wird ausgelöst
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)

Über die Tastatur #

Die Leiste ist ein einziger Tabulatorstopp: nur die zum Anklicken gedachten Felder gehören dazu, und die Pfeile durchlaufen sie.

TasteWirkung
PfeileWechseln zum vorherigen / nächsten interaktiven Feld, umlaufend; Anzeigefelder und deaktivierte Felder werden übersprungen
Pos1 / EndeErstes / letztes interaktives Feld
Eingabe oder LeertasteLöst das Feld aus — also ue_panel_clicked, oder das Öffnen seiner Auswahlliste, sofern vorhanden

Ein Feld, das nur anzeigt, ist kein Steuerelement: es ist weder fokussierbar noch wird es als solches angesagt. Ein anklickbares, aber deaktiviertes Feld bleibt dagegen als nicht verfügbar angesagt, statt für Text gehalten zu werden. Ein Fortschrittsbalken sagt seinen Wert an, ein unbestimmter keinen — dieses Fehlen ist die Bedeutung des Wortes.

Der Fokus übersteht den Neuaufbau der Leiste: sie wird bei jeder Textänderung neu gezeichnet, und ohne dies fiele der Fokus bei einer Leiste mit Uhr jede Sekunde weg.


Beispiele #

Feste und automatische Breiten #

// Breite 0 : der Bereich nimmt genau den Platz seines Textes ein
uo_status.of_add_panel(/*key*/ "", /*text*/ "An den Inhalt angepasster Bereich", /*icon_file*/ "", /*align*/ uo_status.ALIGN_START, /*width*/ 0)

// Feste Breite in Pixeln : nuetzlich, wenn sich der Text haeufig aendert,
// damit die benachbarten Bereiche nicht bei jeder Aktualisierung springen
uo_status.of_add_panel(/*key*/ "pos", /*text*/ "Zeile 1, Sp. 1", /*icon_file*/ "", /*align*/ uo_status.ALIGN_START, /*width*/ 150)

// Ein Bereich, der ans entgegengesetzte Ende geschoben wird
uo_status.of_add_panel(/*key*/ "clock", /*text*/ "12:00", /*icon_file*/ "", /*align*/ uo_status.ALIGN_END, /*width*/ 140)

Symbole und anklickbare Bereiche #

// Ein Schluessel macht den Bereich adressierbar ; ib_clickable macht ihn anklickbar
uo_status.of_add_panel(/*key*/ "save", /*text*/ "Gespeichert", /*icon_file*/ "mono:img\save.svg", /*align*/ uo_status.ALIGN_START, /*width*/ 0)
uo_status.of_add_sep()   // Trennlinie zwischen zwei Gruppen von Bereichen
uo_status.of_add_panel(/*key*/ "conn", /*text*/ "Verbunden",   /*icon_file*/ "mono:img\plug.svg", /*align*/ uo_status.ALIGN_START, /*width*/ 0)
uo_status.of_add_panel(/*key*/ "user", /*text*/ "Alex Martin",  /*icon_file*/ "mono:img\user.svg", /*align*/ uo_status.ALIGN_END, /*width*/ 160)

// Nur diese beiden reagieren auf einen Klick (ue_panel_clicked)
uo_status.of_panel(/*key*/ "conn").ib_clickable = true
uo_status.of_panel(/*key*/ "user").ib_clickable = true
// Event ue_panel_clicked von uo_status
choose case as_key
    case "conn" ; open(w_connection_settings)
    case "user" ; open(w_profile)
end choose

Rich-Text in einem Bereich #

Die Bereiche akzeptieren die Rich-Text-Auszeichnung: Stile, Farben und kleine Bilder direkt im Text.

// Eine Begruessung links
uo_status.of_add_panel(/*key*/ "", /*text*/ "Willkommen [b]bei[/b] [accent]PBToolboxAI[/accent]", &
                       /*icon_file*/ "", /*align*/ uo_status.ALIGN_START, /*width*/ 0)

// Der Verbindungsstatus rechts
uo_status.of_add_panel(/*key*/ "", /*text*/ "[green]Online[/green] [picture=mono:img\plug.svg,14,14]", &
                       /*icon_file*/ "", /*align*/ uo_status.ALIGN_END, /*width*/ 0)
// Rich-Text gilt auch fuer Aktualisierungen
uo_status.of_panel(/*key*/ "state").is_text = "[b]" + String(ll_changed) + "[/b] Datensaetze geaendert"

Einen langen Vorgang verfolgen #

// Local variables
n_pbt_statusbar_panel lnv_import

// Der Import-Bereich, dann sein Handle, um ihm zu folgen
uo_status.of_add_panel(/*key*/ "import", /*text*/ "Import", /*icon_file*/ "", /*align*/ uo_status.ALIGN_START, /*width*/ 220)
lnv_import = uo_status.of_panel(/*key*/ "import")
// In der Verarbeitungsschleife : der Mini-Balken folgt dem Fortschritt
lnv_import.ii_progress = ll_percent
lnv_import.is_text     = "Import " + String(ll_percent) + " %"
// Am Ende : den Mini-Balken ausblenden und das Ergebnis melden
lnv_import.ii_progress = -1                       // negativer Wert = Balken ausgeblendet
lnv_import.is_text     = "Import abgeschlossen"
lnv_import.is_state    = lnv_import.STATE_SUCCESS

Einen dezenten Hinweis melden #

// Local variables
n_pbt_statusbar_panel lnv_panel

// Der Bereich der Verbindung
lnv_panel = uo_status.of_panel(/*key*/ "conn")

// Offline : der Bereich zeigt einen Fehler ; verbunden : er sieht wieder normal aus
if not ib_connected then
    lnv_panel.is_text  = "Offline"
    lnv_panel.is_state = lnv_panel.STATE_ERROR
else
    lnv_panel.is_text  = "Verbunden"
    lnv_panel.is_state = lnv_panel.STATE_NONE   // zurueck zum normalen Erscheinungsbild
end if

Die Leiste an den Kontext anpassen #

// Einen Bereich ausblenden, ohne ihn zu loeschen : er findet seinen Platz spaeter wieder
uo_status.of_panel(/*key*/ "user").ib_visible = ib_user_signed_in

// Ihn ausgrauen, wenn die zugehoerige Aktion keinen Sinn ergibt
uo_status.of_panel(/*key*/ "save").ib_enabled = ib_document_open

// Neu anordnen : den Zustandsbereich an den Anfang stellen (Positionen ab 1 gezaehlt)
uo_status.of_move_panel(/*key*/ "state", /*index*/ 1)

// Einen ueberfluessig gewordenen Bereich entfernen
uo_status.of_remove_panel(/*key*/ "import")

Der Größenänderungsgriff #

// Am Eckgriff ziehen aendert die Fenstergroesse (ausgeblendet, solange es maximiert ist)
uo_status.ib_show_resize_grip = true

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