11. Von 3.0 auf 4.0 migrieren #
← Von 2.0 auf 3.0 migrieren · Inhalt · Versionshinweise →
4.0 entfernt zwei Methoden der zweiunddreißig Komponenten aus 3.0 — of_set_data der Kreuztabelle, umbenannt in of_from_datastore (11.33), und of_transform von n_pbt_xml, das mit XSLT wegfällt (11.31) — und ändert Signaturen, die Ihnen der Compiler Zeile für Zeile zeigt: drei umbenannte Eigenschaften (id_minimum und id_maximum des Fortschrittsbalkens, 11.6; il_doc_line des Code-Editors, 11.28), hinzugefügte oder umbenannte Ereignisargumente (ue_tile_moved, 11.6; ue_failed des REST-Clients, 11.6, und des Videos, 11.26; ue_error des Bildes, 11.25; ue_cell_double_clicked, 11.33; ue_closed der Befehlspalette, 11.36; ue_toast_clicked, ue_toast_action und ue_toast_dismissed des Toasters, 11.38), of_count und of_keys_at in long (11.34) sowie Methoden, die nun einen Code zurückgeben (of_refresh, of_select, of_show, of_scroll_to_end, of_set_header…). 11.6 gleicht außerdem zwei Zählweisen, ein Ereignis und den Pfad des JSON-Baums an die übrige Bibliothek an: dort, und in den genannten Abschnitten, ist Code anzufassen, der bisher kompilierte. Die Änderungen betreffen vor allem das Menüband (ribbon), das vollständig überprüft wurde. Zwei Änderungen verlangen, Ihren Code erneut zu lesen: die Frage vor einer Galeriekachel (11.1) und die durch ein Entfernen freigegebenen Handles (11.2). Die übrigen korrigieren Verhaltensweisen, die Sie vielleicht umgangen haben (11.3) — darunter der Rechtsklick auf ein Element, der in allen Komponenten nur noch ein Ereignis erzeugt, und der Brotkrumenpfad (breadcrumb), dessen Adressen und Ablehnungen überarbeitet wurden. Danach folgen der Generator n_pbt_menu2ribbon (11.4) und die Ergänzungen (11.5). Die Seitenleiste (listbar) folgt der Regel aus 11.1 ebenfalls: Ihre Frage vor einer Auswahl ist nun optional. Die Registerkarten (tab) folgen derselben Regel: Ihre beiden Fragen, vor einem Registerkartenwechsel und vor dem Schließen, sind nun optional (11.1). Schließlich folgen die Designs der Anwendung (11.7): der Akzent der Anwendung übersteht einen Designwechsel, und eine leer gelassene Designachse folgt der der Anwendung. Die Sicherheitsüberprüfung von crypto (11.8) schließt eine Algorithmusverwechslung bei JWT-Token, ersetzt mehrere stille Fälle durch eine Ablehnung mit Begründung und legt die Regel für relative Dateipfade fest.
Die vollständige Überprüfung vom 28.09.2026 hat jede ausgelieferte Komponente erneut gelesen; was sie ändert, hat einen Abschnitt je Komponente: restclient (11.9), speechout (11.10), statictext und formatierter Text (11.11), breadcrumb (11.12), buttonbar und die Fenstertastatur (11.13), button (11.14), menubar (11.15), ribbon (11.16), toolbar (11.17), statusbar (11.18), dockcontainer (11.19), tab (11.20), listbar (11.21), tilesbox (11.22), stepbar (11.23), progressbar (11.24), picture (11.25), video (11.26), pdfviewer (11.27), codeeditor (11.28), jsontree und xmltree (11.29, 11.30), xml (11.31), json (11.32), crosstab (11.33), shellexplorer (11.35), commandpalette (11.36), radialmenu (11.37), toaster (11.38) und messagebox (11.39); der gemeinsame Sockel hat zwei Abschnitte, 11.34 und 11.40. Eine Regel zieht sich durch alle, die von PowerBuilder (SelectTab löst SelectionChanged aus): Eine von Ihrem Code verlangte Änderung löst dasselbe Ereignis aus wie eine Geste des Benutzers und stellt die Veto-Frage, wenn Sie sie eingeschaltet haben; die Methode liefert -4, wenn Sie ablehnen. Das gilt für eine Auswahl (of_select_*), ein Öffnen oder Zuklappen (of_expand, of_collapse, of_open), einen Zoom, einen Vollbildmodus, ein Kapitel; nichts wird ausgelöst, wenn sich nichts ändert, und of_reset bleibt still. Einen WERT zu setzen (ein Häkchen, einen Text, eine Lautstärke, einen Filter) bleibt still, wie SetItem. ue_layout_changed wird in beiden Fällen ausgelöst: Es meldet, dass sich eine zu speichernde Anordnung geändert hat.
11.1 Die Fragen vor einer Änderung sind jetzt optional #
In 3.0 stellte das Menüband die Frage ue_gallery_selection_changing standardmäßig, bevor eine Kachel übernommen wurde: ib_veto_gallery war true. In 4.0 ist es false, wie jedes abbrechbare Ereignis der Bibliothek: Jede Frage kostet einen Hin- und Rückweg zu PowerBuilder, und nur eine Anwendung, die antwortet, soll ihn bezahlen. Eine Anwendung, die das Ereignis nicht skriptete, sieht keinen Unterschied. Neu: of_select_gallery_item löst ue_gallery_selection_changed wie ein Klick aus und stellt, bei eingeschalteter Frage, diese ebenfalls; eine Ablehnung lässt es -4 liefern, die Kachel ändert sich nicht.
// 4.0 : the question is only asked on request. If your ue_gallery_selection_changing
// returns false for some tiles, switch it on where the ribbon is built.
uo_ribbon.ib_veto_gallery = true
Das Rezept: Suchen Sie in Ihren Menüband-Nachfahren nach ue_gallery_selection_changing; wo es geskriptet ist, fügen Sie beim Aufbau ib_veto_gallery = true hinzu. Wo Sie ib_veto_gallery = false schrieben, um die Frage abzuschalten, ist die Zeile nun überflüssig und kann entfallen.
Die Seitenleiste (listbar): ib_veto_selection #
Gleiche Regel: In 3.0 stellte die listbar vor jedem Auswahlwechsel standardmäßig ue_selection_changing (ib_veto_selection war true). In 4.0 ist es false. Wenn Sie ue_selection_changing geskriptet haben, um einen Wechsel abzulehnen, setzen Sie ib_veto_selection = true: Ohne das wird das Ereignis nicht mehr ausgelöst, und die Auswahl wechselt, ohne Sie zu fragen. Eingeschaltet wird die Frage auch für eine von Ihrem Code verlangte Auswahl gestellt (of_select_item, of_clear_selection), wie in 3.0; eine Ablehnung lässt sie nun -4 liefern, und die Auswahl bewegt sich nicht. ue_selection_changed wird wie bisher ausgelöst.
// 4.0 : the listbar only asks on request. If your ue_selection_changing
// returns false (unsaved changes), switch the question on where the bar is built.
uo_nav.ib_veto_selection = true
Das Rezept: Suchen Sie in Ihren Nachfahren von u_pbt_listbar nach ue_selection_changing; wo es false zurückgibt, fügen Sie beim Aufbau ib_veto_selection = true hinzu. Wo Sie ib_veto_selection = false schrieben, um die Frage abzuschalten, ist die Zeile nun überflüssig und kann entfallen.
Die Registerkarten (tab): ib_veto_selection und ib_veto_close #
Gleiche Regel, zwei Fragen: In 3.0 stellte die Komponente tab standardmäßig ue_selection_changing vor jedem Registerkartenwechsel und ue_tab_closing vor jedem Schließen (ib_veto_selection und ib_veto_close waren true). In 4.0 sind beide false. Wenn Sie ue_selection_changing oder ue_tab_closing geskriptet haben, um abzulehnen, setzen Sie ib_veto_selection = true oder ib_veto_close = true: Ohne das wird das Ereignis nicht mehr ausgelöst, und die Registerkarte wechselt oder schließt, ohne Sie zu fragen. Eingeschaltet wird die Frage auch für of_select_page gestellt, wie in 3.0, aber bevor die Registerkarte wechselt: Eine Ablehnung lässt es -4 liefern, und nichts bewegt sich; eine Zustimmung wechselt die Registerkarte sofort, ue_selection_changed wird wie bisher ausgelöst, und of_selected_key() liefert direkt danach bereits den neuen Schlüssel.
// 4.0 : the tab only asks on request. If your ue_selection_changing or
// ue_tab_closing returns false (unsaved changes), switch the questions on.
uo_tabs.ib_veto_selection = true
uo_tabs.ib_veto_close = true
Das Rezept: Suchen Sie in Ihren Nachfahren von u_pbt_tab nach ue_selection_changing und ue_tab_closing; wo eines false zurückgibt, fügen Sie beim Aufbau die passende Zeile hinzu. Wo Sie = false geschrieben haben, um eine Frage abzuschalten, ist die Zeile nun überflüssig und kann entfallen.
11.2 Hinzufügungen melden, was sie ablehnen, Entfernungen geben ihre Handles frei #
In 3.0 lieferte eine Hinzufügung, die das Menüband ignorierte — ein bereits vergebener Schlüssel, ein Menüeintrag unter einer einfachen Schaltfläche —, trotzdem 0, und nichts erschien. In 4.0 liefert sie -5, und den Code des Sendens (-2, wenn die Komponente nicht erzeugt ist) statt einer festen 0. Und ein Entfernen gibt die Handles dessen frei, was geht: eine Variable mit dem Handle eines entfernten Steuerelements ist nicht mehr gültig.
| Was | 3.0 | 4.0 |
|---|---|---|
| Hinzufügen eines bereits vergebenen Schlüssels (Registerkarte, Gruppe, Steuerelement) | 0, ignoriert | -5 |
| Menüeintrag, Kombinationsfeld-Auswahl oder Kachel unter einem Steuerelement anderer Art | 0, ignoriert | -5 |
of_add_tab, of_insert_tab, of_add_group, of_add_contextual_*, of_add_qat auf einer nicht erzeugten Komponente | 0 | -2 |
Ein nach of_remove_tab, of_remove_group, of_remove_item oder of_clear behaltenes Handle | blieb bis zur Zerstörung des Menübands im Speicher | freigegeben: IsValid() liefert false |
// 4.0 : after a removal or of_clear, ask the component for the handle again
uo_ribbon.of_clear()
uo_ribbon.of_add_tab(/*key*/ "home", /*title*/ "Home")
uo_ribbon.of_add_group(/*keys*/ "home/clip", /*title*/ "Clipboard")
uo_ribbon.of_add_button(/*keys*/ "home/clip/paste", /*label*/ "Paste", /*image*/ "")
uo_ribbon.of_item(/*keys*/ "home/clip/paste").ib_enabled = false
Das Rezept: Behalten Sie kein Handle über ein Entfernen oder ein of_clear hinaus — fordern Sie es erneut mit of_tab, of_group, of_item oder of_menu_item an, was nichts kostet. Wo ein Aufbaufehler für Sie zählt, prüfen Sie den Code, den das Hinzufügen liefert.
11.3 Weitere Verhaltensweisen, die Sie bemerken können #
Ist das Fenster schmal, klappt das Menüband seine Gruppen zu einer Schaltfläche zusammen, die ein Bedienfeld öffnet. Aus diesem Bedienfeld stammen die sichtbarsten Unterschiede:
| Was | 3.0 | 4.0 | |
|---|---|---|---|
| Schaltfläche oder Hauptteil eines Split, im Bedienfeld einer zusammengeklappten Gruppe angeklickt | ue_menu_selected("", false) | ue_clicked(adresse) | |
| In diesem Bedienfeld gewählter Menüeintrag | unvollständige Adresse | vollständige Adresse, Kaskade inbegriffen | |
| Ausgegrautes Steuerelement oder ausgeblendeter Eintrag in diesem Bedienfeld | reagierte / wurde angezeigt | reagiert nicht / wird nicht angezeigt | |
| Großer Split, aus Platzmangel verkleinert | ein Klick öffnete nur das Menü | zwei Teile: der Befehl und der Menüpfeil | |
Menüeintrag mit dem Schlüssel seines Steuerelements (home/clip/paste/paste) | ue_clicked("home/clip/paste") | ue_menu_selected("home/clip/paste/paste", …) | |
of_menu_item("…/exp/pdf"), wenn eine Kaskade ebenfalls pdf enthält | konnte …/exp/more/pdf treffen | trifft den Eintrag, den die Adresse nennt | |
as_from_keys von ue_gallery_selection_changed ohne vorherige Kachel | die Adresse der Galerie | "" | |
Zurücklesen eines Handles der Symbolleiste für den Schnellzugriff, il_color einer Farbauswahl, ii_visible_items, is_keytip einer Registerkarte, il_color einer Kontextgruppe, of_count() einer Galerie | leer, -1 oder 0 | der angezeigte Wert | |
of_keys_at eines Kombinationsfelds | "home/font/cb/cb:Arial" | "home/font/cb/Arial": der Schlüssel einer Auswahl ist ihre Beschriftung | |
of_ctx_group(k).il_color, wenn eine Registerkarte ebenfalls den Schlüssel k trägt | färbte die Registerkarte | färbt nur das Banner | |
Elementfarben (il_back_color…) und is_tooltip einer Registerkarte oder Gruppe | ohne Wirkung | angewendet; der Tooltip einer Gruppe erscheint auf ihrem Titel | |
of_remove_item("save") auf einer Schaltfläche der Symbolleiste für den Schnellzugriff | -5 | die Schaltfläche wird entfernt | |
of_add_app_menu_separator("saveas/s1") | ein Strich auf oberster Menüebene | der Strich im Untermenü von saveas; ein Schlüssel ohne / ändert sich nicht | |
of_clear(), während eine Registerkarte aktiv war | kein Ereignis | ue_selection_changed("") | |
Drehfeld mit Dezimalschritt (0.1) | 0.30000000000000004 | 0.3 | |
| Alt-Tastenkürzel (Keytip) auf einem ausgegrauten Steuerelement, Menüband minimiert | das Menüband blieb offen | es schließt sich, nichts wird ausgeführt | |
| toolbar: ausgegrautes Kombinationsfeld, Drehfeld oder Galerie im Chevron-Bedienfeld | reagierten | reagieren nicht | |
Alle: Rechtsklick auf ein Element (ue_item_rclicked, ue_panel_rclicked, ue_row_rclicked…) | die Seite sendete auch das Ereignis der Komponente, das keine Komponente mit Elementen an PowerBuilder weitergab | ein Ereignis, das des Elements; ein ue_rclicked der Komponente, wo es existiert, kommt nur außerhalb der Elemente | |
Alle: ein Ablegen von Dateien (ib_allow_drop) | ue_drag_leave, dann ue_drop_files; Pfade nach 260 Zeichen abgeschnitten | nur ue_drop_files, vollständige Pfade; of_reset entfernt das Ablageziel | |
breadcrumb: of_path() mit einem verborgenen Segment oder in der Demoversion | die angezeigten Schlüssel: das verborgene übersprungen, die ersten Segmente abgeschnitten | die vollständige Adresse des aktuellen Orts: of_truncate(of_path()) trifft; das Eingabefeld geht von derselben aus | |
breadcrumb: of_keys_at(n); of_has("computer/C:") | der einfache Schlüssel; suchte unter den Zweigen des Menüs | die Adresse des Segments; sucht unter den Segmenten | |
breadcrumb: Lesen eines Handles mit tiefer Adresse, of_item("a/b/c").is_text | las nur die letzte Ebene: leer bei einem wiederholten Schlüssel | das Segment dieser Adresse | |
breadcrumb: of_truncate, of_remove_item, of_clear_children, of_remove_child auf einer unbekannten Adresse oder einem wiederholten einfachen Schlüssel; of_add_child unter einem fehlenden Segment oder auf einem bereits vergebenen Zweig; of_add_item einer Adresse, die woanders landen würde | 0, ignoriert (oder nur der letzte Schlüssel übernommen) | -5 | |
breadcrumb: ein nach of_clear, of_remove_item, of_truncate, of_clear_children oder of_remove_child behaltenes Handle | blieb im Speicher | freigegeben: IsValid() liefert false | |
| breadcrumb: Eingabefeld unverändert verlassen, oder Fenster gewechselt (Alt+Tab) während der Eingabe | ue_path_entered ausgelöst | nichts; die Eingabe bleibt beim Fensterwechsel | |
breadcrumb: ausgegrautes Segment; Enter auf einem Segment | sein Chevron öffnete sich und es nahm ein Ablegen an; Enter drückte auch die Standardschaltfläche des Fensters | vollständig wirkungslos; Enter klickt nur das Segment | |
buttonbar: Enter, während eine andere Schaltfläche der Leiste den Tastaturfokus hat | löste die Standardschaltfläche aus (is_default) | löst die fokussierte Schaltfläche aus, wie Windows; die Standardschaltfläche, wenn keine Schaltfläche der Leiste den Fokus hat | |
buttonbar: ausgegraute oder ausgeblendete Standard- oder Abbrechen-Schaltfläche; is_shortcut einer ausgegrauten oder ausgeblendeten Schaltfläche | Enter, Esc oder Alt+Buchstabe wirkungslos verschluckt, auch in einem PowerBuilder-Steuerelement des Fensters | die Taste bleibt beim Fenster | |
buttonbar: is_shortcut mit mehreren Buchstaben ("Save") | Alt+S funktionierte nur, wenn die Leiste den Fokus hatte | Alt+S funktioniert überall im Fenster (der erste Buchstabe, wie dokumentiert) | |
buttonbar: of_add_button / of_insert_button mit einem schon vergebenen Schlüssel oder einem mit / oder einem senkrechten Strich; of_remove_button / of_move_button mit einem unbekannten Schlüssel | 0, ignoriert | -5 | |
buttonbar: of_remove_button, of_clear_buttons | Alt+Buchstabe-Kürzel, Farben und Tooltip der Schaltfläche blieben (eine unter demselben Schlüssel neu erstellte Schaltfläche übernahm sie); das Handle blieb im Speicher | sie gehen mit der Schaltfläche; das Handle wird freigegeben: IsValid() liefert false | |
codeeditor: is_text eines CRLF-Textes zurücklesen | in LF (nur im gefalteten Zustand in CRLF): is_text = ls_original war falsch | mit den übergebenen Zeilenenden, gefaltet oder nicht | |
codeeditor: is_syntax nach SYNTAX_CSHARP, SYNTAX_CPP, SYNTAX_JAVA, SYNTAX_XML zurücklesen | die verwendete Grammatik ("c", "html") | der geschriebene Wert | |
codeeditor: of_insert_text schreibgeschützt oder gefaltet | schreibgeschützt eingefügt; gefaltet abgelehnt, aber 0 | -4, nichts wird eingefügt | |
codeeditor: ii_doc_line | nur ein Band, oft außerhalb der Ansicht, im Umbruchmodus fehlend; ein integer | die Zeile kommt in die Mitte der Ansicht (eine verbergende gefaltete Region öffnet sich), Band auch im Umbruchmodus; Einfügemarke und Auswahl unverändert; ein long — in 4.0 in il_doc_line umbenannt (Abschnitt 11.28) | |
codeeditor: #regionopen mit ib_folding | im Text als #region umgeschrieben (is_text, auch nach dem Falten) | nie verändert; nur die gefaltete Anzeige zeigt #region | |
codeeditor: ue_find_result | zweimal pro of_find, bei jedem Tastendruck und (0, 0) beim Schließen der Leiste; auch bei ib_search_enabled = false ausgelöst | einmal pro Suche oder Schritt; beim Tippen nur bei geänderter Anzahl; nie beim Schließen; of_find wirkungslos bei deaktivierter Suche | |
codeeditor: ue_caret_changed | stumm beim Tippen; gefaltet die ANGEZEIGTE Zeile | auch beim Tippen ausgelöst; gefaltet die Zeile der Leiste | |
codeeditor: Strg+Z nach Enter oder Tab; Enter / Tab im gefalteten Zustand | der Rückgängig-Verlauf wurde gelöscht; gefaltet änderte die Taste die Anzeige und ging danach verloren | jeder Tastendruck lässt sich rückgängig machen; gefaltet ist die Taste wirkungslos | |
codeeditor: ib_folding = true mit ib_line_numbers = false | die Regionen blieben geschlossen, ohne Markierung zum Öffnen | eine schmale Leiste behält die Markierungen | |
commandpalette: of_add_command mit einem schon vergebenen Schlüssel oder einem mit / oder einem senkrechten Strich; of_remove_command mit einem unbekannten Schlüssel | 0 (ein vergebener Schlüssel ergab zwei Zwillingsbefehle) | -5 | |
commandpalette: of_open / of_register_shortcut ohne ipo_owner und ohne ipo_receiver | 0, und kein Event kam je an | -5 | |
| commandpalette: das Kürzel, gedrückt während die Palette offen ist | ohne Wirkung | schließt die Palette | |
| commandpalette: ein zerstörtes Palettenobjekt (Seite oder Fenster geschlossen) | sein Kürzel blieb registriert und schluckte die Taste im Fenster, ganz ohne Event | das Kürzel verschwindet mit dem Objekt, und eine von ihm geöffnete Palette schließt sich | |
commandpalette: auf einer Zeile angezeigtes Kürzel, auf einer nicht lateinischen Tastatur, mit einer Ziffer und Umschalt, Ctrl+Space, Ctrl+Up, Ctrl+Del oder einer F-Taste allein | reagierte nicht; Win + Buchstabe startete den Befehl mit diesem einzelnen Buchstaben als Kürzel | reagiert: die physische Taste, gelesen wie die DLL sie liest; Win ist nie ein Modifikator | |
commandpalette: ein Befehl mit dem Kürzel Ctrl+C, Ctrl+V, Ctrl+Z oder Ctrl+A, beim Tippen | der Befehl lief statt Kopieren, Einfügen… | das Suchfeld behält diese vier Tasten | |
commandpalette: of_reset | behielt is_recent, eine offene Palette und das schon registrierte Kürzel | leert sie, schließt sie und setzt das registrierte Kürzel auf SHORTCUT_DEFAULT zurück | |
commandpalette: pbm_custom02 des Fensters ipo_owner | bei jedem Paletten-Event ausgelöst | nie: nur ein gesetzter ipo_receiver erhält ihn noch | |
Alle: einen langen Textwert zurücklesen (is_text eines großen Skripts) | mit der Größe immer langsamer (mehrere Sekunden); über einer Million Zeichen ohne Warnung abgeschnitten | proportional zur Größe; vollständig | |
n_pbt_utils.of_dir_has_subfolders | zählte verborgene und System-Ordner sowie Junctions; über 260 Zeichen unlesbar | ignoriert sie wie der Explorer (die Überladung ab_include_hidden zählt sie); liest lange Pfade | |
crosstab: Tausendertrennzeichen von of_set_value_format | galt für ALLE Kennzahlen; "," nicht erkannt ($1 234 auf Französisch) | Einstellung DIESER Kennzahl; ",", ".", " " erkannt; "" = Standard des Menüs Optionen | |
crosstab: of_set_member_filter(Feld, "") | kein Element behalten: leere Tabelle | entfernt den Filter, wie of_set_member_order("") | |
crosstab: is_show, is_conditional_formatting, of_set_value_format vor of_add_value_field | wortlos verloren | aufbewahrt, so zurückgelesen, angewendet, wenn das Feld in Werte kommt | |
| crosstab: Sortieren einer Spalte oder Einklappen einer Gruppe mit der Maus | kein Event | ue_layout_changed, wie alles, was of_get_layout speichert | |
crosstab: Datumswerte eines DataStore auf einem nicht französischen Rechner (3/15/2025, 15.03.2025) | in einen falschen oder leeren Monat gruppiert; Datumswerte nur nach dem Jahr sortiert | der richtige Monat; die Spalte als jjjj-mm-tt zurückgelesen, zeitlich sortiert | |
| crosstab: in Deutsch, Italienisch, Spanisch, Portugiesisch angezeigte Zahlen | amerikanisch (1,234.5) | in der Anzeigesprache (1.234,5 auf Deutsch) | |
crosstab: of_export_csv | Zahlen mit Punkt (1436.5), von einem französischen Excel als Text gelesen; eine Beschriftung =… lief beim Öffnen | Dezimaltrennzeichen der Anzeigesprache; ein Apostroph vor = + - @ | |
crosstab: of_export_xlsx | ausgeblendete Summen und Zwischensummen trotzdem exportiert; Gesamtsumme oben ignoriert; ein Symbol „davor“ nach hinten verschoben | die Tabelle wie auf dem Bildschirm | |
| crosstab: „Zu Werten hinzufügen“ im Menü eines Feldes, das schon in Werte ist | ersetzte seine Werte | fügt einen Wert hinzu, wie das Ziehen | |
| crosstab: „Entfernen“ im Menü eines gefilterten Feldes | der Filter blieb aktiv, unsichtbar | der Filter geht mit dem Feld | |
crosstab: AGG_DISTINCT_COUNT auf einer Spalte mit leeren Zellen | leer zählte als Wert | ignoriert, wie in Excel | |
| crosstab: Formel, die eine berechnete Kennzahl nennt | akzeptiert, ergab 0 | über ue_calc_field_error abgelehnt; seine Meldungen sind auf Englisch | |
crosstab: ue_layout_changed mit einer geschweiften Klammer in einem Element; ad_value von ue_cell_double_clicked | Layout abgeschnitten; Wert 0, wenn ein Zeilenfeld value heißt, Exponent verloren | vollständig gelesen | |
crosstab: ib_enabled = false, über die Tastatur | Enter öffnete das Menü eines Chips, Strg+C kopierte | stumm | |
| crosstab: Tastatur | der Fokus fiel nach jeder Aktion an den Seitenanfang zurück; kein Weg, ein Feld zu verschieben | der Fokus bleibt auf dem betätigten Element; das Menü eines Chips verschiebt es (andere Zone, links, rechts) | |
| crosstab: dunkles Design | negative Werte und Symbolpfeile schwer lesbar; ausgewählte Farbskala-Zelle unlesbar | eine eigene Palette im dunklen Modus | |
crypto: of_jwt_sign mit JWT_EDDSA | der Header lautete "alg":"EDDSA", was andere Bibliotheken (jose, PyJWT, jjwt) ablehnen | "alg":"EdDSA", der registrierte Name; ein 3.0-Token wird weiterhin geprüft | |
crypto: of_generate_keypair mit unbekannter Art oder Größe ("ec_p256", 1024) | 0 und ein RSA-2048-Paar, kommentarlos | -5, beide PEM leer, is_last_error nennt die zulässigen KEY_* | |
crypto: of_hash_file("SHA-256", …); unbekannter Algorithmus | leer, und is_last_error meldete „Datei unlesbar“ für eine einwandfreie Datei | der Name wird wie bei of_hash gelesen (SHA-256 = HASH_SHA256); ein unbekannter Algorithmus wird als solcher gemeldet, getrennt von einer unlesbaren Datei | |
crypto: of_base64_encode_file einer zu großen Datei (über 64 MB in 32 Bit, 512 MB in 64 Bit); einer fehlenden Datei im Demo-Modus | „Datei unlesbar“; „Demo-Grenze“ | „zu groß für diesen Prozess“; „Datei unlesbar“ — is_last_error nennt den wahren Grund | |
crypto: is_last_error nach einem erfolgreichen nativen Aufruf (of_crc32, of_hash mit MD5, of_hash_file…) | behielt den Fehler des vorigen Aufrufs | leer | |
crypto: leerer HMAC-Schlüssel; nicht numerisches exp/nbf eines JWT; of_password_verify eines Werts mit über 10 000 000 Runden; of_random_password mit unbekanntem Satz | undurchsichtiger Engine-Fehler; ewig gültiges Token; minutenlange Berechnung; CHARSET_ALL kommentarlos genommen | sofort abgelehnt, is_last_error sagt warum | |
crypto: of_base64_decode_to_file("", pfad) | -5 | 0, eine leere Datei | |
dockcontainer: of_add_panel mit einem unbekannten as_relative_to, einem bereits gehosteten Steuerelement, einem Schlüssel mit / oder senkrechtem Strich, oder POSITION_STACK auf dem Haupt-Panel | 0: das Panel dockte an der Wurzel an, das Steuerelement wurde doppelt gehostet, oder das auf das Haupt-Panel gestapelte Panel blieb unsichtbar | -5, und das Steuerelement wird nicht angetastet | |
dockcontainer: of_move_panel zu einem unbekannten Ziel, oder POSITION_STACK auf das Haupt-Panel | 0: das Panel ging an die Wurzel, oder nichts bewegte sich | -5 | |
dockcontainer: of_remove_panel, of_reset | das Steuerelement kam ausgeblendet in sein Fenster zurück, an Position und Größe des Docks | es kehrt an seinen Platz zurück, in seiner Größe und mit der Sichtbarkeit, die es vor of_add_panel hatte | |
dockcontainer: is_main vor of_add_panel gesetzt; is_main = ""; is_main eines gestapelten Panels | stillschweigend ignoriert; nichts wurde übertragen; seine Stapelnachbarn wurden unsichtbar | aufbewahrt und beim Hinzufügen des Panels angewendet; das Haupt-Panel wird entfernt; es verlässt seinen Stapel, die anderen bleiben sichtbar | |
dockcontainer: of_set_layout mit einer Anordnung, die keines der Panels kennt, oder mit einem Text, der keine Anordnung ist | das Dock wurde geleert, oder die ganze Nachricht wurde verworfen; 0 | die Panels bleiben, neben den anderen angeordnet (nie auf dem Haupt-Panel); -5 für einen Text, der keine Anordnung ist | |
dockcontainer: ue_layout_changed | nur beim Ziehen, bei der Größenänderung und beim Andocken ausgelöst: eine bei diesem Ereignis gespeicherte Anordnung vergaß ein geschlossenes Panel oder die aktive Registerkarte | auch ausgelöst, wenn ein Panel geschlossen, ausgeblendet, ausgewählt oder umbenannt wird, und wenn sich das Haupt-Panel ändert | |
| dockcontainer: Klick auf die Registerkarte (oder Kopfzeile) des bereits aktiven Panels | ue_panel_selected bei jedem Klick | nichts: das Ereignis meldet einen WECHSEL des aktiven Panels | |
dockcontainer: gelöstes Panel (ib_pinned = false) | seine Lasche öffnete sich nur per Klick (die Doku sagte „beim Überfahren“) | sie öffnet sich beim Überfahren (400 ms) oder per Klick; beim Überfahren geöffnet, klappt sie wieder ein, wenn die Maus sie verlässt | |
| dockcontainer: Standard-PB-Steuerelement (MultiLineEdit, Schaltfläche…) in einem schwebenden Panel | seine Benachrichtigungen (modified, clicked, Farben) kamen nicht mehr an | sie kommen an wie im angedockten Zustand | |
dockcontainer: ein schwebendes Panel ausblenden (ib_visible = false) | sein Fenster blieb offen | es schließt sich; wieder eingeblendet, kehrt das Panel angedockt an seinen Platz zurück | |
| dockcontainer: schwebendes Fenster | ihr Nutzbereich war kleiner als das Panel (Titelleiste davon abgezogen), es konnte den Bildschirm verlassen, und ein Titel mit Auszeichnungen zeigte die Tags | der Nutzbereich hat die Größe des Panels, das Fenster bleibt auf dem Bildschirm, der Titel ist reiner Text | |
| dockcontainer: Trennleiste über die Tastatur | der erste Pfeil ließ sie auf 50 % springen | sie startet von ihrer angezeigten Position | |
json: Null-Wert an of_set_number, of_add_number, of_set_boolean, of_add_boolean, oder Null- bzw. leerer Wert an of_set_raw / of_add_raw | das ganze Dokument wurde null (of_text lieferte null) oder war kein JSON mehr; ein Null-Boolean wurde als false geschrieben | null wird geschrieben, der Rest des Dokuments bleibt unberührt | |
json: Schreiben in ein GELADENES Dokument, dessen Schlüssel als "k" : v oder mit maskiertem Zeichen geschrieben ist, gefolgt von einem Zeilenumbruch, oder dessen Wurzel ein Array ist; of_set_members auf einem solchen Dokument | der Schlüssel wurde doppelt angelegt (das Zurücklesen lieferte den alten Wert), das Schreiben lieferte fälschlich -4, oder das Dokument wurde durch das Fragment ersetzt | der Wert wird wie in einem gebauten Dokument ersetzt oder hinzugefügt; of_set_members liefert -4, wenn die Wurzel kein Objekt ist | |
json: of_set_*("items/1/qty", …) — ein NEUER Schlüssel in einem Objekt innerhalb eines Arrays | -4 | 0: der Schlüssel wird dem ersten Element hinzugefügt; ein Array wird über einen vorhandenen Index durchquert, angelegt wird nur ein Objektschlüssel | |
json: Pfad mit leerem Segment (/name, a//b, a/) | Schlüssel namens "" wurden angelegt; of_remove konnte einen anderen Wert entfernen | -5, nichts wird geschrieben; ein Leser antwortet „abwesend“ | |
json: of_load einer falsch geschriebenen Zahl (-, 01, +1, .5, 1., 1e) | 0, und of_is_valid wahr | -4, wie jedes ungültige JSON | |
json: of_get_number einer Zahl mit Exponent (1e-7, 2.5E+3) oder mehr als 9 Nachkommastellen | Exponent ignoriert (2.5E+3 als 2,5 gelesen), Nachkommastellen bei 9 abgeschnitten | Exponent aufgelöst, 17 signifikante Stellen erhalten | |
| json: ein großes Dokument lesen oder ändern (eine API-Antwort von 80 KB, 2000 Zeilen) | Sekunden pro Aufruf (20 s für of_count), die Anwendung wirkte eingefroren | eine zur Größe proportionale Zeit; die Zeilen einzeln lesen (rows/1, rows/2…) oder die Schlüssel mit of_name durchlaufen beginnt nicht mehr von vorn | |
listbar: of_add_section / of_insert_section mit einem vergebenen Schlüssel oder einem mit / oder senkrechtem Strich; of_add_item / of_insert_item mit einer vergebenen Adresse oder unter einem Abschnitt, den die Leiste nicht hinzugefügt hat; of_remove_item, of_move_item, of_select_item, of_remove_section, of_move_section mit einer unbekannten Adresse | 0, ignoriert; ein Eintrag unter einem unbekannten Abschnitt erschien unter dem letzten Abschnitt | -5; of_add_section gibt auch -2 zurück, wenn die Komponente nicht erstellt ist | |
listbar: ein nach of_remove_item, of_remove_section oder of_clear gehaltenes Handle | blieb im Speicher | freigegeben: IsValid() gibt false zurück | |
listbar: das Entfernen oder Leeren dessen, was die Auswahl trägt (of_remove_item, of_remove_section, of_clear) | die Auswahl verschwand ohne Ereignis; nach of_clear gab of_selected_key noch die alte zurück | ue_selection_changed(alt, "") | |
listbar: ue_layout_changed | stumm beim Einklappen eines Abschnitts und beim Entfernen eines Eintrags; beim Wechsel in die Symbolleiste ausgelöst | ausgelöst beim Einklappen (Klick oder ib_collapsed eines Abschnitts) und beim Entfernen; nicht mehr für die Symbolleiste, die nicht zum Layout gehört | |
listbar: Symbolleiste (ib_collapsed = true) | die Einträge eines eingeklappten Abschnitts verschwanden; ein Eintrag ohne Symbol zeigte ein leeres Feld; of_reset ließ die Leiste schmal | alle Einträge, eine dünne Linie zwischen den Abschnitten, der Anfangsbuchstabe eines Eintrags ohne Symbol, die Beschriftung beim Überfahren; of_reset gibt der Leiste ihre Breite zurück | |
listbar: is_image eines Abschnitts; eine Farbe auf Abschnitt k, wenn ein Eintrag ebenfalls den Schlüssel k hat | ohne Wirkung; der Eintrag bekam die Farbe ebenfalls | das Symbol wird vor dem Titel gezeichnet; nur der Abschnitt bekommt die Farbe | |
| listbar: Tastatur | nach einer Beschriftungsänderung oder einer Auswahl reagierten die Pfeiltasten nicht mehr; ohne Auswahl war die Leiste nicht per Tab erreichbar; Abschnittstitel klappten nur mit der Maus | der Fokus bleibt auf dem Eintrag; ein Tab-Stopp; die Titel werden mit den Pfeiltasten erreicht und klappen mit Eingabe oder Leertaste | |
listbar: deaktivierter Eintrag (ib_enabled = false); ib_auto_width auf einer ausgeklappten Leiste | verblasste Beschriftung, in hellen Designs schwer lesbar; meldete die bereits gegebene Breite | die Deaktiviert-Farbe des Designs; die Breite, die die längste Zeile verlangt | |
listbar: Ziehen eines Eintrags (ib_reorderable) | Taste außerhalb des Fensters losgelassen: der Eintrag folgte weiter der Maus; der abschließende Klick konnte den abgelegten Eintrag auswählen | die Geste endet, wenn die Maus zurückkommt; das Ende eines Ziehens wählt nichts aus | |
menubar: ue_menu_opening | neben dem Aufklappmenü ausgelöst: was es änderte (Einfügen ausgrauen…), war erst beim nächsten Öffnen sichtbar | das Aufklappmenü wartet, bis das Ereignis zurückkehrt: die Änderung ist bei diesem Öffnen sichtbar | |
menubar: of_item, of_remove_item auf einem Eintrag, dessen Schlüssel auch in einer anderen Kaskade existiert (file/export/pdf, file/print/pdf) | konnten den anderen Eintrag treffen (den zuerst gefundenen); das auf einem angezeigte Tastenkürzel löste den anderen aus | treffen den Eintrag, den die Adresse nennt; ein Schlüssel allein durchsucht die Kaskaden nicht mehr | |
menubar: of_add_menu, of_add_item, of_add_separator auf einem vergebenen Schlüssel, mit / oder senkrechtem Strich, oder unter einem unbekannten Menü oder Elternelement; of_remove_item / of_remove_menu einer unbekannten Adresse | 0; ein Eintrag mit falsch geschriebenem Elternelement landete in der Wurzel des Menüs, ein vergebener Schlüssel ergab Zwillingseinträge | -5 | |
menubar: ein Handle oder Tastenkürzel nach of_remove_item, of_remove_menu oder of_clear | das Handle blieb im Speicher; das Tastenkürzel blieb scharf und schluckte die Taste, die die Anwendung nicht mehr erreichte | Handle freigegeben: IsValid() liefert false; Tastenkürzel entschärft | |
| menubar: Eintrag ausgegraut, ausgeblendet oder entfernt, während sein Aufklappmenü offen ist; Tastenkürzel eines Eintrags unter einer ausgegrauten Kaskade | der Klick oder die Taste löste noch ue_item_selected aus | nichts | |
menubar: Item-Farben (il_back_color…) eines Menüs oder Eintrags; is_tooltip eines Menüs | ohne Wirkung; eine Farbe wurde als -1 zurückgelesen | angewendet: auf dem Menütitel, auf dem Eintrag im Aufklappmenü; der Tooltip eines Menüs erscheint auf seinem Titel, ein Eintrag des Aufklappmenüs zeigt keinen | |
| menubar: Tastatur | die Pfeile blieben auf einem ausgegrauten Menü hängen; in RTL waren links und rechts vertauscht; Alt+Buchstabe eines ausgeblendeten Menüs verdeckte denselben Buchstaben eines anderen Menüs; nach Alt+Buchstabe und einer Auswahl schaltete das nächste Alt aus | ausgegraute Menüs werden übersprungen; die Pfeile folgen der Schreibrichtung; nur ein angezeigtes Menü reagiert auf seinen Buchstaben; das nächste Alt aktiviert die Leiste wieder | |
menubar: eine Kaskade, deren Einträge alle ausgeblendet sind; of_count("file"), of_keys_at | wurde wie ein Befehl gewählt (file/export); Trennlinien wurden mitgezählt (__sep0) | ausgegraut; nur Einträge werden gezählt | |
menubar: of_item("file") — eine Adresse mit einer Ebene | las das Menü zurück und schrieb auf einen nicht vorhandenen Eintrag „file“ | bezeichnet nichts: verwenden Sie of_menu("file") | |
Jeder aus einer Komponente oder einem JSON gelesene Text: Escapes \b und \f | blieben unverändert stehen | dekodiert (Rückschritt, Seitenvorschub) | |
| messagebox: ein Dialogfeld, das sich nicht öffnen ließ (WebView2-Laufzeit fehlt, Engine nicht bereit) | of_show und die Kurzformen (of_info…) lieferten 0, wie ein Schließen: of_info ließ glauben, ein Dialogfeld sei erschienen | -4 (-6, wenn die Laufzeit fehlt), der Grund über of_get_last_error(); of_choose und of_prompt liefern "" und of_get_last_error sagt es. Ein Test = 1 für „bestätigt“ bleibt richtig | |
messagebox: Esc oder Alt+F4, während eine Abbrechen-Schaltfläche noch herunterzählt (of_add_button_timed) | schlossen das Dialogfeld (0) | tun nichts bis zum Ende der Wartezeit: sie soll zum Lesen bringen | |
| messagebox: der Text der Meldung und der Anweisung | ließ sich nicht markieren; ein Druck darauf verschob das Dialogfeld | lässt sich markieren und kopieren (Strg+C kopiert die Markierung, ohne Markierung das ganze Dialogfeld); das Dialogfeld wird über Titel, Symbol und Ränder verschoben | |
messagebox: eine Eingabe von mehr als etwa 900 Zeichen (of_prompt, ib_input) | kam leer zurück, wie ein Abbruch | kommt vollständig zurück | |
messagebox: al_hwnd = 0, ein aus einem anderen geöffnetes Dialogfeld, ein verschobenes und dann vergrößertes Dialogfeld | der ganze Desktop wurde deaktiviert; das Fenster wurde wieder aktiv, während das erste Dialogfeld noch wartete; das Dialogfeld sprang zurück in die Mitte | ohne Besitzer wird nichts deaktiviert; das Fenster bleibt deaktiviert, solange ein Dialogfeld darauf wartet; das Dialogfeld behält seinen Platz | |
progressbar: leerer oder umgekehrter Bereich (id_maximum = 0, dann id_value = 0) | 0 %, unabhängig vom Wert | 100 %, sobald der Wert das Maximum erreicht (ein leerer Stapel ist fertig), davor 0 % | |
| progressbar: der angezeigte Prozentsatz, der Ring | auf den nächsten Wert gerundet (99,5 % zeigte „100%“); Ring fest auf 128 px; im Wartemodus drehte sich der Ring mit dem Bogen des Werts (leer bei 0: nichts bewegte sich) | abgerundet: 100 % heißt fertig; der Ring folgt der Größe des Steuerelements; im Wartemodus dreht sich ein fester Bogen; verlangt Windows weniger Animationen, pulsiert die Anzeige | |
Jede zurückgelesene double-Eigenschaft (id_value…) auf einem Rechner mit Dezimalkomma | der Nachkommaanteil wurde falsch gelesen (0,5 wurde nicht als 0,5 zurückgelesen) | wird exakt zurückgelesen, unabhängig vom Trennzeichen des Rechners | |
speechout: ein neues of_speak (oder of_close) während des Lesens | das abgebrochene Lesen löste kein ue_stopped aus | jedes begonnene Lesen endet mit einem ue_stopped | |
speechout: il_timeout_ms = 0 | brach das synchrone Lesen nach 5 s ab | keine Grenze (höchstens 24 Stunden) | |
| speechout: eine Stimme, die nicht erzeugt werden konnte (WebView2-Runtime fehlt, Seite abgelehnt) | of_speak, of_speak_from, of_pause, of_resume, of_enqueue, of_clear_queue lieferten -1, of_open den rohen DLL-Code | -2 (Komponente nicht erzeugt, wie überall), is_last_error nennt den Grund; -4, wenn die Seite nicht antwortete | |
speechout: of_speak_sync aus einem Event aufgerufen, das während eines anderen of_speak_sync ausgelöst wurde | brach das Lesen des äußeren Aufrufs ab, der trotzdem 0 lieferte | abgelehnt: -4, is_last_error = "already speaking synchronously" | |
speechout: of_speak_from nach dem letzten Satz | 0, nichts wurde gelesen | -5 | |
speechout: of_is_speaking() direkt nach of_speak | false, bis die Stimmenliste angekommen war | true ab of_speak | |
speechout: of_pick_voice("", Geschlecht) oder unlesbare Stimmenliste | wählte in der Sprache der Seite; ein Fehler leerte is_voice | "" = is_lang; ein Fehler behält is_voice und füllt is_last_error | |
speechout: of_voice_used, of_duration, of_spoken_text direkt nach Änderung von is_lang oder des Wörterbuchs | konnten mit den vorherigen Einstellungen antworten | antworten mit den soeben gesetzten Einstellungen | |
| speechout: Skriptfehler in der Seite der Stimme | stumm | ue_error("script error: …") | |
statictext: il_back_color mit ii_corner_radius | der Hintergrund füllte das ganze Rechteck, nur die Rahmenlinie war gerundet | der Hintergrund folgt der Rundung; außerhalb der Ecken die Farbe des Objekts, auf dem der Block liegt, die auch das Userobject übernimmt | |
statictext: is_marquee_direction bei Leserichtung von rechts nach links | umgekehrt: MARQUEE_START lief zum Ende, "left" nach rechts | MARQUEE_START läuft zum Anfang der Leserichtung; "left" / "right" bleiben physisch | |
statictext: Zurücklesen von il_back_color, ii_marquee_speed, is_marquee_direction, ib_marquee_overflow_only, ib_marquee_pause_on_hover, is_font_family | -1, 0, "", false, egal was gesetzt wurde; eine Schriftfamilie mit Leerzeichen in Anführungszeichen | der gesetzte Wert | |
statictext: ii_marquee_speed = 0 | behielt die vorherige Geschwindigkeit | Standardgeschwindigkeit (60) | |
statictext: of_reset nach einem Rahmen | Farbe und Stärke blieben erhalten: der nächste Rahmen erbte sie | gelöscht | |
statictext: ib_track_mouse, Komponente während des Überfahrens deaktiviert | ue_mouse_leave nie ausgelöst | ue_mouse_leave beim Verlassen ausgelöst | |
statictext: Laufschrift (ib_marquee) | ein [foldarea] ließ sich danach nicht mehr zuklappen; mit ib_marquee_overflow_only begann eine HÖHENänderung von vorn; mit ib_wrap = false ein falsches ue_text_overflow(true) | behoben: der Text wird nicht mehr kopiert, nur eine echte neue BREITE wird neu gemessen, und die Laufschrift zeigt den ganzen Text | |
statictext: ib_hover_effect und überfahrene Links bei einem dunklen Design | abgedunkelt (geringerer Kontrast) | aufgehellt | |
Rich Text: [symbol=clock] | unverändert angezeigt | ein einfarbiges Symbol; ein unbekannter Name bleibt Text | |
statusbar: of_add_panel / of_insert_panel mit einem vergebenen Schlüssel oder einem mit / oder senkrechtem Strich; of_move_panel, of_remove_panel, of_clear_menu, of_add_menu_separator mit einem unbekannten Bereich; of_add_menu_item / of_insert_menu_item unter einem unbekannten Bereich oder mit einem vergebenen Eintrag; of_remove_menu_item, of_move_menu_item mit einer unbekannten Adresse | 0, ignoriert | -5 | |
statusbar: of_insert_panel(…, 0) | am Ende der Leiste angefügt | an erster Stelle, wie jede Position (0 oder weniger = zuerst) | |
statusbar: ein Trenner (of_add_sep) in of_count, of_keys_at und den Positionen von of_insert_panel / of_move_panel | als Bereich mit leerem Schlüssel gezählt | ignoriert: eine Position zählt Bereiche | |
statusbar: ein Trenner zwischen zwei ALIGN_END-Bereichen | am Ende der Anfangsgruppe gezeichnet | zwischen beiden: er eröffnet die Gruppe des folgenden Bereichs | |
| statusbar: Rechtsklick auf einen nicht anklickbaren Bereich | kein Ereignis | ue_panel_rclicked (ein deaktivierter Bereich bleibt stumm) | |
statusbar: of_panel(k).ii_progress auf einem Bereich ohne Balken gelesen | 0, wie ein Balken auf 0 % | -1 | |
statusbar: of_menu_item("k"), eine Adresse mit einer Ebene | schrieb in den Bereich k (ib_enabled graute ihn aus) | bezeichnet nichts: schreibt nirgendwohin, liest leer | |
statusbar: Farben und Tooltip eines Bereichs nach of_clear, dann ein unter demselben Schlüssel hinzugefügter Bereich | vom neuen Bereich übernommen | vergessen: der Bereich beginnt sauber | |
statusbar: is_state in einem dunklen Design; deaktivierter Bereich | Farben des hellen Designs, schlecht lesbar; durch Transparenz ausgegraut, Hintergrund beim Überfahren verloren | eine lesbare dunkle Palette; durch die Designfarbe ausgegraut, Hintergrund bleibt | |
| statusbar: ein Bereich, dessen Listeneinträge alle ausgeblendet sind | Handzeiger und Pfeil, Klick ohne Wirkung | ein gewöhnlicher Bereich, anklickbar oder nicht je nach ib_clickable | |
| statusbar, toolbar: Pfeiltasten Links / Rechts bei Leserichtung von rechts nach links (RTL) | verkehrt herum: Rechts ging zur linken Bildschirmseite | in Bildschirmrichtung, wie Register und Menüband | |
stepbar: ii_current setzen | es wurde nichts ausgelöst | ue_step_changed, wenn sich die Leiste bewegt, wie die Dokumentation es versprach | |
| stepbar: einen Schritt vor dem aktuellen entfernen, einfügen oder verschieben | der aktuelle Schritt wechselte stillschweigend (es war ein Rang) | derselbe Schritt bleibt aktuell; wird genau er entfernt, geht die Leiste zum nächsten erreichbaren und löst ue_step_changed aus | |
stepbar: ii_current vor den Schritten gesetzt; of_clear_steps | auf den ersten Schritt zurückgesetzt; der aktuelle Schritt überlebte das Leeren | beibehalten und angewendet, sobald der Schritt existiert; das Leeren beginnt wieder beim ersten Schritt | |
stepbar: of_add_step / of_insert_step mit einem vergebenen Schlüssel oder einem mit / oder senkrechtem Strich; of_move_step, of_remove_step mit einem unbekannten Schlüssel | 0, ignoriert | -5 | |
stepbar: of_insert_step(…, 0) | am Ende der Leiste angefügt | an erster Stelle eingefügt, wie jede Position der Bibliothek (of_add_step fügt am Ende an) | |
| stepbar: Pfeiltasten links / rechts in einer Rechts-nach-links-Sprache | der Rechtspfeil ging zum nächsten Schritt, der links gezeichnet ist | vertauscht: der Linkspfeil geht zum nächsten Schritt | |
tab: of_add_page / of_insert_page mit einem Schlüssel mit / oder senkrechtem Strich; ein fehlgeschlagenes Senden | 0; die Seite blieb gehostet und ihr Schlüssel vergeben | -5; ein fehlgeschlagenes Senden liefert seinen Code, die Seite kehrt in ihr Fenster zurück und der Schlüssel bleibt frei | |
tab: of_select_page einer ausgeblendeten, deaktivierten oder jenseits der Demo-Grenze liegenden Seite | 0, und die Seite erschien unter einer Leiste ohne aktive Registerkarte | -5, nichts bewegt sich | |
tab: Kreuz, Tastenkürzel (is_shortcut), „Alle / andere / rechts schließen“ auf einer deaktivierten oder ausgeblendeten Registerkarte | die Registerkarte wurde aktiviert oder geschlossen, und PB gab ihre Seite frei | ohne Wirkung: eine Registerkarte, die man weder sehen noch erreichen kann, wird weder aktiviert noch geschlossen | |
| tab: die aktive Registerkarte wird geschlossen, entfernt oder ausgeblendet | die nächste oder die erste übernahm, auch ausgeblendet oder deaktiviert; as_from_key von ue_selection_changed war leer | die auswählbare Nachbarin übernimmt (rechts, sonst links); as_from_key nennt die wirklich verlassene Registerkarte, auch wenn sie weg ist | |
| tab: keine sichtbare Registerkarte mehr (alle ausgeblendet oder eine Anordnung, die sie ausblendet) | die Seite der alten Registerkarte blieb sichtbar, ohne Ereignis | die Seite wird verborgen und ue_selection_changed(alt, "") ausgelöst; eine wieder eingeblendete Registerkarte wird ausgewählt | |
tab: ein nach of_remove_page oder einem Schließen gehaltenes Handle; sein Tastenkürzel | blieben; eine unter demselben Schlüssel wieder geöffnete Seite bekam Farbe, Tooltip und altes Tastenkürzel zurück | freigegeben: IsValid() gibt false zurück, die Seite kommt neu zurück | |
tab: of_set_layout mit einem Text, der kein JSON ist | 0, und die Nachricht ging kaputt hinaus | -5, nichts wird gesendet | |
| tab: Tastatur in der Registerleiste | Eingabe verlor den Fokus; die Pfeile blieben auf deaktivierten oder verdrängten Registerkarten stehen; kein Oben/Unten bei senkrechter Leiste und keine Umkehrung bei Schreibrichtung von rechts nach links | der Fokus bleibt auf der Registerkarte; die Pfeile folgen der Achse der Leiste und überspringen, was nicht antwortet; Entf schließt eine schließbare Registerkarte | |
| tab: Text einer deaktivierten Registerkarte; Tooltip einer Registerkarte mit gekürztem Titel | als Ganzes verblasst (beim Überfahren in office2007 dunkel unlesbar); der native volle Name verdeckte Ihren Tooltip | Text in der Deaktiviert-Farbe des Themas, lesbar; Ihr Tooltip hat Vorrang | |
tilesbox: of_get_layout | lieferte immer "": eine gespeicherte Anordnung wurde nie wiederhergestellt | die gesamte Anordnung, derselbe Text wie ue_layout_changed; sie behält auch Größe und Sichtbarkeit jeder Kachel und die Sichtbarkeit jeder Gruppe | |
tilesbox: of_set_layout, das eine Kachel unter einer anderen als ihrer Gruppe nennt; ein Text, der kein JSON ist | die erste Kachel mit diesem Schlüssel, in beliebiger Gruppe, wurde dorthin verschoben; 0 | eine Kachel wird über ihre Gruppe und ihren Schlüssel wiedergefunden: der Eintrag wird ignoriert; -5 bei einem Text, der kein JSON ist | |
tilesbox: of_add_group mit einem bereits vergebenen Schlüssel; of_add_tile / of_insert_tile mit einem vergebenen Schlüssel oder unter einer nie hinzugefügten Gruppe; ein leerer Schlüssel oder einer mit / oder ` | ` | 0; eine erneut hinzugefügte Gruppe wurde umbenannt, eine Kachel unter einer unbekannten Gruppe legte diese unter ihrem Schlüssel an | -5, nichts wird hinzugefügt: fügen Sie zuerst die Gruppe mit of_add_group hinzu |
tilesbox: of_move_tile, of_remove_tile, of_add_live_item, of_clear_live_items für eine nicht vorhandene Kachel; of_remove_group für eine nicht vorhandene Gruppe | 0 | -5 | |
tilesbox: ein Handle, das nach of_remove_tile, of_remove_group, of_clear oder dem Ziehen einer Kachel in eine andere Gruppe gehalten wird | blieb im Speicher; eine unter derselben Adresse neu erzeugte Kachel übernahm Farben und QuickInfo der alten, eine gezogene Kachel verlor sie | das Handle wird freigegeben (erneut mit of_tile / of_group anfordern); Farben und QuickInfo folgen der gezogenen Kachel und gehen mit dem Entfernten | |
statusbar, stepbar, crosstab: ein Handle, das nach of_remove_panel, of_remove_menu_item, of_clear_menu, of_clear (statusbar), of_remove_step, of_clear_steps (stepbar), of_remove_calc_field oder of_remove_calc_measure (crosstab) gehalten wird | blieb bis zur Zerstörung der Komponente im Speicher | freigegeben: IsValid() liefert false; erneut mit of_panel, of_menu_item, of_step oder of_field anfordern | |
Alle Komponenten mit Elementen: il_back_color_hover / il_text_color_hover eines nie eingefärbten Elements zurücklesen | 0, Schwarz | -1, „die Farbe des Themes“, wie die drei anderen Elementfarben | |
tilesbox: ib_enabled / ib_visible einer Gruppe oder ii_badge_size zurücklesen | false, false, 0, egal was gesetzt wurde | der geltende Wert | |
tilesbox: deaktivierte Gruppe (ib_enabled = false) | ihre Kopfzeile klappte sie noch ein (Klick, Eingabe) und löste ue_group_toggled aus; eine gezogene Kachel konnte darin landen | inaktiv: kein Einklappen, kein Ereignis, kein Ablegen | |
tilesbox: Item-Farben (il_back_color, il_text_color, il_accent…) auf einer Gruppe | ohne Wirkung; die Farbe einer Gruppe a konnte eine Kachel a einer anderen Gruppe färben | sie färben die Kopfzeile der Gruppe (Hintergrund, Titel, Überfahren, Akzentlinie), nie ihre Kacheln | |
tilesbox: of_tile("") oder eine Adresse mit einer oder drei Ebenen | das Setzen einer Eigenschaft beendete die Anwendung („Array boundary exceeded“) oder schrieb auf die Gruppe | ein wirkungsloses Handle: es schreibt nichts und liest sich leer | |
| tilesbox: Tastatur und Bildschirmleser | der Fokus ging bei jeder Aktualisierung aus PB (ein Badge) verloren und das Größenmenü schloss sich; Größenmenü nur per Maus; in RTL Pfeile verkehrt herum; Beschriftungen mit ihren Tags vorgelesen | Fokus und Menü bleiben erhalten; Größenmenü per Tastatur (Pfeile, Eingabe, Esc); Pfeile in Leserichtung; reiner Text | |
toaster: il_max_visible | Standard 5, von JEDEM Toaster gesendet: ein Toaster, der 10 gesetzt hatte, fiel auf 5 zurück, sobald ein anderer einen Toast zeigte | Standard 0 = nichts wird gesendet; die Obergrenze gilt für die ganze Anwendung, der zuletzt gesetzte Wert gilt (5, solange niemand sie setzt) | |
toaster: of_show eines Toasts, der auf Platz wartet | lieferte 0: der Toast ließ sich nicht mit of_close schließen, und seine Events trugen eine nie erhaltene Kennung; volle Warteschlange (200): ebenfalls 0, Toast wortlos verloren | eine echte Kennung, sofort; of_close nimmt ihn aus der Warteschlange; volle Warteschlange: -4 | |
toaster: zwei Toasts ohne is_key mit einer Schaltfläche gleichen Schlüssels | der zweite ERSETZTE den ersten (der Schaltflächenschlüssel wurde für den des Toasts gehalten), und of_show lieferte die Kennung des ersten | zwei Toasts, zwei Kennungen; nur is_key aktualisiert an Ort und Stelle | |
| toaster: Events mehrerer Toaster | nach FENSTER abgelegt: zwei am selben Fenster verankerte Toaster nahmen sich gegenseitig die Events, und die eines zerstörten Toasters gingen an den nächsten | jeder Toaster erhält die SEINER Toasts; ein zerstörter Toaster erhält nichts mehr, seine Toasts bleiben stumm sichtbar | |
toaster: pbm_custom02 des Fensters ipo_owner | das Ankerfenster erhielt bei jedem Toast-Event ein pbm_custom02, auch ohne ipo_receiver | nur ein in ipo_receiver gesetztes Fenster erhält es; falls Sie pbm_custom02 Ihres Fensters für die Toasts belegt hatten, setzen Sie ipo_receiver oder, besser, entfernen Sie diesen Code: die Events kommen von selbst | |
| toaster: Anzeige | ein Toast blieb stehen, wenn sich sein Fenster bewegte; ein Toast über 800 px (eine lange Fehlerspur) erschien NIE; Breite nicht skaliert (180 px bei 200 %); das Aktualisieren eines überfahrenen Toasts startete den ganzen Stapel neu | er folgt seinem Fenster; der Text rollt im begrenzten Toast; Breite bildschirmgerecht skaliert; der Stapel bleibt unter dem Zeiger pausiert | |
toolbar: Hinzufügungen, of_add_separator, of_move_item, of_remove_* bei vergebenem Schlüssel, mit / oder ` | `, unbekannter Leiste oder unbekannter Adresse | 0, ignoriert — ein Tippfehler im Namen einer Leiste erzeugte eine Phantomleiste | -5; nur main braucht kein of_add_bar |
toolbar: of_clear, of_remove_bar, of_remove_item | Handles blieben, Tastenkürzel blieben aktiv, und ein unter demselben Schlüssel neu erzeugtes Werkzeug bekam die Farben des alten zurück | Handles freigegeben, Tastenkürzel deaktiviert, Farben und Tooltips vergessen; fordern Sie nach dem Entfernen ein Handle neu an | |
toolbar: of_item mit einer dreistufigen Adresse (ein Menüeintrag) | wirkte auf das WERKZEUG der Leiste, das den Namen des Eintrags trug | bezeichnet nichts; ein Eintrag wird über of_menu_item(Adresse) gesteuert | |
| toolbar: Eintrag, gewählt in einem im Chevron eingeklappten Dropdown | ue_menu_selected ohne den übergeordneten Eintrag der Kaskade, unter einem anderen Dropdown oder leer | die vollständige Adresse, wie in der Leiste | |
toolbar: ii_index einer Leiste | verschob eine Leiste nie nach rechts | die Leiste nimmt den verlangten Rang ein | |
toolbar: of_add_bar(Schlüssel, Band, Rang) auf einem belegten Rang oder einem Band jenseits der anderen | unbestimmte Reihenfolge; das Band wurde so zurückgelesen, wie es gegeben war (5 für die zweite Zeile) | sie wird vor der Leiste eingefügt, die den Rang hatte; die Bänder rücken zusammen | |
toolbar: of_count, of_keys_at einer Leiste, Rang von of_move_item | zählten die Trenner mit, unter einem leeren Schlüssel | nur die Werkzeuge: ein Trenner hat weder Schlüssel noch Rang | |
| toolbar: Eingabetaste in einem Textfeld | bestätigte das Feld UND betätigte die Standardschaltfläche des Fensters | bestätigt nur das Feld; Escape stellt den bestätigten Text wieder her | |
toolbar: is_shortcut zurückgelesen; ii_band / ii_index einer unbekannten Leiste | ctrl+s (normalisiert); 1 | Ctrl+S, wie geschrieben; 0 | |
toolbar: Farbe oder Tooltip an einer LEISTE (of_bar) | wirkungslos, oder färbte das Werkzeug gleichen Namens | auf die Leiste angewandt, und nur auf sie | |
| toolbar: Tastenkürzel eines ausgeblendeten Werkzeugs oder eines jenseits der Demo-Grenze | verschluckte die Taste | die Taste geht an das nächste Werkzeug mit demselben Kürzel | |
webbrowser: eine Seite, die nicht lädt (unbekannter Host, Netzwerk, Zertifikat, of_stop) | löste ue_load_completed aus, wie ein Erfolg | löst stattdessen ue_load_failed(as_url, al_status) aus | |
webbrowser: Wörter in is_address („Rechnung 2026“) | gingen als https://Rechnung 2026 hinaus, danach fand keine Navigation mehr statt | mit ue_error abgelehnt, das Folgende lädt; eine Suche, wenn is_search_url gesetzt ist | |
webbrowser: ein Dateipfad (C:\temp\x.html) oder //host/x in is_address | mit https:// versehen, also nicht gefunden | file:///C:/temp/x.html; https://host/x; javascript: abgelehnt | |
webbrowser: is_address nach einem gefolgten Link oder Zurück zurückgelesen | die zuletzt gesetzte Adresse | die angezeigte Seite | |
webbrowser: of_go_back, of_go_forward, of_stop direkt nach is_address | konnten VOR der Adresse ausgeführt werden; of_stop ließ die wartenden Seiten wieder starten | laufen in der geschriebenen Reihenfolge; of_stop verwirft auch die wartenden Seiten | |
webbrowser: of_save_as_png, of_save_as_jpg, of_print_to_pdf, of_print | erfassten oder druckten die Adressleiste | die angezeigte Website | |
webbrowser: Link mit target=_blank, window.open nach einem Klick | nichts geschah | die Seite öffnet sich in der Ansicht, ue_new_window meldet es | |
webbrowser: Antwort von of_execute_javascript mit mehr als 4.095 Zeichen | stillschweigend abgeschnitten | vollständig | |
| webbrowser: F5, Strg+R, Strg+Mausrad in der Adressleiste | luden oder zoomten die Leiste selbst | wirkungslos in der Leiste; aktiv in der Website | |
webbrowser: Rechtsklick in ein Eingabefeld mit ib_context_menu | Zurück / Vorwärts / Aktualisieren | Ausschneiden / Kopieren / Einfügen | |
webbrowser: Tab oder of_focus_webview ohne Adressleiste; mit ib_allow_drop auf die Website gezogene Datei | Fokus in einer 0-px-Leiste verloren; Datei vom Browser geöffnet | der Fokus geht an die Website, Tab verlässt sie zu Ihrem Fenster; ue_drop_files | |
pdfviewer: is_source zurückgelesen, und as_source von ue_load_completed | die interne Adresse /_file/?p=… | das, was Sie geschrieben haben (doc\notice.pdf) | |
| pdfviewer: fehlende Datei, kein PDF, Website nicht erreichbar oder verweigert den Rahmen | ue_load_completed auf einer Fehlerseite, oder gar kein Event | ue_load_failed(as_source, as_reason) (Konstanten REASON_*), der Betrachter bleibt leer | |
pdfviewer: http://, data: eines anderen Typs als PDF, Webseite über https:// | angezeigt (oder ein leerer Rahmen bei http://) | abgelehnt: ue_load_failed mit REASON_INSECURE oder REASON_NOT_PDF | |
pdfviewer: ein # in is_source | schnitt den Pfad ab (Angebot #12.pdf nicht gefunden); das Fragment einer URL vermischte sich mit ii_page / ii_zoom | ein # gehört zum Dateinamen; das Fragment einer URL wird ignoriert, Seite und Zoom laufen über die Eigenschaften | |
pdfviewer: ii_page vor is_source gesetzt | verloren: das Dokument öffnete sich auf Seite 1 | für dieses Dokument beibehalten; ohne seit dem letzten is_source gesetzte Seite öffnet sich ein neues Dokument auf Seite 1 | |
pdfviewer: am selben Pfad neu erzeugtes PDF, dann of_refresh; PDF ab 32 MB; Pfad mit mehr als 260 Zeichen | die alte Version 5 Minuten lang; nichts; nicht gefunden | die Datei so, wie sie auf der Festplatte liegt; angezeigt (in Teilen ausgeliefert); angezeigt | |
pdfviewer: im Dokument gefolgter Link; of_print | die Website ersetzte das Dokument, ohne Rückweg; druckte die Seite, die das Dokument umrahmt | das Dokument bleibt, ue_link_clicked(as_url) liefert Ihnen die Adresse; of_print druckt das Dokument (-4 ohne Dokument) | |
picture, button, tilesbox: il_badge_color | 0 = die Farbe des Designs; Schwarz war unerreichbar; nicht gesetzt, las sich 0 | -1 = nicht gesetzt (die Farbe des Designs), wie jede andere Farbe; 0 ist Schwarz. Ersetzen Sie il_badge_color = 0 durch -1 | |
picture: id_zoom vor ib_zoomable gesetzt | las sich wie gesetzt, während das Bild eingepasst blieb | ignoriert: id_zoom bleibt 1.0, solange ib_zoomable falsch ist; setzen Sie ib_zoomable zuerst | |
picture: ib_mirror auf einem um eine Vierteldrehung gedrehten Bild; is_align / is_valign mit einer Drehung | senkrecht gespiegelt auf dem Bildschirm; die Platzierung drehte sich mit dem Bild | Spiegelung und Platzierung gelten auf dem Bildschirm, unabhängig von der Drehung | |
| picture: Ziehen des gezoomten Bildes; Mausrad; deaktiviertes Bild (deaktivierter statictext ebenso) | ue_clicked bei jeder Verschiebung; Zoom zur Mitte, das Bild konnte den Rahmen verlassen; abgelegte Dateien wurden weiter angenommen | kein Klick nach einer Verschiebung; Zoom zum Mauszeiger, das Bild deckt seinen Rahmen immer ab; deaktiviert lehnt es jedes Ablegen ab; ue_error nennt die Quelle | |
xml: ein Lesen (of_get_value, of_count, of_is_valid…) oder eine Änderung nach einem Bau | wirkte auf das zuletzt GELADENE Dokument oder auf nichts | das gebaute Dokument wird geladen und wird DAS Dokument; das nächste of_start_element beginnt ein neues | |
xml: fehlgeschlagenes of_load (leer, fehlerhaft), of_start_element nach einem Laden | das vorige Dokument blieb les- und änderbar (of_is_valid wahr); ein halb gebautes Dokument blieb in of_xml | nichts bleibt | |
xml: of_xml, of_pretty, of_get_values eines großen Dokuments | ab einigen MB stillschweigend abgeschnitten | vollständig | |
xml: of_get_value eines Wert-XPath (count(//line), sum(//@qty)) | leer | der Wert als Text (3, true) | |
| xml: ein XPath, dessen Präfix unterhalb der Wurzel deklariert ist (SOAP-Antwort) | leer ohne of_register_namespace | aufgelöst | |
xml: is_last_error nach einem ungültigen XPath, einer Seite ohne Antwort, einer Ablehnung; Codes von of_register_namespace / of_clear_namespaces | leer oder „no node matched“, gleich welche Ursache; Änderungen lieferten -4, wenn die Seite fehlte; immer 0; eine Seite ohne Antwort lieferte den Text null | der wahre Grund; -2, wenn die Seite nicht antwortet; eine leere URI wird abgelehnt (-5); leer statt null | |
xml: of_pretty | verlor CDATA, Kommentare, Verarbeitungsanweisungen und die XML-Deklaration und veränderte gemischten Text | alles bleibt erhalten; ein Element mit Text bleibt auf einer Zeile | |
| xml: Bauen — Zeilenumbruch oder Tabulator in einem Attribut, CR in einem Text, Steuerzeichen, ungültiger Name | verändert zurückgelesen; fehlerhaftes Dokument; Name unverändert geschrieben | identisch zurückgelesen; Steuerzeichen entfernt; Name abgelehnt (is_last_error), Element weggelassen | |
xml: ein Dokument mit einem Element <parsererror>; Meldung eines fehlerhaften XML | als fehlerhaft abgelehnt; Meldung umrahmt von „This page contains the following errors“ | geladen; nur die Fehlerzeile | |
xml: of_remove verschachtelter Knoten, der Wurzel, eines Attributs; of_set_value("/"); of_add_child unter einem Attribut | doppelt gezählt; leerte das Dokument; das Attribut blieb; 0 ohne Wirkung; „parent not found“ | die echte Anzahl; die Wurzel bleibt (0 und is_last_error); das Attribut wird entfernt; -4; „the node cannot have children“ | |
xml: of_close und dann ein Lesen; ipo_owner nach dem ersten Lesen gesetzt | das geladene Dokument war verloren; bis of_close ignoriert | das Dokument bleibt erhalten und wird neu geladen; beim nächsten Lesen übermittelt | |
Designs metro-light und metro-dark: Text auf der Akzentfarbe | Weiß auf dem Blau #25a0da in beiden Designs (Bereichsköpfe, aktive Registerkarte, Anwendungsschaltfläche des Menübands, Kacheln): schwer lesbar | metro-light: die Akzentfarbe wird das tiefere Blau #1b76a1, Text weiterhin weiß; metro-dark: die Akzentfarbe bleibt #25a0da, der Text darauf wird fast schwarz (#1b1b1b) | |
Designs office-dark, office2003-dark, office2003-light, office2007-light: Akzent- und Kopfzeilenfarben | im dunklen Modus war die Akzentfarbe auf der Seite schwer lesbar (Schrittpunkt, Plakette), ebenso weißer Text auf dem Hover der Akzentfarbe und den Spaltenköpfen des Crosstab; im hellen Modus war der obere Teil der Verläufe der Anwendungsschaltfläche und der Bereichsköpfe zu blass für weißen Text | office-dark: Akzent #1178d1, Hover #0f6cbd; office2003-dark: Akzent #4574cb, Hover #2f5aa8; Crosstab-Köpfe dunkler beim Hover und bei den Summen; office2003-light und office2007-light: tieferer Verlaufsanfang (#3e73cf, #4275c5), Bereichsköpfe von office2007-light deckender. Text weiterhin weiß, mindestens 4,5:1 | |
Text auf einer von der Anwendung gewählten Farbe (il_accent, Farbe eines Elements, Bereichskopf, Plakette) | Weiß bis zu einer recht hellen Farbe: ein mittleres Blau wie #25a0da erhielt weißen Text mit 2,95:1 | Weiß oder fast Schwarz (#1b1b1b), je nachdem, was besser lesbar ist (WCAG-Kontrastverhältnis): #25a0da erhält jetzt dunklen Text | |
jsontree: of_clear | leerte den Baum UND setzte ib_wrap und ib_search_enabled auf ihre Standardwerte zurück | leert nur den Baum; die Einstellungen bleiben (of_reset setzt alles zurück) | |
jsontree: is_json = "" | löste ue_error „Invalid JSON“ aus | leert den Baum ohne Fehler, wie die Dokumentation es versprach | |
jsontree: angezeigte Zahlen und Schlüssel, zurückgelesenes is_json | von der Engine umgeschrieben: 12345678901234567890 als 12345678901234567000 angezeigt, 1.10 → 1.1, der erste von zwei gleichen Schlüsseln verloren; is_json wurde komprimiert zurückgelesen und war nach ungültigem JSON leer | so wie empfangen, beide Schlüssel eingeschlossen; is_json wird genau so zurückgelesen, wie er gesetzt wurde | |
jsontree: of_match_count, al_count von ue_search_result | zählten ZEILEN; zwei Vorkommen in einer Zeile waren beide „aktuell“ | zählen VORKOMMEN, nur eines ist aktuell und of_search_next geht von einem zum anderen | |
| jsontree: von einer Suche geöffnete Blöcke | ALLE, die einen Treffer enthielten, dauerhaft: die Suche nach „e“ öffnete das ganze Dokument | nur die, die das AKTUELLE Vorkommen verbergen; of_clear_search stellt die Faltung von vor der Suche wieder her | |
jsontree: of_select_path | eine in einem eingeklappten Block verborgene Zeile blieb unsichtbar; ein unbekannter Pfad lieferte 0 | die Blöcke, die sie verbergen, klappen auf; ein unbekannter Pfad liefert -5 und die Auswahl bleibt | |
| jsontree: den Block einklappen, der die Auswahl enthält | die Auswahl wurde unsichtbar, und der nächste Pfeil begann wieder oben | die Auswahl geht auf den eingeklappten Block über; bei einer Benutzergeste meldet ue_selection_changed es | |
xmltree: of_clear | leerte den Baum UND setzte ib_wrap und ib_search_enabled auf ihre Standardwerte zurück | leert nur den Baum; die Einstellungen bleiben (of_reset setzt alles zurück) | |
xmltree: is_xml = "" | löste ue_error „Invalid XML“ aus und zeigte einen roten Fehler | leert den Baum ohne Fehler, wie die Dokumentation es versprach | |
xmltree: is_xml relu | vom Motor neu serialisiert: Anführungszeichen geändert, Zeilenumbrüche verloren, leer nach ungültigem XML | wird genau so zurückgelesen, wie er gesetzt wurde, auch ein ungültiger Text | |
| xmltree: ce qui s'affiche | ein CDATA war unsichtbar (das Element erschien leer), Kommentare, Verarbeitungsanweisungen und Deklaration fehlten, der Text gemischten Inhalts wurde vor den Kindern zusammengeklebt, ein Text um seine Leerzeichen gekürzt, ein Attributwert mit Anführungszeichen unverändert angezeigt | jeder Knoten an seinem Platz, in Dokumentreihenfolge; die Zeile bleibt XML (gewähltes Anführungszeichen oder ", , &, <); bedeutsame Leerzeichen bleiben | |
xmltree: of_match_count, al_count de ue_search_result | zählten ZEILEN; ein Treffer über zwei Stücke (id="4152") wurde gezählt, ohne hervorgehoben zu werden | zählen VORKOMMEN, jedes hervorgehoben, nur eines ist aktuell | |
| xmltree: éléments ouverts par une recherche | ALLE, die einen Treffer enthielten, dauerhaft | nur die, die das AKTUELLE Vorkommen verbergen; of_clear_search stellt die Faltungen von vor der Suche wieder her | |
xmltree: of_select_path | eine in einem eingeklappten Element verborgene Zeile blieb unsichtbar; ein unbekannter Pfad lieferte 0 | die Elemente, die sie verbergen, klappen auf; ein unbekannter Pfad liefert -5 und die Auswahl bleibt | |
xmltree: ue_selection_changed | auch ohne Änderung ausgelöst (Ende auf der letzten Zeile); das Einklappen des Elements mit der Auswahl machte sie unsichtbar, ohne Meldung | nur ausgelöst, wenn sich die Auswahl ändert; beim Einklappen springt die Auswahl auf das eingeklappte Element und das Ereignis meldet es | |
xmltree: ue_error | der Rohtext der Fehlerseite des Motors; ein <parsererror>-Element des Dokuments galt als Fehler | nur die Fehlerzeile („error on line N at column M: …“); ein <parsererror> des Dokuments ist ein Element wie jedes andere | |
| restclient: Cookies einer synchronen Anfrage | keine behalten: jedes of_get / of_post öffnete seine eigene Sitzung; ib_keep_cookies galt nur für asynchrone Aufrufe | eine Sitzung pro Objekt, gemeinsam für synchrone und asynchrone Aufrufe: eine synchrone Anmeldung hält Sie für die folgenden Aufrufe angemeldet | |
restclient: ib_keep_cookies nach der ersten Anfrage geändert | wirkungslos bis of_close | sofort wirksam; bei false werden die bisher behaltenen Cookies vergessen | |
| restclient: Umleitung auf einen anderen Host oder Port | nur Authorization, Cookie und die Basic-Authentifizierung entfielen: ein API-Schlüssel (X-Api-Key…) ging an den Dritten | keiner der mit of_set_header gesetzten Header folgt, nur Content-Type bleibt | |
restclient: of_set_bearer("") nach of_set_basic; of_set_basic dann of_set_bearer; of_set_basic("", "") | das Basic-Passwort wurde weiter gesendet; zwei Authorization gleichzeitig; Basic Og== gesendet | eine Authentifizierung zur Zeit: jede ersetzt die andere, ein leeres Token oder ein leerer Benutzer entfernt sie | |
restclient: HEAD oder eine 204/304-Antwort mit angekündigter Größe | -4 „connection lost“, und asynchron wiederholt | der Status (200, 304…) | |
restclient: ein Körper mit einem ungültigen Byte; charset=iso-8859-1 oder utf-16 | der ganze Körper als Windows-1252 neu gelesen; charset ignoriert | nur das ungültige Byte wird zu einem Ersatzzeichen; das angekündigte charset wird gelesen | |
| restclient: ein Textkörper von mehreren hundert MB | dreimal im Speicher gehalten: ein 32-Bit-Prozess konnte sterben | -4 „body too large : use of_download“ über 64 MB | |
| restclient: hundert asynchrone Anfragen auf einmal | hundert parallele Threads | höchstens sechs gleichzeitig, die weiteren warten | |
| restclient: eine asynchrone Anfrage, öfter als alle 50 ms gesendet (ein Telemetrie-Timer) | keine Antwort zugestellt, solange der Strom anhielt | die Antworten kommen laufend an | |
restclient: of_cancel einer unbekannten ID; einer Anfrage, deren Antwort da ist | -1; 0 (aber es kam ue_response) | -5; -4, zu spät | |
restclient: of_response_text() nach of_download; nach einem of_download(url, "") | die Anzahl geschriebener Bytes; die vorige Antwort | leer: dieser Körper liegt in der Datei; leer | |
restclient: eine asynchrone Antwort während ue_progress lesen | Speicher, der gerade geschrieben wird: möglicher Absturz | leer, of_status(id) = 0, solange die Anfrage läuft | |
video: Filmwechsel (is_source, of_play(source)) | Abschnitt, Untertitel, Marken und Kapitel des alten Films blieben | sie gehen mit ihm (vor jedem Film gesetzt, warten sie auf den ersten); ein Film der Wiedergabeliste behält seine Untertitel. Setzen Sie sie nach is_source | |
video: of_go_chapter, of_next_chapter, of_previous_chapter | lösten ue_seeked aus; of_go_chapter über die Kapitelzahl hinaus gab 0 zurück und tat nichts | ue_seeked und ue_chapter_changed, wie ein Klick auf die Leiste; -5 | |
video: of_add_source, während ein is_source gesetzt ist | die Liste startete nie, of_next ging zum ersten Film | der erste Eintrag lädt sofort (außer der gesetzte Film LÄUFT: dann folgt die Liste ihm an seinem Ende) | |
video: ue_started nach of_stop oder dem Filmende, dann of_play | nie: einmal pro Quelle | bei jeder neuen Wiedergabe (nicht beim Fortsetzen einer Pause) | |
video: of_play auf einem fehlerhaften Film; of_reset; ii_rate beim nächsten Film | für immer „läuft“, ohne Ereignis; der alte Film blieb geladen (of_duration, of_capture); zurück zur normalen Geschwindigkeit | erneut ue_failed; der Film wird entladen; die Geschwindigkeit bleibt | |
video: of_capture in eine nicht beschreibbare Datei; nach „\x“ oder „C:x“ | -4 (die Doku sagte -5); je nach aktuellem Ordner geschrieben | -4, und keine abgeschnittene Datei bleibt zurück; -5: geben Sie einen vollständigen Pfad an | |
| video: Vollbild, dann Alt+Tab zu einer anderen Anwendung | der Film blieb über allem | die andere Anwendung kommt nach vorn; die Rückkehr zu Ihrer legt den Film wieder über alles | |
| pdfviewer: ein einfacher Klick auf einen Link im PDF | nichts: nur Strg+Klick löste ue_link_clicked aus | ue_link_clicked(url), das Dokument bleibt angezeigt | |
webbrowser: eine data:-Seite (is_address = "data:text/html,…") | angezeigt, aber kein ue_load_completed | ue_load_completed mit der angeforderten Adresse | |
webbrowser: ein von der Website verlangtes neues Fenster zu file:, data: oder mailto: | in der Ansicht geöffnet, ue_new_window ausgelöst | abgelehnt: ue_error, kein ue_new_window; nur http und https werden geöffnet | |
| webbrowser: eine Website, die Kamera, Mikrofon, Standort, Benachrichtigungen verlangt | Browser-Rückfrage an den Benutzer, Antwort gespeichert | abgelehnt, sofern ue_permission_requested nicht true zurückgibt; nichts wird gespeichert | |
| webbrowser: Cookies, Sitzungen und Speicher der Websites | im mit den Komponenten geteilten Profil | in einem eigenen Browserprofil: Eine unter 3.0 angemeldete Sitzung wird nicht übernommen (einmal neu anmelden); of_clear_browsing_data löscht sie | |
webbrowser: is_search_url ohne %s, ohne http(s):// oder als javascript: | angenommen: jede Suche schlug fehl oder verlor den eingegebenen Text | abgelehnt: ue_error, die bisherige Suchmaschine bleibt | |
webbrowser: gestion/ oder [::1]/x in is_address | „keine Adresse“ (oder eine Suche) | https://gestion/, https://[::1]/x; das Wort allein bleibt Text | |
webbrowser: Rechtsklick auf eine Auswahl, einen Link, ein Bild mit ib_context_menu | nur Zurück / Vorwärts / Neu laden | zusätzlich: Kopieren, Link öffnen, Linkadresse kopieren, Bild kopieren | |
tab: schließbarer Reiter deaktiviert (ib_enabled = false) | das Kreuz verschwand, sein Platz blieb leer | weder Kreuz noch leerer Platz: der Reiter ist so breit wie ein nicht schließbarer | |
video: of_chapters bei einem Titel mit ` | ` oder Tabulator | in zwei Kapitel zerteilt | unverändert gelesen |
video: eine .srt in Windows-1252 oder UTF-16 | unlesbare Akzente; gar kein Untertitel | korrekt gelesen | |
commandpalette: of_open ohne WebView2-Laufzeit; toaster: of_show ohne Laufzeit | -1 | -6, wie die Meldungsbox | |
crypto, xml, restclient: of_open, wenn Seite oder Client nicht erzeugt werden können | der rohe Code der DLL (-1, -3…) | -2, und is_last_error sagt, warum |
Falls Sie einen dieser Fehler umgangen hatten — etwa indem Sie ue_menu_selected mit leerer Adresse behandelten, um die Klicks einer zusammengeklappten Gruppe abzufangen —, entfernen Sie die Umgehung: das dokumentierte Ereignis kommt jetzt an.
11.4 Der Generator n_pbt_menu2ribbon #
In 3.0 verwendete der von n_pbt_menu2ribbon geschriebene Code Handle-Methoden, die es nicht mehr gab: er kompilierte nicht ohne Nacharbeit. In 4.0 schreibt er die aktuelle API — jedes Hinzufügen über seine Adresse, über die Komponente —, übernimmt Untermenüs in jeder Tiefe, behält ausgegraute und abgehakte Einträge bei, und sein Router deckt ue_clicked, ue_toggled und ue_menu_selected ab. Die Schlüssel ändern sich: jeder ist jetzt der ClassName des Menüeintrags (m_fichier/g1/m_ouvrir) statt des Punktpfads (m_principal.m_fichier.m_ouvrir).
Das Rezept: Ein bereits von Hand oder aus erzeugtem und dann korrigiertem Code aufgebautes Menüband muss nichts ändern. Um erneut vom Generator auszugehen, starten Sie ihn neu und fügen Sie auch den neuen Router ein: der alte las Punktschlüssel.
11.5 Was hinzugekommen ist #
Nichts davon verlangt eine Änderung Ihres Codes. Die neuen Komponenten der 4.0 werden in den Versionshinweisen vorgestellt.
| Objekt | Hinzugefügt |
|---|---|
| ribbon | of_add_menu_separator akzeptiert die Adresse eines Eintrags: der Strich kommt in die Kaskade darunter |
| ribbon | of_add_menu_item und of_add_menu_check akzeptieren eine Kaskade beliebiger Tiefe, und jede Ebene wird über of_menu_item(adresse) gesteuert |
| menubar | of_add_separator nimmt die Adresse eines Eintrags (file/export): die Linie kommt in seine Kaskade; of_menu(...) trägt die Farben (il_accent, il_back_color…) und den Tooltip des Titels |
| crosstab | of_set_label_filter(as_field, as_type, as_a, as_b) für Text (LABEL_CONTAINS, LABEL_BEGINS, LABEL_ENDS) und die Konstanten LABEL_GT, LABEL_LT, LABEL_BETWEEN: die Form mit zwei double konnte nur eine Zahl übergeben |
| crypto | KEYFORMAT_TEXT, KEYFORMAT_HEX, KEYFORMAT_BASE64 und eine Überladung von of_hmac, of_jwt_sign und of_jwt_verify, die sie annimmt (ein Schlüssel als BYTES: kodiert geliefertes Geheimnis, AWS SigV4); eine optionale Entropie für of_protect und of_unprotect |
| crypto | of_hmac_verify (ein empfangener HMAC — Webhook — in konstanter Zeit verglichen); of_jwt_header und eine Überladung von of_jwt_sign, die dem Header Mitglieder hinzufügt (kid); of_totp_verify(…, ref al_step), der angenommene Schritt, um einen bereits benutzten Code abzulehnen; il_password_hash_rounds |
| messagebox | of_get_last_error(): warum sich das letzte Dialogfeld nicht öffnen ließ (leer, wenn es sich geöffnet hat) |
| n_pbt_utils | of_dir_has_subfolders(as_dir, ab_include_hidden): dieselbe Frage, die auch verborgene und System-Ordner sowie Junctions zählt |
| n_pbt_utils | of_dw_date_order(): die Reihenfolge, in der ein DataWindow auf diesem Rechner ein Datum schreibt (dmy, mdy, ymd) |
| speechout | of_is_paused(): wahr, solange das Lesen pausiert ist |
| Rich Text | das Tag [symbol=name]: achtzehn einfarbige Symbole, die der Textfarbe folgen (Kapitel 4) |
| toolbar | of_menu_item(Adresse) → n_pbt_toolbar_menu_item: jeder Eintrag eines Dropdown-Menüs hat seinen Zustand (ib_enabled, ib_visible, ib_checked, is_text, is_shortcut), bezeichnet durch seine vollständige Adresse |
| toolbar | is_date an einer Datumsauswahl; of_clear_menu; of_remove_item eines Menüeintrags; of_add_menu_separator an einem Eintrag (Kaskade); Kaskaden beliebiger Tiefe |
| pdfviewer | ue_load_failed(as_source, as_reason) und die Konstanten REASON_*; ue_link_clicked(as_url); file:///-Adressen; ib_allow_save und ib_allow_print: die Befehle Speichern und Drucken der Leiste des Betrachters |
| picture | is_alt_text (Alternativtext für Bildschirmleser); eine Tastatur für den Zoom: +, -, 0 und die Pfeiltasten zum Verschieben; n_pbt_utils.of_json_get_str_array |
| webbrowser | is_search_url (Suchmaschine für Wörter, die keine Adresse sind); ib_veto_new_window und ue_new_window; ib_veto_downloads und ue_download_starting; ue_load_failed; ue_error; of_show_html; of_clear_browsing_data und ib_private; ib_veto_navigation und ue_navigating; is_title und ue_title_changed; ue_permission_requested und die Konstanten PERMISSION_*; die Konstanten LOADSTATUS_* von ue_load_failed; F5, Strg+R, Alt+Pfeile und Esc in der Adressleiste |
| jsontree | of_selected_text liefert den DEKODIERTEN Wert des ausgewählten Blatts (eine Zeichenkette ohne Anführungszeichen und Maskierungen); of_has_selection unterscheidet die Wurzel, deren Pfad "" ist, von „nichts ausgewählt“; die Tastatur überspringt schließende Klammern (sie werden nicht mehr ausgewählt) |
| xmltree | jedes Attribut ist ein Ziel: ein Klick gibt seinen Pfad (/order/@id), of_select_path wählt es aus, of_selected_value liefert seinen Wert; ein großes Dokument zeichnet nur die Zeilen auf dem Bildschirm (8.000 Geschwisterelemente: 12 s → 0,15 s, eine Pfeiltaste in wenigen ms) |
| video | ue_muted_changed(ab_on): der Benutzer hat den Ton stumm- oder wieder eingeschaltet (Lautsprecher der Leiste, Taste M), wie Lautstärke und Geschwindigkeit schon ihr Ereignis hatten |
| ribbon | of_remove_menu_item, of_clear_menu, of_remove_combo_item, of_clear_combo, of_remove_gallery_item, of_remove_app_menu_item, of_remove_contextual_group: das Entfernen unter einem Steuerelement — eine Liste „Zuletzt verwendet“ wird aktualisiert, ohne das Steuerelement neu anzulegen |
| ribbon | of_app_menu_item(adresse): das Handle eines Eintrags des Anwendungsmenüs (is_label, is_image, ib_enabled, ib_checked, ib_visible); of_app_menu_item("") durchläuft das Menü |
| ribbon | Zugriffstasten aus mehreren Buchstaben (is_keytip = "FP"), nacheinander getippt; zugängliche Namen (Schnellzugriffsleiste, Kacheln) für Sprachausgaben |
| toolbar | of_add_split_button: eine geteilte Schaltfläche (Aktion + Menü); is_group: sich ausschließende Umschalter (Ausrichtung); is_image auf einem Werkzeug und einem Menüeintrag; ue_item_rclicked(Adresse): der Rechtsklick auf ein Werkzeug |
11.6 Namen und Zählweisen an die übrige Bibliothek angeglichen #
Sieben Stellen sprachen anders als der Rest der Bibliothek. Die 4.0 gleicht sie an, statt die Abweichung zu behalten: zwei Namen ändern sich — der Compiler zeigt Ihnen jede anzupassende Zeile —, der vom JSON-Baum gelieferte Pfad wird der von n_pbt_json, der des XML-Baums unter einem Standard-Namensraum ein funktionierender XPath, zwei Zählweisen beginnen nun bei 1, wie jede Position im Produkt, und ein Umgebungsereignis wird optional. Es sind die einzigen Änderungen der 4.0, die verlangen, Code anzufassen, der bisher kompilierte.
| Was | 3.0 | 4.0 |
|---|---|---|
| progressbar: Grenzen der Skala | il_minimum, il_maximum, long-Werte | id_minimum, id_maximum, double-Werte: eine Skala 0..1 oder eine Byteanzahl über 2 GB ist gültig; das Präfix nennt den Typ |
| json: Array-Index in einem Pfad | ab 0: lines/0 ist die erste Zeile | ab 1: lines/1 ist die erste Zeile; lines/0 bezeichnet nichts — ein Lesen findet es abwesend, ein Schreiben liefert -5 |
jsontree: Pfad eines Knotens (ue_node_clicked, ue_selection_changed, of_selected_path, of_select_path) | Ebenen durch einen Punkt verbunden, Array-Index ab 0: lines.0.sku — ein Dialekt, den n_pbt_json nicht las | der Pfad von n_pbt_json: Ebenen durch / verbunden, Index ab 1 (lines/1/sku), "" für die Wurzel — unverändert an of_get_string auf demselben Text zu übergeben |
xmltree: Pfad eines Elements unter einem STANDARD-Namensraum (xmlns="urn:…") | /Envelope/Body — ein XPath, der nichts findet | /*[local-name()='Envelope']/*[local-name()='Body'] — unverändert an n_pbt_xml.of_get_value zu übergeben; ein Element ohne Namensraum oder mit Präfix behält seinen Pfad |
toolbar: band und index der Anordnung (of_get_layout, of_set_layout, ue_layout_changed) | ab 0, eine als „undurchsichtig“ bezeichnete Zeichenkette, während ii_band, ii_index und ue_bar_reordered ab 1 zählten | ab 1, wie ii_band, ii_index und ue_bar_reordered; ein Hin und Zurück Lesen → Wiederherstellen liefert dieselbe Zeichenkette |
statictext: ue_cycle | bei jeder Laufschrift-Schleife ausgelöst, ohne Abonnement — und auch von einer Animation innerhalb des Textes | ein Umgebungsereignis, daher optional: nur ausgelöst, wenn ib_track_cycle = true, wie ue_mouse_enter mit ib_track_mouse; nur bei jedem vollständigen Durchlauf des Textes |
tilesbox: 2. Argument von ue_tile_moved | as_to_keys, obwohl es EINEN Schlüssel trägt: die Zielgruppe | as_to_key: der Name sagt, was es trägt, wie überall sonst (as_key = eine Ebene, as_keys = eine Adresse) |
restclient: ue_failed | ue_failed (long al_id, string as_error) | ue_failed (long al_id, long al_code, string as_error): -4 Fehlschlag, -5 URL oder Datei — kein Auswerten des Textes mehr |
restclient: of_json_value | ein Schlüssel, erstes Vorkommen in beliebiger Tiefe; nur ein Textwert — eine Zahl lieferte den Namen des nächsten Schlüssels | ein n_pbt_json-Pfad ("json/customer", "items/1/qty"), jeder Wert: "4152", "true". Ein verschachtelter Schlüssel wird mit seinen Eltern benannt |
Das Rezept: (1) neu kompilieren — der Compiler meldet il_minimum, il_maximum und as_to_keys: benennen Sie sie in id_minimum, id_maximum und as_to_key um; (2) suchen Sie json-Pfade, die ein Array ansprechen, und addieren Sie 1 zu jedem Index — eine Schleife for i = 0 to n - 1 über "lines/" + String(i) wird zu for i = 1 to n; (3) eine von der 3.0 gespeicherte Toolbar-Anordnung zählt ab 0: addieren Sie 1 zu band und index jeder Leiste, bevor Sie sie an of_set_layout übergeben, oder lassen Sie den Benutzer einmal neu anordnen — unverändert eingelesen würde sie ihre ersten beiden Bänder zusammenlegen; (4) wo ue_cycle geskriptet ist, setzen Sie beim Aufbau ib_track_cycle = true; (5) wo Sie einen Pfad aus dem JSON-Baum lasen (ue_node_clicked, of_selected_path) oder einen übergaben (of_select_path), ersetzen Sie die Punkte durch / und addieren Sie 1 zu jedem Array-Index — aus lines.0.sku wird lines/1/sku, das unverändert an n_pbt_json.of_get_string geht.
11.7 Die Designs folgen der Anwendung #
Die Überprüfung der Designs lässt jede Komponente die Regel einhalten, die Kapitel 4 bereits ankündigte: die Anwendung bestimmt Design und Akzent, eine Komponente weicht nur so weit ab, wie man es von ihr verlangt. Keine Methode wird umbenannt; die Änderungen zeigen sich am Bildschirm, beim Zurücklesen der Eigenschaften und in zwei Rückgabewerten.
| Was | 3.0 | 4.0 |
|---|---|---|
PBT_SetDefaultTheme | ein Designwechsel löschte den mit PBT_SetDefaultThemeAccent gesetzten Akzent — selbst beim erneuten Setzen desselben Designs — und machte den Verlaufshintergrund von office2007 und office2003 flach | der Akzent der Anwendung bleibt von einem Design zum nächsten erhalten; jedes Design behält seinen Hintergrund |
PBT_GetDefaultThemeAccent | den Akzent des Designs, wenn die Anwendung keinen gesetzt hatte | -1, solange die Anwendung keinen Akzent gesetzt hat |
| native Rückgabewerte | PBT_SetDefaultTheme mit einem unbekannten Namen lieferte 0 und ließ die folgenden Komponenten ohne Design; PBT_SetDefaultThemeAccent mit einer PowerBuilder-Systemfarbe malte sie schwarz | -5 in beiden Fällen; das vorherige Design bzw. der vorherige Akzent bleibt |
| eine allein gesetzte Designachse | fror die andere Achse auf dem Design der Anwendung zu diesem Zeitpunkt ein | die leere Achse folgt dem Design der Anwendung bei jeder seiner Änderungen; beide Achsen leer = vollständig das Design der Anwendung |
is_theme_style · is_theme_mode · il_theme_accent | wurden als "", "" und -1 gelesen, egal was gesetzt war | der angezeigte Stil und Modus sowie der eigene Akzent der Komponente (-1, wenn sie keinen hat) |
ein unbekannter ("office2010") oder falsch geschriebener Achsenwert (" Metro ") | die Komponente verlor ihr Design und hörte bis zum of_reset() nicht mehr auf das der Anwendung | Leerzeichen und Groß-/Kleinschreibung werden ignoriert; ein unbekannter Wert wird ignoriert und die Achse behält ihren Wert |
| Akzent einer Komponente mit lokalem Design | sie behielt den Akzent ihres Designs, selbst wenn die Anwendung einen setzte | sie folgt dem Akzent der Anwendung, solange sie keinen eigenen hat |
| ein eigener Akzent | nur der Akzent änderte sich: Hover und Gedrückt der Akzent-Schaltflächen, getönte Auswahlen, angehakte Menüband-Schaltflächen behielten den Akzent des Designs | alles vom Akzent Abgeleitete folgt ihm |
tilesbox : il_badge_color | 0 und -1 = die Farbe des Designs; ohne gesetzte Farbe als 0 gelesen; Schwarz war unerreichbar | -1 = die Farbe des Designs (als -1 gelesen); 0 ist Schwarz, wie bei allen Farben |
eine PowerBuilder-Systemfarbe (ButtonFace…) in il_theme_accent | schwarz gemalt | als -1 gezählt: der Akzent der Anwendung |
webbrowser · pdfviewer | fremde Inhalte folgten dem Hell/Dunkel-Modus von Windows, und vor ihrer ersten Anzeige erschien ein weißes Rechteck | sie folgen dem Standarddesign der Anwendung, auf dem Hintergrund des Designs (4.11) |
| Akzent von office-dark und office2003-dark | ein dunkles Blau, mit 3:1 lesbar, wenn es Text färbte (Links, [accent]) | ein helleres Blau (#479ef5, #7ea1e8), mit dunklem Text darauf |
datagrid: Linien zwischen den Zeilen | in acht von zehn Themes nicht vorhanden | in allen zehn Themes vorhanden, in der Rasterfarbe des Themes |
| hoher Kontrast von Windows | einfarbige Symbole und als Schatten gezeichnete Ringe verschwanden | unterstützt (4.10) |
Das Rezept: (1) wenn Sie den Akzent nach jedem PBT_SetDefaultTheme neu setzten, ist das nicht mehr nötig — und wenn Sie sich darauf verließen, dass ein Designwechsel den Akzent löscht, rufen Sie PBT_SetDefaultThemeAccent(-1) auf; (2) prüfen Sie den Rückgabewert von PBT_SetDefaultTheme, wenn der Name aus einer Eingabe oder einer Datei stammt; (3) wo Sie beide Achsen auf jeder Komponente setzten, um der Anwendung zu folgen, lassen Sie sie leer; (4) eine Kachel, deren Plakette mit il_badge_color = 0 „zum Design“ zurückkehrte, schreibt sich jetzt -1.
11.8 crypto: was die Sicherheit jetzt ablehnt, und wohin relative Pfade gehen #
Die Sicherheitsüberprüfung von crypto schließt eine echte Tür — ein mit dem ÖFFENTLICHEN Schlüssel gefälschtes JWT ging durch, wenn der Algorithmus fehlte — und ersetzt mehrere stille Fälle durch eine Ablehnung, die ihren Grund nennt. Keine Methode wird entfernt; eine ECDSA-Signatur ändert ihre Form, und die relativen Dateipfade folgen einer einzigen Regel.
| Was | 3.0 | 4.0 |
|---|---|---|
of_jwt_verify, of_jwt_sign | ein LEERER Algorithmus galt als JWT_HS256, und ein PEM-Schlüssel wurde als HS256-Geheimnis angenommen: mit dem ÖFFENTLICHEN Schlüssel als Geheimnis geprüft, ging ein gefälschtes Token durch; der Algorithmus des Headers wurde ohne Groß-/Kleinschreibung verglichen, ein crit-Header ignoriert | der Algorithmus ist PFLICHT und wird GENAU verglichen; ein PEM-Schlüssel ist nie ein HMAC-Geheimnis (auch bei of_hmac); crit wird abgelehnt — leere Zeichenkette und is_last_error |
of_jwt_sign | ein in den Claims angegebenes exp wurde stillschweigend durch die Dauer al_expires_seconds ersetzt | beides zugleich wird abgelehnt: eines von beiden behalten |
of_encrypt, of_decrypt | ein LEERES Passwort verschlüsselte — jeder konnte den Wert zurücklesen | abgelehnt, wie of_encrypt_file es schon tat; of_password_hash("") bleibt erlaubt |
il_pbkdf2_rounds | ein Wert außerhalb von 1.000 bis 10.000.000 fiel stillschweigend auf 100.000 zurück | der Aufruf wird ABGELEHNT: leere Zeichenkette bei einem Text, -5 bei einer Datei, und is_last_error nennt die Grenzen |
of_password_hash | il_pbkdf2_rounds (100.000 Runden) | il_password_hash_rounds, standardmäßig 600.000 (die OWASP-Zahl); bereits gespeicherte Werte tragen ihre Runden und lassen sich weiter prüfen |
of_base64_decode, of_base64url_decode, of_hex_decode, of_decrypt… | Bytes, die kein Text sind (ein PDF, ein Bild), kamen als Ersatzzeichen zurück, ohne Fehler | leere Zeichenkette und is_last_error, das auf of_base64_decode_to_file oder of_decrypt_file verweist |
of_sign (EC-Schlüssel) | eine IEEE-P1363-Signatur (64 Bytes), die openssl dgst und Java ablehnen | eine DER-Signatur; of_verify liest beide Formen, eine bereits gespeicherte Signatur lässt sich weiter prüfen; das ES256-JWT bleibt in P1363 |
of_totp_code, of_totp_verify | ein Nicht-Base32-Zeichen im Geheimnis (eine 0 statt eines O) wurde stillschweigend entfernt: ein ANDERES Geheimnis, Codes, die nie passten | abgelehnt (Leerzeichen und = toleriert) |
of_encrypt_file | „unabhängig von ihrer Größe“ | bis 64 GB, die Grenze eines AES-GCM-Containers: darüber -7 |
relative Pfade: n_pbt_crypto, u_pbt_zip, of_capture des Videoplayers | im AKTUELLEN Ordner gelesen (der sich nach einem DirList oder einem Dateidialog verschiebt), neben die EXE geschrieben (in der IDE: der PowerBuilder-Ordner) | GELESEN im aktuellen Ordner, dann im Ordner, in dem die Anwendung gestartet ist, dann neben der EXE; GESCHRIEBEN in den Ordner, in dem die Anwendung gestartet ist — in der IDE wie kompiliert derselbe |
Das Rezept: (1) übergeben Sie den Algorithmus eines JWT IMMER als Konstante (n_pbt_crypto.JWT_RS256), nie aus dem Token oder einer INI gelesen, der er fehlen kann; (2) wenn ein Server Ihre EC-Signaturen in P1363 prüfte (.NET VerifyData standardmäßig), wandeln Sie sie um oder prüfen Sie sie in DER (DSASignatureFormat.Rfc3279DerSequence); (3) ein außerhalb der Grenzen gesetztes il_pbkdf2_rounds muss zwischen 1.000 und 10.000.000 zurückkehren; (4) eine Datei, die ein relativer Pfad neben die EXE schrieb, liegt jetzt im Startordner der Anwendung — geben Sie einen vollständigen Pfad an, wenn Sie einen anderen wollen.
11.9 restclient: Header, die ihre Ablehnung sagen, Umleitungen, die die Anfrage behalten #
Die Überprüfung von restclient ersetzt zwei stille Verluste — eine hinter einer Umleitung nie ausgeführte Änderung, eine hinter einem fehlerhaften Header nie gesendete Authentifizierung — durch das richtige Verhalten oder eine Ablehnung, die ihren Grund nennt. Keine Methode wird entfernt; drei werden zu Funktionen, zwei Eigenschaften kommen hinzu, und die Windows-Authentifizierung geht nur noch ab, wenn Sie sie verlangen. Ein Punkt gilt für die fünf nichtvisuellen Komponenten, die Ereignisse auslösen: ein Fehler in Ihrem Ereigniscode wird jetzt sichtbar.
| Was | 3.0 | 4.0 |
|---|---|---|
of_set_header, of_set_bearer, of_set_basic | Subroutinen: nichts wurde geliefert, ein fehlerhafter Wert wurde unverändert behalten | long-Funktionen: 0, oder -5 und nichts ändert sich — leerer Name, Name mit Leerzeichen, Doppelpunkt oder Steuerzeichen, Wert mit Zeilenumbruch; ein leerer Wert entfernt den Header |
| eine Anfrage mit einem fehlerhaften Header | ging OHNE JEDEN Header ab — Authorization eingeschlossen —, ohne Fehler | -5, und is_last_error = „invalid header: <Name>“; nichts geht ab |
| Umleitung 301 / 302 eines PUT, PATCH oder DELETE | ging als GET ohne Körper weiter: die Änderung wurde nie ausgeführt, und der Aufruf lieferte 200 | Methode und Körper bleiben; nur ein POST wird zum GET; ein 303 geht als GET ohne Körper weiter (außer HEAD) |
| eine wiederverwendete Verbindung (die einer Umleitung), die der Server im selben Moment schließt | -4 und „request failed: 12152“, ab und zu | die Anfrage wird EINMAL erneut gesendet, Körper inbegriffen, über eine neue Verbindung: der Server hatte darauf nichts geantwortet |
of_response_text ( ), of_response_headers ( ), of_response_header, of_json_value | die letzte synchrone Antwort des PROZESSES: ein zweiter n_pbt_restclient überschrieb sie | die des OBJEKTS; of_close vergisst sie |
| als Text gelesener Körper, 32-Bit-Anwendung | auf 64 MB begrenzt | auf 16 MB begrenzt (64 MB in 64 Bit): darüber -4 „body too large“ — lesen Sie ihn mit of_download |
of_get_async, of_request_async… bei ungültiger URL oder ungültigem Header | eine Anfrage-ID, dann ein ue_failed | sofort -5, kein Ereignis folgt; is_last_error sagt warum („invalid URL: …“) |
| Windows-Authentifizierung (Negotiate / NTLM) | das System beantwortete die Anforderung eines Intranet-Servers von selbst mit den Anmeldedaten der Sitzung | standardmäßig aus: die Anmeldedaten gehen ohne ib_windows_auth = true (neue Eigenschaft) an keinen Server; is_client_certificate (neu) setzt ein Client-Zertifikat |
of_cancel (long al_id), of_status (long al_id), of_response_text (long al_id)… | die ID einer Anfrage eines ANDEREN Objekts erreichte diese Anfrage | nur die Anfragen des Objekts: of_cancel liefert -5 und bricht nichts ab, die Leser liefern 0 / "" |
of_status (long al_id) in ue_failed | konnte 200 liefern: den Status einer empfangenen, dann verlorenen Antwort | 0 für jede fehlgeschlagene Anfrage |
ue_failed | -4 Fehlschlag, -5 URL oder Datei | -4 Fehlschlag, -5 Datei oder Client-Zertifikat, -6 Bereichsanfrage in der Demo abgelehnt |
Laufzeitfehler in einem Ereignis der Anwendung — restclient, speechout, soundplayer, toaster, commandpalette | wortlos verschluckt, und die folgenden Ereignisse wurden nicht mehr geliefert | erreicht das Ereignis SystemError der Anwendung wie jeder Skriptfehler; die folgenden Ereignisse werden geliefert |
il_max_retries | wiederholte auch einen Fehlschlag, der sich genauso wiederholt (zu viele Umleitungen, ungültige oder HTTPS → HTTP-Umleitung, TLS, nicht schreibbare Datei) | diese Fehlschläge werden nicht mehr wiederholt; 429, 503 und ein Netzausfall weiterhin |
| URLs und Pfade | das Fragment #… ging an den Server; eine relative Location ?page=2 verlor das letzte Segment; ein relativer Pfad von of_download folgte dem gerade aktuellen Ordner | das Fragment wird nicht mehr gesendet; Location wie von einem Browser aufgelöst (RFC 3986); ein relativer Pfad wird beim Aufruf im aktuellen Ordner der Anwendung beim Laden der Bibliothek aufgelöst |
Das Rezept: (1) prüfen Sie die Rückgabe von of_set_header, of_set_bearer und of_set_basic, wenn der Wert aus einer Eingabe, einer INI oder einer Datenbank stammt — ein Aufruf, der die Rückgabe ignoriert, kompiliert weiterhin, aber das -5 ist jetzt die einzige Spur eines abgelehnten Headers; (2) eine Intranet-API mit Windows-Authentifizierung, die 200 lieferte, liefert jetzt 401: setzen Sie ib_windows_auth = true auf DIESEM Client; (3) eine 32-Bit-Anwendung, die einen Körper über 16 MB als Text liest, wechselt zu of_download; (4) wenn Sie eine Anfrage-ID zwischen zwei Objekten teilten, lesen Sie die Antwort auf dem Objekt, das sie gesendet hat; (5) ein Fehler, der jetzt aus ue_response oder ue_failed in SystemError erscheint, bestand schon: er wurde verschluckt.
11.10 speechout: Live-Einstellungen, eine stille Zerstörung #
Die Überprüfung von speechout hält zwei Versprechen, die die Dokumentation gab und der Code nicht — eine während des Lesens geänderte Einstellung gilt für den nächsten Satz, of_speak_from jenseits des Textes liefert -5 — und entfernt ein Ereignis, das zum falschen Zeitpunkt ausgelöst wurde. Keine Methode wird entfernt. Neu: of_add_abbreviation, of_clear_abbreviations, das Ereignis ue_mark und zwei Tags, [mark=name] und [rate=150]…[/rate].
| Was | 3.0 | 4.0 |
|---|---|---|
of_speak_from (al_index) | jenseits des Textes wurde das laufende Lesen ABGEBROCHEN, nichts begann, und die Rückgabe war 0 | -5, und das laufende Lesen geht weiter |
ii_rate, ii_pitch, ii_volume, is_lang, is_voice | während des Lesens geändert, erst beim NÄCHSTEN Lesen übernommen (die Dokumentation versprach den nächsten Satz) | Live-Eigenschaften: der nächste Satz übernimmt sie |
ue_voice_fallback | stumm, wenn nur die REGION fehlte (fr-CA verlangt, fr-FR-Stimme) | ausgelöst; Sprach-Tags werden ohne Groß-/Kleinschreibung verglichen, und fr_FR gilt als fr-FR |
destroy (n_pbt_speechout) | löste während eines Lesens ue_stopped aus — auf einem schon halb zerstörten Fenster | kein Ereignis; of_close() löst weiterhin ue_stopped aus |
of_sentence_count, of_count | die Zahl des beim VORIGEN Mal gelesenen Textes (0 vor jedem Lesen) | die Zahl von is_text, so wie es ist |
of_pause, of_resume, of_clear_queue | erzeugten die Stimme, wenn sie nicht existierte; eine Pause während des Wartens auf die Stimmen ging verloren | 0 ohne etwas zu erzeugen, -4, wenn die Seite nicht antwortete; die Pause hält bis of_resume |
ue_sentence (al_index) | eine Abkürzung (Mr., Dr., e.g.), eine buchstabierte Adresse oder eine Version teilten den Satz; ein Text ohne Punkt war ein einziger Satz | sie teilen nicht mehr; ein Satz mit mehr als 250 Zeichen wird geteilt: die Satznummern können sich ändern |
[pause=ms] | am TEXTENDE ignoriert | eine Stille nach dem letzten Satz, vor ue_stopped |
Das Rezept: (1) prüfen Sie das -5 von of_speak_from, wenn der Index aus einem Klick kommt; (2) wenn Ihr ue_stopped beim Schließen des Fensters etwas tat, rufen Sie of_close() selbst in dessen close auf — die Zerstörung löst es nicht mehr aus; (3) behalten Sie keine Satznummern von einer Version zur nächsten: nehmen Sie sie aus ue_sentence, wie die Dokumentation es immer sagte.
11.11 statictext und Rich Text: Auszeichnung von links nach rechts gelesen #
Die Überprüfung von statictext hat vor allem den gemeinsamen Auszeichnungstext (4.7) korrigiert: diese Zeilen gelten für die Beschriftung jeder Komponente — Registerkartentitel, Statusleistenfeld, Toast, Dialog. Keine Methode wird entfernt. Neu: of_refresh_parent_color(), und die Bereiche [action], [hyperlink] sowie die Kopfzeilen von [foldarea] eines statictext sind per Tastatur erreichbar (Tab, dann Eingabe oder Leertaste).
| Was | 3.0 | 4.0 |
|---|---|---|
of_escape_markup (une donnée collée à une balise) | ein maskiertes ] direkt nach einem Tag bildete ein Paar mit dem ] des Tags: "[b]" + of_escape_markup("] Ende") + "[/b]" zeigte [b]] Ende ohne Fettdruck | die Daten werden wie geschrieben angezeigt, und die Formatierung darum herum bleibt |
[/b], [/i]… | ein schließendes Tag schloss das LETZTE geöffnete Tag, welches auch immer: [b]A[i]B[/b]C ließ C fett; [/br] schloss ebenfalls etwas | ein schließendes Tag schließt nur sein eigenes Tag (die darin geöffneten Stile laufen weiter); ein schließendes Tag ohne öffnendes oder das eines selbstschließenden Tags wird ignoriert |
[picture=…] | am ersten Komma abgeschnitten: eine Data-URI (was of_icon() liefert) oder ein Dateiname mit Komma wurde nicht angezeigt | die Abmessungen werden am Ende des Werts gelesen: beide werden angezeigt |
[picture=\\server\share\x.png] | das Bild wurde von der Netzwerkfreigabe gelesen | abgelehnt: ein Bild der Auszeichnung greift nie auf eine Netzwerkfreigabe zu. Nutzen Sie of_icon(), das es einbettet, oder ein picture |
[hyperlink=HTTPS://…] | ein Schema in Großbuchstaben wurde nicht geöffnet | geöffnet: das Schema wird ohne Rücksicht auf Groß-/Kleinschreibung gelesen; die Liste bleibt http, https, mailto |
ii_padding | 0 = der Abstand des Designs: eine Beschriftung konnte nie bündig mit dem Rand eines benachbarten Feldes stehen | -1 = der Abstand des Designs (neuer Standard), 0 = kein Abstand |
ue_clicked, ue_double_clicked | ausgelöst beim Zuklappen eines [foldarea] (drei Ereignisse bei einem Doppelklick) und beim Loslassen der Maus nach einer Textauswahl | nicht mehr ausgelöst: Zuklappen ist eine Sache des Lesens |
[foldarea:… [action=…]] | löste ue_action aus UND klappte den Block zu | nur ue_action, der Block bleibt, wie er ist |
ii_line_spacing, is_marquee_direction | ein Wert außerhalb von 50-400 wurde ignoriert und als 0 zurückgelesen; eine unbekannte Richtung ("UP") lief zum Anfang, wurde aber wie geschrieben zurückgelesen | auf die nächste Grenze gesetzt und so zurückgelesen, wie angewendet; eine unbekannte Richtung gilt als MARQUEE_START und wird so zurückgelesen |
of_scroll_to_end | lieferte nichts | liefert 0, oder -2 wenn die Komponente nicht erzeugt ist |
Das Rezept: (1) ein ii_padding = 0, geschrieben für „den Abstand des Designs“, wird zu -1 — oder entfällt; (2) ein Auszeichnungsbild auf einer Netzwerkfreigabe läuft über of_icon(); (3) ein ue_clicked, das auf das Zuklappen eines Abschnitts reagierte, wird nicht mehr aufgerufen: das Zuklappen wird nicht geskriptet.
11.12 breadcrumb: was nachgibt, wenn der Pfad nicht passt, und das Verlassen des Felds #
Die zweite Überprüfung des Brotkrumenpfads (breadcrumb) hat das Einklappen nach Breite, den Modus OVERFLOW_SHRINK und das, was ein Segment mitnimmt, korrigiert. Keine Methode wird entfernt. Eine Zeile gilt für alle nativen Menüs der Bibliothek: die Suche durch Tippen.
| Was | 3.0 | 4.0 |
|---|---|---|
of_edit() sans / without ib_editable | liefert 0, nichts öffnet sich | liefert -4 |
| das Pfadfeld für ein anderes Steuerelement der Anwendung verlassen | das Feld blieb offen, der Text halb eingegeben, und nichts wurde gemeldet | ein geänderter Text wird bestätigt: ue_path_entered; der Wechsel in eine andere Anwendung behält die Eingabe weiterhin |
OVERFLOW_SHRINK | jede Beschriftung auf 12 Zeichen begrenzt, auch mit genug Platz; der aktuelle Ort am Rand der Leiste glatt abgeschnitten | nichts wird gekürzt, solange Platz ist; die Mitte gibt zuerst nach, bis auf einen Buchstaben und …, das erste Segment und der aktuelle Ort zuletzt |
OVERFLOW_COLLAPSE | die Beschriftung des aktuellen Orts konnte gekürzt werden, bevor die Mitte eingeklappt war | zuerst klappt die Mitte ein; der aktuelle Ort wird nur als letztes Mittel gekürzt |
of_insert_item(…, ai_index) | die Handles der verschobenen Segmente bezeichneten ein anderes Segment, ihre Farben und Tooltips blieben an der alten Adresse | ihre Handles werden freigegeben, ihre Farben und Tooltips folgen ihnen; ein entferntes Segment (of_clear, of_truncate, of_remove_item) nimmt seine mit |
of_item("b").il_back_color / of_item("a/b").il_back_color | zwei Werte für dasselbe Segment | einer: der eindeutige Schlüssel und die Adresse bezeichnen dasselbe Segment |
OVERFLOW_SCROLL, Mausrad | ohne Wirkung | verschiebt den Streifen |
| native Menüs (Pfadzweige, Menüband, Menüleiste, Symbolleiste, Kontextmenü): ein getippter Buchstabe | bewirkte nichts, außer bei Zugriffstasten | die innerhalb einer Sekunde getippten Buchstaben springen zum ersten Eintrag, der so beginnt („Win“), wie im Explorer; ein Menü mit mehr als 500 Einträgen zeichnet nur das Sichtbare |
Das Rezept: (1) ein of_edit(), dessen 0 Sie ohne gesetztes ib_editable geprüft haben, liefert jetzt -4; (2) ein ue_path_entered kann eintreffen, wenn der Benutzer anderswo im Fenster klickt — es ist derselbe Text wie mit Eingabe; (3) holen Sie nach einem of_insert_item in der Mitte des Pfads die Handles der folgenden Segmente neu.
11.13 buttonbar und Fenstertastatur: die Taste geht an die Komponente des Fokus #
Die zweite Überprüfung der Schaltflächenleiste (buttonbar) betraf die Fenstertastatur, die alle Komponenten teilen, die auf Enter, Esc, einen Alt+Buchstaben oder ein registriertes Kürzel antworten (button, buttonbar und die Kürzel von of_register_shortcut aller Komponenten). Keine Methode wird entfernt; eine kommt hinzu, of_focus_button.
| Was | 3.0 | 4.0 |
|---|---|---|
| zwei Komponenten desselben Fensters antworten auf Enter, Esc oder dasselbe Kürzel (zwei MDI-Blätter, zwei Bereiche) | die zuerst erzeugte erhielt sie, selbst im anderen Blatt | die dem Fokus nächste (dasselbe Blatt, derselbe Bereich); bei Gleichstand keine: die Taste bleibt beim Fenster |
Enter auf einem fokussierten PB-CommandButton oder in einer geöffneten DropDownListBox; Esc in einer geöffneten Liste | löste die Standard-/Abbrechen-Schaltfläche der Komponente aus | bleibt beim Steuerelement, wie in einem Windows-Dialog |
of_register_shortcut(chord, key) auf einer Schaltfläche der Leiste, dann die Schaltfläche deaktiviert und reaktiviert oder ihr Buchstabe is_shortcut geändert | das Kürzel wurde gelöscht | bleibt: der Alt+Buchstabe und das Kürzel der Anwendung berühren sich nicht mehr |
| der Alt+Buchstabe einer Schaltfläche gegenüber einem ausdrücklichen Kürzel derselben Taste | das zuerst registrierte gewann | das ausdrückliche Kürzel gewinnt; die Buchstaben werden erst danach befragt |
of_clear_shortcuts() | löschte auch das is_shortcut eines button | löscht nur die Kürzel der Anwendung |
buttonbar: of_register_shortcut(chord) ohne Schlüssel oder mit einem Schlüssel, der keine Schaltfläche nennt | lieferte 0 und schluckte die Taste, ohne etwas auszulösen | liefert -5 |
buttonbar: die Schaltfläche von is_default / is_cancel entfernen oder die Leiste leeren | die Eigenschaft behielt den Schlüssel; eine unter diesem Schlüssel wieder hinzugefügte Schaltfläche wurde wieder Standard | geleert: die Rolle geht mit ihrer Schaltfläche |
| buttonbar: eine andere Schaltfläche der Leiste hat den Fokus | der Akzent blieb auf is_default, während Enter die fokussierte Schaltfläche auslöste | die fokussierte Schaltfläche trägt das Standard-Aussehen; is_default liest sich unverändert |
buttonbar: ein negatives ii_padding_x | wurde zu 12 | der Abstand des Designs, wie ii_padding_y und ii_gap |
| buttonbar: die Trennlinie zwischen Schaltflächen | mitten in den Abstand gezeichnet, selbst wenn sich die Schaltflächen nicht berührten | nur zwischen zusammengefügten Schaltflächen (ii_gap = 0) und auf der richtigen Seite bei Rechts-nach-links |
Das Rezept: (1) geben Sie auf einer Leiste EINER Schaltfläche ein Kürzel — of_register_shortcut("Ctrl+S", "save") — die Form ohne Schlüssel liefert -5; (2) setzen Sie is_default neu, nachdem Sie die Standardschaltfläche entfernt und wieder hinzugefügt haben; (3) um den Fokus auf eine bestimmte Schaltfläche zu setzen („Nein“ statt „Ja“), rufen Sie of_focus_button("no") auf.
11.14 button: eine ausgegraute Schaltfläche gibt ab, und Alt+Buchstabe antwortet #
Die Überprüfung der Schaltfläche (button, zugunsten von buttonbar veraltet, aber weiterhin ausgeliefert und korrigiert) ändert, was sie auf der Tastatur tut und was ihre Eigenschaften zurücklesen. Keine Methode wird entfernt oder hinzugefügt.
| Was | 3.0 | 4.0 |
|---|---|---|
eine ausgegraute Schaltfläche mit ib_default, ib_cancel oder is_shortcut (ib_enabled = false) | hielt Enter, Esc oder sein Kürzel für das ganze Fenster fest: die Taste ging verloren | gibt die Taste an das Fenster zurück (ein Standard-CommandButton von PB, ein SingleLineEdit erhalten sie); wieder aktiviert, nimmt sie sie zurück |
das & von is_text (&Speichern) | unterstrich den Buchstaben, nicht mehr | Alt + der Buchstabe löst die Schaltfläche aus, wo auch immer der Fokus im Fenster liegt, nach den expliziten Kürzeln, nie ausgegraut; eine PB-Menüleiste mit demselben Buchstaben verliert ihn |
| Enter oder Leertaste auf der fokussierten Schaltfläche gehalten | eine Salve von ue_clicked; die Leertaste löste beim Drücken aus | ein einziges ue_clicked; die Leertaste löst beim Loslassen aus, wie unter Windows |
ein is_shortcut, das das Fenster nicht auslösen kann ("Win+S", "Ctrl+Entrée", "Ctrl+Pause") | wurde unverändert zurückgelesen; "Win+S" löste die Schaltfläche bei einem einfachen S aus | abgelehnt: es liest sich "". Tastennamen werden auf Englisch geschrieben (Enter, Esc, Del) |
is_shortcut mit einem Tooltip | das Kürzel erschien nirgends | dem Tooltip hinzugefügt (dem Titel eines erweiterten): „Speichern (Ctrl+S)“ |
of_register_shortcut("F5") auf der Schaltfläche, dann ib_default, ib_cancel oder is_shortcut geändert | F5 wurde gelöscht | F5 und is_shortcut antworten beide |
is_text, is_image, is_style, ii_badge, il_badge_color, ii_badge_size, ii_image_size nach of_reset() gelesen | den alten Wert, obwohl der Bildschirm zurückgesetzt war | ihren Standardwert ("", "standard", 0, -1) |
| eine ausgegraute Schaltfläche und die Tab-Taste | erhielt den Fokus | wird übersprungen |
eine Beschriftung aus nur einem Bild ([picture=…]) oder ein & in einem Tag | die Beschriftung verschwand oder das Tag war defekt | wie geschrieben angezeigt |
Das Rezept: Schreiben Sie die Tastennamen von is_shortcut auf Englisch ("Ctrl+Enter") und lesen Sie die Eigenschaft im Zweifel zurück: "" bedeutet abgelehnt. Wenn Sie eine Standardschaltfläche ausgegraut haben, um „Enter zu deaktivieren“, ist nichts zu ändern: genau das geschieht jetzt.
11.15 menubar: eine Menüleiste, die den Fokus zurückgibt, und Alt+Buchstabe von überall #
Die Überprüfung der Menüleiste (menubar) ändert, was sie mit dem Fokus und der Tastatur macht, und was alle nativen Menüs bei Schreibrichtung von rechts nach links tun. Keine Methode wird entfernt oder ändert ihre Signatur.
| Was | 3.0 | 4.0 |
|---|---|---|
ein Klick in die Leiste, dann eine Auswahl (Bearbeiten > Einfügen) | die Leiste behielt den Fokus: GetFocus() in ue_item_selected nannte das Feld nicht mehr, das Einfügen ging ins Leere | der Fokus kehrt bevor ue_item_selected ausgelöst wird zum vorherigen Steuerelement zurück; ebenso bei Esc und bei einem Klick daneben |
Alt+F gehalten, oder F10, mit dem Fokus in einem Feld | nichts: nur Alt getippt und dann F öffnete File | Alt+F öffnet File von jedem Steuerelement aus, F10 wirkt wie Alt; ein von Ihrer Anwendung registriertes Alt+F behält den Vorrang, und ein natives PowerBuilder-Menü mit demselben Buchstaben verliert ihn |
Ctrl++, Ctrl+-, Ctrl+,, Alt+Left, Ctrl+Space, Ctrl+Tab, Ctrl+Backspace (alle Komponenten mit Kürzeln) | angezeigt, aber nichts wurde von einem PB-Steuerelement aus ausgelöst; der button lehnte sie ab ("") | ausgelöst, wo auch immer der Fokus liegt; diese Tasten brauchen Ctrl oder Alt (allein bleiben sie Navigation) |
in RTL die Dropdowns aller nativen Menüs (Menüleiste, Menüband, Symbolleiste, Brotkrumen, Kontextmenü…) | links ausgerichtet, Kaskaden rechts, Winkel ›, Links schloss | das Dropdown hängt rechtsbündig unter seinem Titel, eine Kaskade öffnet sich nach links (Winkel ‹): Links öffnet, Rechts schließt |
| ein Klick auf den Titel eines bereits offenen Menüs | schloss es und öffnete es wieder (ein zweites ue_menu_opening) | schließt es, wie unter Windows |
ein is_shortcut auf einem Eintrag, der eine Kaskade öffnet | angezeigt, und löste ue_item_selected("file/export") aus, eine Adresse, die kein Klick erzeugt | weder angezeigt noch ausgelöst: ein Kürzel gehört auf ein Blatt |
| eine Leiste, deren Menüs alle ausgeblendet oder ausgegraut sind, neben einem Menüband | nahm Alt für nichts: die KeyTips des Menübands erschienen nicht mehr | gibt Alt an das Menüband zurück, solange kein Titel erreichbar ist |
zwei Titel mit demselben Buchstaben (&Datei, &Favoriten) | Alt+F öffnete immer den ersten | in der Leiste wandert der Balken von einem zum anderen, Eingabe öffnet |
| ein entfernter und an derselben Adresse wieder hinzugefügter Eintrag (eine Liste zuletzt verwendeter Dateien) | übernahm die Farben und den Tooltip des entfernten | entsteht ohne Farbe (il_back_color liest -1 zurück); ebenso nach of_remove_menu und of_clear |
ein Buchstabe mit Akzent oder aus einer nicht lateinischen Schrift in einem Dropdown (&Überblick) | unterstrichen, aber keine Taste erreichte ihn | wird wie auf der Tastatur getippt |
| die Tab-Taste auf der Leiste | ein Halt pro Titel | ein einziger Halt für die ganze Leiste; die Pfeiltasten gehen von Titel zu Titel |
| neu | — | is_image (das Symbol eines Eintrags, live geändert), is_group (Optionseinträge), ue_menu_closed(as_key) (ein ohne Auswahl geschlossenes Dropdown) |
Das Rezept: arbeiten Sie in ue_item_selected mit GetFocus() oder mit dem bearbeiteten DataWindow wie mit einem PowerBuilder-Menü; setzen Sie ein & in jeden Titel; wenn Ihre Anwendung Alt+Buchstabe für etwas anderes nutzte, registrieren Sie es (of_register_shortcut): es behält den Vorrang.
11.16 ribbon: eine Auswahl, die hält, Menüs, die offen bleiben, Ablehnungen, die sich melden #
Die zweite Überprüfung des Menübands (ribbon) behebt, was der Benutzer sah — eine rückgängig gemachte Schriftwahl, ein Menü, das sich unter dem Zeiger schloss — und wendet die Regel der Bibliothek auf das Menüband an: ein Hinzufügen oder Entfernen, das nicht möglich ist, liefert -5. Keine Methode wird entfernt oder ändert ihre Signatur.
| Was | 3.0 | 4.0 |
|---|---|---|
| ribbon: eine Auswahl in der Liste eines Kombinationsfelds, dann das Verlassen des Felds | ue_combo_changed zweimal — die Auswahl, dann der zuvor getippte Text, der sie überschrieb; is_text las den getippten Text | ein einziges ue_combo_changed, die Auswahl; das Feld zeigt sie sofort, auch bei einem nicht bearbeitbaren Feld |
ribbon: Eingabe oder Escape in einem Kombinationsfeld, einem Drehfeld oder auf einer fokussierten Schaltfläche des Menübands | gingen auch an die Standard- oder Abbrechen-Schaltfläche des Fensters | bleiben im Menüband; Escape in einem Feld stellt den Text vor der Eingabe wieder her |
| ribbon: ein offenes Menü, während die Anwendung das Menüband aktualisiert (ein anderes Steuerelement ausgeblendet, eine Registerkarte umbenannt, eine Kachel hinzugefügt) | schloss sich, und die darin getroffene Wahl löste kein Ereignis aus | bleibt offen; es schließt sich nur, wenn sein eigenes Steuerelement verschwindet, ausgeblendet oder ausgegraut wird |
ribbon: is_app_button neu geschrieben („File“ → „Datei“); is_app_button = "" | das Anwendungsmenü wurde geleert; eine leere Zeichenkette zeigte „File“ | das Menü bleibt; eine leere Zeichenkette entfernt die Schaltfläche samt Menü |
ribbon: of_select_tab einer unbekannten oder ausgeblendeten Registerkarte | 0 | -5, nichts ändert sich |
ribbon: Hinzufügen eines Menüeintrags, einer Kachel, einer Kombinationsfeld-Auswahl, einer Schnellzugriffsschaltfläche, eines Eintrags des Anwendungsmenüs oder einer kontextbezogenen Gruppe mit bereits vergebenem Schlüssel; ein Schlüssel mit senkrechtem Strich oder beginnend mit __; ein unbekanntes Elternteil (Trennlinie, Überschrift, Auswahl, Eintrag ohne Anwendungsschaltfläche, Registerkarte unter einer fehlenden kontextbezogenen Gruppe) | 0: ein Duplikat oder gar nichts (eine kontextbezogene Registerkarte ohne Band) | -5 |
ribbon: of_remove_tab, of_remove_group, of_remove_item, of_select_gallery_item auf einer unbekannten Adresse; of_open auf einer Schnellzugriffsschaltfläche | 0, ohne Wirkung | -5. of_open("registerkarte/gruppe") öffnet das Panel einer eingeklappten Gruppe |
ribbon: ein of_qat_item-Handle, das nach of_remove_item seiner Schaltfläche behalten wird | blieb gültig und bezeichnete eine verschwundene Schaltfläche | freigegeben: IsValid() liefert false |
| ribbon: Zugriffstasten — zwei Steuerelemente mit demselben Buchstaben, eines davon ausgeblendet; ein Steuerelement einer eingeklappten Gruppe | das ausgeblendete stahl den Buchstaben, nichts wurde ausgeführt; der Buchstabe einer eingeklappten Gruppe bewirkte nichts; eine zweibuchstabige Taste antwortete nie | nur ein sichtbares, aktives Steuerelement antwortet; der Buchstabe öffnet das Panel der eingeklappten Gruppe; "FP" wird Buchstabe für Buchstabe getippt |
| ribbon: Pfeiltasten auf einer ausgegrauten geteilten Schaltfläche, Farbauswahl, einem Kombinationsfeld oder Katalog | hielten dort an, ohne dort etwas tun zu können | überspringen sie; Ab auf einer Dropdown- oder geteilten Schaltfläche öffnet ihr Menü |
Das Rezept: (1) ue_selection_changed und ue_minimized werden auch ausgelöst, wenn Ihr Code of_select_tab aufruft oder ib_minimized setzt, wie bei einem Klick: Haben Sie Ihre Verarbeitung gleich danach selbst aufgerufen, entfernen Sie diesen Aufruf, sie liefe sonst zweimal; (2) prüfen Sie das -5 der Hinzufügungen, wenn Ihr Aufbau einen Schlüssel wiederholen kann; (3) ein is_app_button = "", das „File“ meinte, schreibt sich jetzt is_app_button = "File". Das Entfernen unter einem Steuerelement und das Handle eines Eintrags des Anwendungsmenüs stehen in Tabelle 11.5.
11.17 toolbar: eine Regel für Tastenkürzel, ein einziger Tooltip, Ablehnungen, die sich melden #
Die zweite Überprüfung der Symbolleiste (toolbar) richtet ihre Tastenkürzel an denen des Fensters aus und macht sichtbar, was wirkungslos geschrieben wurde. Keine Methode wird entfernt oder ändert ihre Signatur; zwei Rückgabecodes kommen hinzu (-5).
| Was | 3.0 | 4.0 |
|---|---|---|
ein Werkzeug mit is_shortcut = "Delete" (eine einzelne Taste) und ein Feld in der Leiste | Entf im Feld löste das Werkzeug aus und löschte nichts; außerhalb der Leiste nichts | eine einzelne Taste ist nie ein Tastenkürzel: es braucht Strg oder Alt oder F1 bis F24 — die Regel des Fensters |
| eine gehaltene Tastenkürzel-Taste (alle Komponenten) | die Aktion wiederholte sich: ein Umschalter flackerte | eine Aktion pro Tastendruck |
das geerbte of_register_shortcut(Kürzel, Schlüssel) auf einer Toolbar | löste nichts aus, und die Taste wurde verschluckt | nimmt die Adresse des Werkzeugs oder Eintrags ("main/save"), sonst -5; die Form mit einem Argument liefert -5; of_clear_shortcuts leert auch is_shortcut |
| das Tastenkürzel eines Felds, eines Datumswählers, einer Beschriftung | verschluckte die Taste, ohne etwas zu tun | das Feld erhält den Cursor (Strg+F auf einer Suche), der Wähler öffnet seinen Kalender; eine Beschriftung nimmt keines an |
der beim Hinzufügen angegebene Tooltip (of_add_button(…, tooltip)) | Markierungen wörtlich angezeigt; zwei Blasen gleichzeitig, wenn danach is_tooltip gesetzt wurde | ein einziger thematisierter Tooltip, Rich-Text, das Tastenkürzel angehängt; is_tooltip ersetzt ihn und wird zurückgelesen |
of_add_bar(MAIN_BAR) nach einem ersten Werkzeug auf main | lieferte 0, ohne etwas zu tun | -5: um sie zu platzieren, fügen Sie main vor jedem Werkzeug hinzu |
of_set_layout mit einem Text, der kein JSON ist | lieferte 0 | -5 |
ue_layout_changed | fehlte, wenn das Hinzufügen einer Leiste eine andere verschob; ausgelöst beim erneuten Anzeigen einer bereits sichtbaren Leiste | im ersten Fall ausgelöst, im zweiten nicht mehr |
| Trenner, ein Dropdown oder eine Kaskade, deren Einträge alle ausgeblendet sind | verwaiste Striche; Dropdown und Kaskade blieben aktiv und stumm | kein Strich am Anfang, am Ende oder doppelt; sie werden ausgegraut gezeichnet |
| ein Rechtsklick in der Leiste | kein Event, auch nicht ue_rclicked | ue_item_rclicked(Adresse) auf einem Werkzeug, ue_rclicked außerhalb jedes Werkzeugs — nie beide |
die Farben eines Menüeintrags (of_menu_item(…).il_back_color) | geschrieben und zurückgelesen, nie gezeichnet | im Menü gezeichnet |
toolbar: ue_rclicked, ue_mouse_enter, ue_mouse_leave | dokumentiert, aber nie ausgelöst | ausgelöst: ein Rechtsklick auf die Leiste außerhalb jedes Werkzeugs, das Betreten und Verlassen durch die Maus |
Das Rezept: (1) ein Werkzeug-Tastenkürzel auf einer einzelnen Taste (außer F1 bis F24) bekommt Strg oder Alt; (2) auf einer Toolbar erhält of_register_shortcut die Adresse des Werkzeugs oder Eintrags; (3) um die Leiste main zu platzieren, rufen Sie of_add_bar(MAIN_BAR, Band, Rang) vor ihrem ersten Werkzeug auf.
11.18 statusbar: ein Griff, der die Größe ändert, eine Meldung, die den Text nicht ersetzt #
Die zweite Überprüfung der Statusleiste (statusbar) gibt dem Größenänderungsgriff seine eigentliche Rolle und macht aus jedem leeren oder unbekannten Schlüssel eine Ablehnung. Keine Methode wird entfernt oder ändert ihre Signatur; of_flash_panel erhält einen Rückgabecode (-5).
| Was | 3.0 | 4.0 |
|---|---|---|
ib_show_resize_grip = true, dann am Griff ziehen | eine Zeichnung: nichts bewegt sich | das Fenster wird an seiner Ecke vergrößert (unten links bei RTL); auf einem maximierten Fenster oder einem ohne veränderbaren Rahmen wird der Griff nicht gezeichnet |
of_flash_panel auf einem Schlüssel, den die Leiste nie erhalten hat, oder auf einer Adresse | 0, nichts wird angezeigt | -5 |
of_panel(k).is_text gelesen während eines of_flash_panel | die Meldung | der Text des Bereichs (die Meldung liegt darüber) |
of_panel(""), of_panel("a/b"): schreiben, dann lesen | schrieb in die Bereiche ohne Schlüssel und die Trenner | bezeichnet nichts: schreibt nirgendwohin, liest sich leer |
is_state außerhalb der Konstanten STATE_* ("Error", "very bad") | unverändert gelesen, ohne Farbe; ein Wert mit Leerzeichen löste einen Skriptfehler aus | Groß-/Kleinschreibung wird ignoriert ("Error" = Fehler); jeder andere Wert bedeutet keinen Zustand und liest sich leer |
ii_progress = 150, dann gelesen | 150 (bei 100 % gezeichnet) | 100, was gezeichnet ist |
| ein deaktivierter Bereich mit Zustand | behielt die Zustandsfarbe: er wirkte aktiv | ausgegraut, Zustandsmarkierung inbegriffen |
ein Bereich, der entfernt, geleert (of_clear, of_clear_menu), deaktiviert oder ausgeblendet wird, während seine Liste offen ist | die Liste blieb offen, und eine Wahl löste ue_panel_menu_clicked aus | die Liste schließt sich, nichts wird ausgelöst (ebenso für einen ausgegrauten oder ausgeblendeten Eintrag) |
| Doppelklick auf einen Bereich mit Auswahlliste | ue_panel_double_clicked zusätzlich zur geöffneten Liste | nur die Liste |
| Pfeil nach oben / unten auf einem fokussierten Bereich mit Auswahlliste | sprang zum Nachbarbereich | öffnet die Liste (Pfeil links / rechts bewegen weiterhin) |
| eine Auswahlliste nur aus Trennern | Pfeil und leere Liste | keine Liste: der Bereich bleibt, was ib_clickable sagt |
Das Rezept: (1) setzen Sie ib_show_resize_grip auf einer Statusleiste am unteren Rand eines Fensters mit veränderbarer Größe; (2) prüfen Sie den Rückgabewert von of_flash_panel wie den der anderen Methoden mit Schlüssel; (3) geben Sie jedem Bereich einen Schlüssel, den Sie lesen oder ändern wollen.
11.19 dockcontainer: ein of_select_panel, das das Panel findet, schwebende Fenster, die sich erinnern #
Die zweite Überprüfung des Panel-Containers (dockcontainer) gibt of_select_panel eine Wirkung auf ein eingeklapptes oder schwebendes Panel und lässt die Anordnung die schwebenden Fenster speichern. Keine Methode wird entfernt oder ändert ihre Signatur.
| Was | 3.0 | 4.0 |
|---|---|---|
of_select_panel eines eingeklappten, schwebenden oder ausgeblendeten Panels | 0, nichts ist zu sehen | eingeklappt: sein Ausklapp-Panel öffnet sich; schwebend: sein Fenster kommt nach vorn; ausgeblendet: -5 |
of_float_panel des Haupt-Panels oder eines ausgeblendeten Panels | 0, nichts geschieht | -5 |
of_move_panel, das das HAUPT-Panel stapelt | 0, und sein Nachbar verschwindet ohne Registerkarte | -5, nichts bewegt sich |
unbekannte as_position (of_add_panel, of_move_panel) | 0, das Panel dockt unten an | -5, das Steuerelement bleibt unberührt |
Anordnung (of_get_layout, ue_layout_changed, of_set_layout) und SCHWEBENDE Panels | vergessen: ein abgelöstes Panel kam angedockt zurück; sein Fenster zu verschieben löste nichts aus | mit der Lage ihres Fensters gespeichert, beim Wiederherstellen neu geöffnet (auf einen Bildschirm zurückgeholt); das Fenster zu verschieben oder zu vergrößern löst ue_layout_changed aus |
of_set_layout einer Anordnung ohne Haupt-Panel | das aktuelle Haupt-Panel wird entfernt | es bleibt erhalten |
is_title eines ohne Titel hinzugefügten Panels | sein Schlüssel; ein später gegebener Titel ließ die Kopfzeile des Haupt-Panels nicht erscheinen | "" (die Registerkarte zeigt weiter den Schlüssel); die Kopfzeile des Haupt-Panels folgt seinem Titel |
Das Rezept: (1) ue_panel_selected, ue_panel_floated und ue_panel_pinned werden auch nach of_select_panel, of_float_panel und ib_pinned ausgelöst, wie bei einer Geste: Haben Sie Ihre Verarbeitung gleich danach selbst aufgerufen, entfernen Sie diesen Aufruf, sie liefe sonst zweimal; (2) prüfen Sie das -5 von of_move_panel, of_float_panel und of_select_panel; (3) eine vor 4.0 gespeicherte Anordnung wird unverändert wiederhergestellt, ihre Panels bleiben angedockt.
11.20 tab: ehrliche Rückgabecodes, ein Rechtsklick, der an die Anwendung zurückgeht #
Die zweite Überprüfung der Registerkarten (tab) lässt of_add_page und of_select_page melden, was sie ablehnen, meldet die Anordnung, wenn Ihr Code eine Registerkarte ausblendet, und gibt den Rechtsklick an die Anwendung zurück, wenn das integrierte Menü abgeschaltet ist. Keine Methode wird entfernt oder ändert ihre Signatur; ein Event kommt hinzu.
| Was | 3.0 | 4.0 |
|---|---|---|
of_add_page eines bereits gehosteten Steuerelements (von dieser Registerkarte unter einem anderen Schlüssel oder von einer anderen Komponente) | 0 und eine Registerkarte ohne Inhalt | -5, nichts wird hinzugefügt |
of_select_page einer abgelehnten Registerkarte, während keine aktiv ist (alle ausgeblendet) | 0 | -5 |
Eine Registerkarte per Code aus- oder einblenden (ib_visible) | kein ue_layout_changed | ue_layout_changed wird mit der gesamten Anordnung ausgelöst, wie bei of_move_page: Es meldet, dass sich die zu speichernde Anordnung geändert hat |
Rechtsklick auf eine Registerkarte mit ib_context_menu = false | nichts | die Registerkarte wird ausgewählt, dann wird ue_tab_rclicked(as_key) (neu) ausgelöst: Öffnen Sie dort Ihr Menü |
Zur aktuellen Registerkarte zurückkehren, während ue_selection_changing auf seine Antwort wartet | eine „Ja“-Antwort aktivierte trotzdem die andere Registerkarte | die Frage wird verworfen: Die letzte Geste des Benutzers gewinnt |
Eine Registerkarte, die deaktiviert oder ausgeblendet wird, während ue_tab_closing auf seine Antwort wartet | wurde trotzdem geschlossen | bleibt offen |
| Die fokussierte Registerkarte per Tastatur schließen (Entf) | der Fokus verließ die Leiste, die Pfeiltasten reagierten nicht mehr | der Fokus geht an die nun aktive Registerkarte |
Das Rezept: (1) prüfen Sie das -5 von of_add_page (eine Seite wird nur einmal gehostet) und von of_select_page; (2) wenn Sie die Anordnung in ue_layout_changed speichern, ist nichts zu tun — sie folgt jetzt auch Ihren ib_visible; (3) wo ib_context_menu = false den Rechtsklick ins Leere laufen ließ, skripten Sie ue_tab_rclicked.
11.21 listbar: ein ausgeblendeter Eintrag wird nie ausgewählt, eine geprüfte Anordnung #
Die zweite Überprüfung der Navigationsleiste (listbar) lässt of_select_item einen ausgeblendeten Eintrag und of_set_layout einen Text ablehnen, der keine Anordnung ist, und ergänzt eine Zähler-Plakette, die Tasten Links / Rechts und den Rechtsklick auf einen Eintrag. Keine Methode wird entfernt oder ändert ihre Signatur.
| Was | 3.0 | 4.0 |
|---|---|---|
of_select_item eines ausgeblendeten Eintrags (ib_visible = false) | 0, eine unsichtbare Auswahl | -5, die Auswahl bleibt; den bereits ausgewählten Eintrag auszublenden, lässt ihn ausgewählt |
of_set_layout mit einem Text, der kein JSON-Objekt ist (abgeschnittene Datei) | 0, nichts wird angewendet | -5, nichts wird gesendet |
| In einer wiederhergestellten Anordnung eingeklappter Abschnitt, später hinzugefügt | entsteht eingeklappt | entsteht ausgeklappt: der Faltzustand gilt nur für einen vorhandenen Abschnitt |
| Abschnitt mit leerem Titel | ihre Einträge kleben an den darüberliegenden; einklappbar, ohne etwas, um ihn wieder zu öffnen | ein Abstand (in der schmalen Leiste ein feiner Strich) trennt ihn; er wird nie eingeklappt |
Neu: is_badge (Eintrag), ue_item_rclicked(as_keys), Links / Rechts und Buchstabensprung | — | eine Zähler-Plakette, der Rechtsklick auf einen Eintrag (ein Ereignis, der Eintrag wird nicht ausgewählt), Einklappen per Tastatur |
Das Rezept: (1) ue_selection_changed wird auch nach einem of_select_item Ihres Codes ausgelöst (etwa um beim Start die Startseite zu öffnen), wie bei einem Klick: Haben Sie die Seite gleich danach selbst geöffnet, überlassen Sie das dem Ereignis, sonst öffnet sie sich zweimal; (2) prüfen Sie das -5 von of_select_item, wenn Sie Einträge ausblenden, und das von of_set_layout, wenn die Anordnung aus einer Datei kommt; (3) ein Abschnitt ohne Titel lässt sich nicht mehr einklappen: Geben Sie ihm einen Titel, wenn er einklappbar sein soll.
11.22 tilesbox: ein Titel, der keine Gruppe mehr erzeugt, Neuanordnung über die Tastatur #
Die zweite Überprüfung des Kachelpanels (tilesbox) verhindert, dass der Titel einer Gruppe diese Gruppe erzeugt, lässt of_add_live_item einen leeren Text ablehnen, gibt einen einzigen Tab-Halt pro Gruppe und ergänzt die Neuanordnung über die Tastatur. Keine Methode wird entfernt oder ändert ihre Signatur. il_badge_color folgt nun der Regel aller Farben (siehe die Zeile picture, button, tilesbox weiter oben).
| Was | 3.0 | 4.0 | |
|---|---|---|---|
of_group(schlüssel).is_title für eine nie hinzugefügte Gruppe | erzeugte eine sichtbare Gruppe, die sich weder füllen noch entfernen ließ (außer mit of_clear) | schreibt nichts: nur of_add_group erzeugt eine Gruppe; ein leerer Schlüssel oder einer mit / oder ` | ` liefert ein wirkungsloses Handle |
of_add_live_item mit leerem Text | 0, und der feste Text is_live_text wurde gelöscht | -5, nichts ändert sich | |
of_tile(adresse).of_count() | 0 | die Zahl der mit of_add_live_item gesetzten Seiten | |
Neu anordnen (ib_reorderable = true) | nur mit der Maus | auch über die Tastatur: Strg+Links/Rechts in der Gruppe (Leserichtung), Strg+Oben/Unten in die Nachbargruppe; dieselben ue_tile_moved und ue_layout_changed | |
| Tab-Taste | hielt an jeder Kachel; ein Pfeil zu einem Rand ohne Nachbarn sprang zur vorherigen oder nächsten Kachel des Dokuments | ein Halt pro Gruppe (die zuletzt fokussierte Kachel), die Pfeile durchlaufen die Kacheln; am Rand bleibt der Fokus | |
| Kachel, die während des Ziehens deaktiviert oder ausgeblendet wird | beim Loslassen verschoben, ue_tile_moved ausgelöst | das Ziehen wird abgebrochen, nichts bewegt sich | |
ib_collapsed einer Gruppe, von Ihrem Code gesetzt | kein Ereignis | ue_group_toggled, wie ein Klick auf die Kopfzeile (nichts, wenn die Gruppe schon in diesem Zustand ist) |
Das Rezept: (1) erzeugen Sie eine Gruppe mit of_add_group, bevor Sie ihren Titel ändern; (2) prüfen Sie das -5 von of_add_live_item, wenn der Text einer Seite leer sein kann; (3) was Sie in ue_tile_moved getan haben, gilt nun auch für ein Verschieben über die Tastatur.
11.23 stepbar: „alles erledigt" am letzten Schritt verankert, entfernte Schritte hinterlassen nichts mehr #
Die zweite Überprüfung der Schrittleiste (stepbar) macht „alles erledigt" mit der Regel des aktuellen Schritts (eine Identität, kein Rang) stimmig, lässt einen entfernten Schritt mitnehmen, was ihm gehörte, und behebt vier Anzeigefehler. Keine Signatur ändert sich.
| Was | 3.0 | 4.0 |
|---|---|---|
of_add_step, während die Leiste auf „alles erledigt" steht | der hinzugefügte Schritt erschien als abgeschlossen (Haken); ii_current sprang ohne Ereignis auf n + 2 | nach dem damals letzten Schritt hinzugefügt, wird er zum aktuellen Schritt und ue_step_changed wird ausgelöst; davor eingefügt, ändert sich nichts |
of_step(schlüssel).is_state für einen Schlüssel ohne Schritt | gemerkt und später auf den unter diesem Namen hinzugefügten Schritt angewendet | ignoriert; ein hinzugefügter Schritt beginnt mit seinem berechneten Zustand |
Farben und QuickInfo eines entfernten Schritts (of_remove_step, of_clear_steps) | kehrten beim nächsten unter demselben Schlüssel hinzugefügten Schritt zurück | gehen mit dem Schritt |
Verdichtete Leiste (OVERFLOW_AUTO), deren aktueller Schritt auf Fehler gesetzt ist | keine Beschriftung mehr; ein auf STATE_CURRENT gesetzter Schritt bekam eine | die Beschriftung bleibt beim aktuellen Schritt (Rang von ii_current), unabhängig von seinem Zustand |
OVERFLOW_SHRINK | Beschriftungen über mehrere Zeilen, lange Wörter ohne „…" abgeschnitten | eine Zeile pro Beschriftung, mit „…" am Ende |
POSITION_BOTTOM mit zweiter Zeile (is_description) | über der Beschriftung, direkt daran | unter der Beschriftung, über dem Punkt |
Überfahren eines deaktivierten oder nicht erreichbaren Schritts (il_back_color_hover, il_text_color_hover) | die Überfahrfarbe leuchtete auf | nichts leuchtet auf: der Schritt reagiert nicht auf den Klick |
Das Rezept: Wenn Ihr Code nach dem Setzen von „alles erledigt" (ii_current = of_count() + 1) einen Schritt hinzufügt und die Leiste so bleiben soll, setzen Sie nach dem Hinzufügen erneut ii_current = of_count() + 1. Wenn Sie die Leiste mit denselben Schlüsseln neu aufbauen, setzen Sie die gewünschten Farben und QuickInfos erneut: sie überleben das Entfernen nicht mehr.
11.24 progressbar: ein Balken, der in sein Control passt, eine Beschriftung, die der Sprache folgt #
Die zweite Überprüfung des Fortschrittsbalkens (progressbar) lässt ihn dorthin passen, wo eine HProgressBar stand, sendet der Komponente nur noch die Werte, die die Zeichnung ändern, schreibt den Prozentsatz in der Anzeigesprache und fügt is_label_format (eine eigene Beschriftung) und is_state (Pause, Fehler) hinzu. Keine Signatur ändert sich.
| Was | 3.0 | 4.0 |
|---|---|---|
| Linearer Balken in einem niedrigen oder breiten Control | 12 px Rand, höchstens 640 px breit: unter 24 px Höhe erschien eine Bildlaufleiste und der Balken wurde abgeschnitten | 2 px Rand, die ganze Breite; Spur (14 px) und Beschriftung schrumpfen mit der Höhe |
Prozentbeschriftung (ib_label) | „50%“ in allen Sprachen | in der Anzeigesprache: „50 %“ auf Französisch |
of_set_property("value", "12,5") oder ein Text, der keine Zahl ist | unverändert gesendet: der Befehl ging wortlos verloren; ein ungültiges minimum blockierte die Skala bis zum nächsten of_reset | „12,5“ wird als 12.5 gelesen; ein Text, der keine Zahl (bzw. bei einem Boolean nicht true/false) ist, wird ignoriert |
id_value zurückgelesen | der Wert, den die Komponente erhalten hatte; jede Zuweisung war ein Hin und Zurück mit ihr | der letzte von der Anwendung gesetzte Wert; die Komponente erhält nur die Werte, die die Zeichnung ändern (ein Zehntelprozent) |
of_reset() auf einem gefüllten Balken | der Balken glitt auf null zurück | er springt sofort auf null zurück |
Das Rezept: (1) wenn Sie einen Prozentsatz von Hand berechnet haben, setzen Sie id_maximum und weisen Sie den Rohwert zu, gern bei jeder Zeile; (2) wenn ein automatischer Test die Beschriftung las, erwarten Sie das Format der Anzeigesprache; (3) um eine Pause oder einen Fehler zu zeigen, ziehen Sie is_state einer mit il_color gewählten Farbe vor.
11.25 picture: eine Zuweisung liest die Datei neu, ein Fehlschlag nennt seinen Grund #
Die zweite Überprüfung des Bildes (picture) lässt es bei jeder Zuweisung neu von der Festplatte lesen, wie das native Picture, gibt ue_error ein zweites Argument, das sagt, warum das Bild fehlt, lehnt eine http://-Adresse ab, statt ohne Grund fehlzuschlagen, und löst bei einem Doppelklick nur noch ein ue_clicked aus. ue_error ist die einzige Signatur, die sich ändert.
| Was | 3.0 | 4.0 |
|---|---|---|
| picture: Doppelklick auf das Bild | zwei ue_clicked, dann ue_double_clicked | ein einziges ue_clicked, dann ue_double_clicked — wie das native Picture |
picture: ue_error | ue_error (string as_message): nur die Meldung | ue_error (string as_message, string as_reason): as_reason ist eine der Konstanten REASON_* (nicht gefunden, zu groß, http abgelehnt, nicht angezeigtes Format, anderes). Ihr Ereignisskript erhält das Argument von selbst; ein in Ihrem Code geschriebener Aufruf event ue_error(…) übergibt nun zwei |
picture: is_source = "http://…" | von der Engine über https versucht; auf einem Server ohne TLS ein Fehlschlag ohne Grund | von vornherein abgelehnt: Fehlerzeichen und ue_error mit REASON_INSECURE. Laden Sie das Bild zuerst herunter (n_pbt_restclient.of_download) und zeigen Sie die Datei an |
picture: derselbe Pfad erneut zugewiesen, nachdem die Datei neu geschrieben wurde; mono: oder tint: auf is_source; ein .avif-Bild | das alte Bild; das Fehlerzeichen; nicht gefunden | die Datei neu gelesen, wie beim nativen Picture; das Glyph vom Design umgefärbt; angezeigt |
| picture: gezoomtes Bild kleiner als sein Rahmen (Streifen); horizontales Mausrad, Touchpad; gehaltene rechte Maustaste | es verließ beim Ziehen seinen Rahmen; eine Zoomstufe pro Ereignis, Verkleinern bei horizontalem Bildlauf; das Bild bewegte sich | es bleibt dort, wo is_align und is_valign es platzieren; Zoom proportional zur Geste, nichts bei horizontalem Bildlauf; nur die linke Maustaste verschiebt |
Das Rezept: (1) wenn ein Skript bei ue_clicked einen Datensatz und bei ue_double_clicked eine andere Aktion öffnete, ist nichts zu tun — der Doppelklick öffnet den Datensatz nicht mehr erneut; (2) ersetzen Sie jedes Auswerten des Textes von as_message durch eine Prüfung von as_reason; (3) ein Bild auf einem Intranet-Server über http wird zuerst heruntergeladen (n_pbt_restclient.of_download in einen temporären Ordner) und dann über seinen Pfad angezeigt; (4) wenn Sie dem Pfad ein ?v= anfügten, um das erneute Lesen eines neu geschriebenen Bildes zu erzwingen, entfernen Sie es: eine erneute Zuweisung genügt.
11.26 video: Untertitel und Formate, die spielen, ein Fehlschlag, der seinen Grund nennt #
Die zweite Prüfung des Players (video) gibt ue_failed ein zweites Argument, das sagt, warum ein Film nicht spielt, lehnt eine http://-Adresse ab, spielt .mkv und .mov, lädt per URL gegebene Untertitel, und pausiert den Film, wenn die Komponente ausgeblendet wird. ue_failed ist die einzige Signatur, die sich ändert.
| Was | 3.0 | 4.0 | |
|---|---|---|---|
video: ue_failed | ue_failed (string as_message) | ue_failed (string as_message, string as_reason) — as_reason ist eine Konstante REASON_* | |
video: eine http://-Quelle | scheiterte mit „nicht auffindbar“ | sofort abgelehnt, REASON_INSECURE; nur https wird abgespielt | |
video: eine .mkv, eine .mov | .mkv „nicht auffindbar“, .mov am Namen abgelehnt | ausgeliefert und abgespielt, wenn die Engine sie dekodiert; .avi, .wmv, .flv bleiben abgelehnt (REASON_FORMAT) | |
| video: ein Untertitel per URL | erschien nie, ohne Meldung | von der Komponente heruntergeladen (der Server muss CORS erlauben); eine Ablehnung löst ue_subtitles_failed aus | |
video: of_add_subtitles zweimal für dieselbe Sprache | ersetzte die Spur stillschweigend, 0 | -5 (auch für eine Sprache mit / oder ` | ); zuerst of_remove_subtitles` |
| video: die Komponente während der Wiedergabe ausgeblendet | der Film lief weiter, mit Ton | pausiert, ue_paused, und wartet auf of_play (ib_pause_when_hidden, standardmäßig wahr) | |
| video: die Lautstärke auf der Leiste ziehen | ein ue_volume_changed pro Pixel | eines, beim Loslassen | |
video: of_capture in eine .jpg | ein PNG unter einem .jpg-Namen | ein JPEG; die Überladung of_capture(as_path, al_max_width) verkleinert das Bild | |
video: of_get_last_error nach einem Fehlschlag von of_capture | der vorige Fehler der Bibliothek | der Grund DIESES Fehlschlags (fehlender Ordner, leerer Pfad…) | |
video: Escape im Vollbild, ib_enabled = false | wirkungslos (nur Alt+F4 verließ es) | verlässt das Vollbild |
Das Rezept: (1) ergänzen Sie as_reason in Ihrem Skript von ue_failed und prüfen Sie es statt des Meldungstexts; (2) ein Film oder Untertitel eines http-Intranetservers wird zuerst heruntergeladen (n_pbt_restclient.of_download in einen temporären Ordner) und dann über seinen Pfad abgespielt; (3) ue_fullscreen_changed, ue_pip_changed, ue_source_changed und ue_chapter_changed werden auch nach Ihren eigenen Aufrufen ausgelöst (of_fullscreen, of_pip, of_next, of_seek…), wie bei einer Geste: Hat Ihr Code seine Verarbeitung gleich danach selbst aufgerufen, entfernen Sie diesen Aufruf, sie liefe sonst zweimal; (4) eine Monitorwand, die ausgeblendet spielen muss, setzt ib_pause_when_hidden = false; (5) um die Spur einer Sprache zu ersetzen, of_remove_subtitles und dann of_add_subtitles.
11.27 pdfviewer: of_refresh sagt, was es tut, nichts wird ohne Ihr Wissen heruntergeladen #
Die zweite Überprüfung des Betrachters (pdfviewer) gibt of_refresh einen Rückgabecode — und, damit derselbe Name dasselbe bedeutet, auch denen von webbrowser und shellexplorer —, meldet jeden Link des Dokuments und lehnt ab, was nie angezeigt würde, statt warten zu lassen. Keine Ereignissignatur ändert sich.
| Was | 3.0 | 4.0 |
|---|---|---|
pdfviewer · webbrowser · shellexplorer: of_refresh | subroutine | long: 0, sobald angefordert, -4 ohne Dokument bzw. Seite (pdfviewer, webbrowser), -2, wenn die Komponente nicht erstellt ist |
pdfviewer: of_refresh nach einer Ablehnung (http://…) | tat nichts, ohne Ereignis | die Ablehnung wird erneut gemeldet: ue_load_failed |
pdfviewer: eine data:-Adresse mit mehr als 2 MB Zeichen | nie angezeigt, kein Ereignis | sofort ue_load_failed mit REASON_TOO_LARGE |
| pdfviewer: ein entferntes PDF, das „als Download“ gesendet wird | ue_load_failed, aber die Datei landete in Downloads | ue_load_failed mit REASON_REFUSED, nichts wird heruntergeladen |
pdfviewer: ue_link_clicked bei einem mailto:-, file:- oder relativen Link | nie ausgelöst (nur http und https); ein relativer Link kam als interne Adresse an | für jeden Link ausgelöst; as_url ist ein mailto:… wie es ist, oder ein Festplattenpfad für eine lokale Datei |
pdfviewer: of_print_to_pdf | schrieb die Seite um den Betrachter, nicht das Dokument | -4, nichts wird geschrieben: Kopieren Sie die Datei von is_source |
pdfviewer: file://localhost/C:/…, file:////server/freigabe/… | ein falscher Pfad, nicht gefunden | C:\… und \\server\freigabe\… |
pdfviewer: der der Komponente gegebene Fokus (Tab, of_focus_webview) | blieb auf der Seite: die Tasten scrollten das Dokument nicht | geht an das Dokument: Bild ab, Pfeile, Pos1 / Ende scrollen es |
Das Rezept: (1) ein Aufruf uo_pdf.of_refresh() kompiliert unverändert; prüfen Sie den Rückgabewert, wenn Sie wissen wollen, dass es nichts erneut zu lesen gab; (2) ein Dokument von mehr als 1,5 MB im Speicher wird in eine temporäre Datei geschrieben und dann über seinen Pfad angezeigt; (3) erwarten Sie in ue_link_clicked auch ein mailto: und einen Festplattenpfad, nicht nur eine Webadresse; (4) um das angezeigte Dokument zu kopieren, kopieren Sie die Datei von is_source statt of_print_to_pdf.
11.28 codeeditor: eine sichtbare Suche, ein „Gehe zu“, das die Einfügemarke bewegt, Ersetzen #
Die zweite Überprüfung des Code-Editors (codeeditor) holt auf den Bildschirm, was die Suche findet, behält die Einfügemarke des Benutzers während einer Suche, benennt ii_doc_line um und ergänzt, was man von einem Skripteditor erwartet: Ersetzen, die Einfügemarke steuern, wissen, ob gespeichert werden muss, einen Fehler in der Leiste zeigen. Keine Ereignissignatur ändert sich.
| Was | 3.0 | 4.0 |
|---|---|---|
codeeditor: ii_doc_line | ein long mit integer-Präfix | il_doc_line: benennen Sie es um; eine Zeile hinter dem Textende markiert nichts mehr (sie wird so zurückgelesen, wie sie geschrieben wurde) |
codeeditor: of_find bei ib_search_enabled = false | 0, ohne etwas zu suchen | -4 |
codeeditor: of_find("") | startete die vorige Suche erneut | leert das Feld und entfernt die Hervorhebungen, ohne ue_find_result |
codeeditor: of_find, Eingabe in der Leiste | der Treffer blieb oft außerhalb der Ansicht; die Einfügemarke ging darauf | der Treffer wird auf den Bildschirm geholt; die Suche beginnt an der Einfügemarke, die sich erst beim Schließen der Leiste bewegt (Esc) |
codeeditor: of_insert_text bei offener Suchleiste | ersetzte den gefundenen Treffer außerhalb der Ansicht und leerte den Strg+Z-Verlauf | fügt an der Einfügemarke des Benutzers ein, auf den Bildschirm geholt; Strg+Z macht es rückgängig |
codeeditor: ein neues is_text | behielt die Scrollposition des vorigen Dokuments; ein reiner CR-Text wurde in LF zurückgelesen | wird ab seiner ersten Zeile angezeigt und entfernt die Markierungen; reines CR wird in CR zurückgelesen (eine Mischung in CRLF) |
codeeditor: ib_current_line mit ib_wrap | kein Band | das Band deckt die ganze Zeile der Einfügemarke ab |
| codeeditor: Neuerungen | — | Ersetzen (of_replace, of_replace_all, Strg+H) und Suchoptionen (ib_find_match_case, ib_find_whole_word, ib_find_regex, F3); Einfügemarke und Auswahl (il_caret_line, il_caret_column, of_select_range, of_selected_text, of_line_count); ib_modified; Markierungen in der Leiste (of_add_marker, of_remove_marker, of_clear_markers, of_marker_count) |
Das Rezept: (1) ersetzen Sie ii_doc_line durch il_doc_line; (2) prüfen Sie das -4 von of_find, wenn die Suche abgeschaltet sein kann; (3) um „zur Zeile“ eines Fehlers zu gehen und dabei die Einfügemarke zu bewegen, setzen Sie il_caret_line (und of_add_marker, um ihn zu zeigen) — il_doc_line markiert nur; (4) wenn Sie ue_caret_changed verfolgten, um zu erfahren, wo ein Ausschnitt eingefügt wurde, lesen Sie il_caret_line nach of_insert_text; (5) eine Schaltfläche Speichern kann ib_modified folgen, das Sie nach dem Speichern auf false zurücksetzen.
11.29 jsontree und xmltree: die Tastatur bleibt beim Baum, eine Suche, die die Auswahl nicht mehr verschiebt #
Die zweite Überprüfung des JSON-Baums (jsontree) betraf die Engine, die er mit dem XML-Baum (xmltree) teilt: das Folgende gilt für beide, sofern nicht anders angegeben. Keine Signatur ändert sich; der JSON-Baum erhält of_expand_path, of_collapse_path, of_is_expanded, of_copy und das Ereignis ue_node_toggled, das durch eine Geste des Benutzers wie durch of_expand_path und of_collapse_path ausgelöst wird.
| Was | 3.0 | 4.0 |
|---|---|---|
| jsontree, xmltree: Eingabe auf einem Blatt | an das Fenster weitergegeben: seine Standardschaltfläche wurde ausgelöst | bleibt beim Baum, löst ue_node_clicked wie ein Klick aus; ohne Auswahl nichts |
| jsontree, xmltree: Esc bei offenem Suchfeld | die Schaltfläche Abbrechen des Fensters wurde ausgelöst | schließt zuerst das Feld; bei geschlossenem Feld geht Esc an das Fenster |
jsontree, xmltree: schließende Zeilen (}, ], </x>) | per Pfeiltasten erreichbar (ue_selection_changed für einen schon gemeldeten Block); ein Klick scrollte zur öffnenden Zeile zurück | von der Tastatur übersprungen; ein Klick wählt den Block ohne die Ansicht zu bewegen |
| jsontree, xmltree: Pfeil rechts auf einem Blatt | ging eine Zeile nach unten | tut nichts, wie in einem Baum |
| jsontree, xmltree: eine Suche während einer Auswahl | of_search_next oder Esc konnten die gewählte Zeile einklappen und die Auswahl ohne Ereignis verschieben | die ausgewählte Zeile bleibt sichtbar und ausgewählt: of_selected_path ändert sich nicht |
jsontree: die Meldung von ue_error | halb übersetzt, halb Englisch („Ungültiges JSON : Unexpected end of JSON (line 1, column 6)“) | vollständig in der Anzeigesprache, Zeile und Spalte eingeschlossen: vergleichen Sie seinen Text nicht |
| jsontree, xmltree: ein Dokument mit mehr als 1.500.000 Zeilen | angezeigt, aber sein Ende unerreichbar, ohne Hinweis | abgelehnt: eine Meldung im Baum und ue_error |
| jsontree: Strg+C im Baum | kopierte nichts und ging als Fensterkürzel weiter | kopiert die Auswahl (wie of_copy); ohne Auswahl bleibt das Kürzel beim Fenster |
Das Rezept: (1) wenn ein Fenster darauf baute, dass Eingabe im Baum seine Standardschaltfläche auslöst, fügen Sie diesen Schritt in ue_node_clicked ein; (2) suchen Sie in ue_selection_changed keinen leeren Schlüssel mehr (eine schließende Zeile wird nicht mehr ausgewählt); (3) werten Sie den Text von ue_error nicht aus: er folgt der Sprache; (4) um die Faltungen eines Benutzers wiederherzustellen, lesen Sie of_is_expanded und setzen Sie sie mit of_expand_path / of_collapse_path erneut.
11.30 xmltree: jede Zeile hat ihren XPath, jeder XPath wählt aus #
Die zweite Überprüfung des XML-Baums (xmltree) übernimmt alles, was der vorige Abschnitt über die gemeinsame Engine sagt. Sie fügt hinzu, was XML eigen ist: ein Pfad, der IMMER den Knoten der Zeile bezeichnet, unverändert von n_pbt_xml lesbar. Keine Signatur ändert sich; der XML-Baum erhält of_selected_xml, of_copy, of_expand_path, of_collapse_path, of_is_expanded und das Ereignis ue_node_toggled.
| Was | 3.0 | 4.0 |
|---|---|---|
| xmltree: Pfad einer Text-, Kommentar- oder Verarbeitungsanweisungszeile | der ihres Elements (während of_selected_value ihren eigenen Text gab); "" vor der Wurzel | ihr eigener: /r/text()[2], /r/comment()[1], /r/processing-instruction('x')[1], /comment()[1] — n_pbt_xml.of_get_value liest dort denselben Wert |
| xmltree: Element, dessen Präfix mit einer anderen URI erneut deklariert ist, oder mit einem gleichnamigen Geschwister in einem anderen Namensraum | ein Pfad, der nichts fand, oder einen ANDEREN Knoten | *[local-name()='x' and namespace-uri()='urn:…'], das genau diesen Knoten bezeichnet |
xmltree : of_select_path | nur die genaue Form, die der Baum schreibt, sonst -5 | jeder XPath (//line[@sku='A'], /r/a[1]…): der erste gefundene Knoten wird ausgewählt, of_selected_path gibt danach den Pfad des Baums |
xmltree: die Meldung von ue_error | „Ungültiges XML : error on line 1 at column 11: …“; der Baum blieb leer | „Ungültiges XML : Zeile 1, Spalte 11 (…)“, in der Anzeigesprache; der Baum zeigt die Quelle, die fehlerhafte Zeile markiert |
xmltree: <?xml-stylesheet?> ohne XML-Deklaration | zweimal angezeigt | eine einzige Zeile |
n_pbt_xml: ein XPath mit @xml:lang | abgelehnt (unbekanntes Präfix xml), leerer Wert | gelesen: das Präfix xml ist von Haus aus gebunden, wie es die Norm verlangt |
| xmltree: Pfeil rechts auf einem Tag mit Attributen | Attribute waren nur mit der Maus erreichbar | durchläuft die Attribute einzeln (Pfeil links geht zurück), ein ue_selection_changed pro Schritt, dann geht es hinab |
| xmltree: Strg+C, Einklappen per Pfad | nichts; Strg+C ging als Kürzel an das Fenster | of_selected_xml, of_copy und Strg+C (das XML der Auswahl), of_expand_path, of_collapse_path, of_is_expanded (jeder XPath), ue_node_toggled (eine Geste, oder of_expand_path / of_collapse_path) |
Das Rezept: (1) wenn Sie von einer Text- oder Kommentarzeile über of_selected_path zu ihrem Element hinaufgingen, nehmen Sie das Elternteil des Pfads (was vor dem letzten / steht); (2) werten Sie den Text von ue_error nicht aus: er folgt der Sprache; (3) ein in 3.0 unter gemischten Namensräumen gespeicherter Pfad wird wiedergefunden, indem man ihn of_select_path übergibt, das jetzt jeden XPath annimmt, und dann of_selected_path zurückliest.
11.31 xml: Ablehnungen, die sich melden, Namensräume, die halten #
Die zweite Überprüfung von n_pbt_xml ändert keine Signatur. Sie lässt of_remove den Codes der Bibliothek folgen, lehnt ein Lesen ab, solange ein gebautes Dokument ein offenes Element hat, und lässt Namensräume halten: was ein Mutator schreibt, wird im richtigen Namensraum zurückgelesen oder mit Begründung abgelehnt.
| Was | 3.0 | 4.0 |
|---|---|---|
xml: of_remove(""), of_remove ohne geladenes Dokument, Seite ohne Antwort | 0, wie „nichts entfernt“ | -5; -4; -2 — die Anzahl (>= 0) nur, wenn das Entfernen versucht wurde |
xml: ein Lesen (of_exists, of_count, of_get_value, of_is_valid…) oder eine Änderung, während ein gebautes Element noch offen ist | das Dokument wurde so geladen, und der Rest des Baus begann ein NEUES Dokument: das Vorherige ging ohne Fehler verloren | abgelehnt: -4, leer oder false, und is_last_error = „the document is still being built : close its elements first“; nichts geht verloren (of_xml und of_pretty bleiben verfügbar) |
xml: of_add_xml unter einem Element mit Standard-Namensraum oder mit dem Präfix des Ziels (<s:Item/> unter s:Body) | das Fragment blieb außerhalb des Namensraums (xmlns=''), unsichtbar für den XPath, mit dem es hinzugefügt wurde; das Präfix des Ziels wurde abgelehnt (-4) | das Fragment erbt die am Ziel geltenden Namensräume, wie of_add_child |
xml: of_set_attr / of_add_child mit einem präfigierten Namen (xsi:type, p:item) | 0, ein Attribut außerhalb des Namensraums, das der XPath nicht fand; mit nicht deklariertem Präfix ein Dokument, das sich nicht mehr laden ließ | im Namensraum des Präfixes (am Knoten deklariert oder mit of_register_namespace gebunden); -4 und „undeclared prefix : xsi“, wenn es nirgends gebunden ist |
xml: of_pretty nach einem of_add_child unter einem präfigierten Elternteil (s:Body) | <Item> ohne Präfix: zurückgelesen außerhalb des Namensraums | <s:Item>, wie in of_xml |
xml: of_element_attr zweimal mit demselben Namen; ein Name :x, x: oder a:b:c | zwei Attribute (fehlerhaftes Dokument); Name akzeptiert (ein Dokument, das sich nicht lädt) | ein Attribut mit dem zweiten Wert; Name abgelehnt (is_last_error), Element weggelassen |
xml: of_transform | wendet ein XSLT-Stylesheet auf das geladene Dokument an | entfernt: XSLT gibt es in der Engine nicht mehr (Chromium entfernt es); transformieren Sie serverseitig oder in PowerScript |
Das Rezept: (1) ein of_remove, das auf = 0 (nichts entfernt) prüfte, funktioniert weiter; prüfen Sie < 0 (nichts konnte versucht werden); (2) wenn Sie ein Dokument WÄHREND des Baus lasen (ein of_exists zur Kontrolle, ein of_count zum Nummerieren), schließen Sie zuerst seine Elemente oder zählen Sie selbst; (3) ein Fragment von of_add_xml muss den Namensraum seines Ziels nicht mehr deklarieren: eines, das xmlns='' schrieb, um ihn zu verlassen, kann es weiterhin; (4) prüfen Sie die Rückgabe von of_set_attr / of_add_child mit einem präfigierten Namen und deklarieren Sie das Präfix (oder binden Sie es mit of_register_namespace).
11.32 json: ein Array, das sich schnell aufbaut, Zahlen, die ihre Stellen behalten, ein leerer Text, der sich leer meldet #
Die zweite Prüfung von n_pbt_json entfernt und ändert keine Signatur. Sie fügt die Überladungen decimal und longlong von of_set_number und of_add_number sowie die Leser of_get_decimal und of_get_longlong hinzu. Ein Array mit of_add_* aufzubauen, durchläuft nicht mehr bei jedem Anhängen das ganze Array: 2.000 Zeilen entstehen in Sekundenbruchteilen statt in mehreren Minuten. Zwei Regeln stehen nun in der Dokumentation, unverändert: eine Null-Zeichenkette wird "" geschrieben (für ein JSON-null: of_set_raw(path, "null")), und ein doppelt geschriebener Schlüssel wird bei seinem ERSTEN Vorkommen gelesen.
| Was | 3.0 | 4.0 |
|---|---|---|
json: of_load eines Textes nur aus Leerraum (Zeilenumbruch, Tabulator) | -4, wie ein fehlerhafter Text | -5, wie ein leerer Text |
json: of_load eines Textes mit vorangestelltem BOM (UTF-8-Datei mit BOM) | -4 | 0, das BOM wird übersprungen |
json: of_load eines Dokuments mit mehr als 512 Verschachtelungsebenen | 0 — und ein sehr tiefer Text konnte die Anwendung beenden | -4, die Anwendung bleibt am Leben |
json: of_set_number / of_add_number eines decimal (oder eines Literals wie 690.50) | in ein double umgewandelt: etwa fünfzehn Stellen, ein Cent konnte verloren gehen | Überladung decimal: alle Stellen, abschließende Nullen entfernt (690.5); ein longlong hat ebenfalls eine eigene |
json: of_get_number eines Exponenten mit führenden Nullen (1E-0000005) | 0 oder ein riesiger Wert | der richtige Wert (0.00001) |
alle Komponenten: \u gefolgt von vier nicht hexadezimalen Zeichen in einer gelesenen Zeichenkette | die vier Zeichen verschwanden | unverändert behalten, wie eine unbekannte Escape-Sequenz |
Das Rezept: (1) wenn Sie of_load(...) = -4 prüften, um eine leere Datei zu erkennen, prüfen Sie < 0; (2) ein an of_set_number übergebener decimal-Betrag wird nun mit allen Stellen geschrieben, ohne Änderung an Ihrem Code; (3) lesen Sie eine ID mit mehr als 15 Stellen mit of_get_longlong, einen Betrag mit of_get_decimal, nicht mehr mit of_get_number.
11.33 crosstab: of_from_datastore, Ablehnungen, die sich melden, der angezeigte Wert beim Doppelklick #
Die zweite Prüfung des Crosstab benennt of_set_data in of_from_datastore um, den Namen von datagrid und scheduler, die einen DataStore auf dieselbe Weise lesen (gleiche Argumente, gleiche Codes). Jedes Hinzufügen, jeder Filter und jedes Format, das ein unbekanntes Feld nennt, gibt nun -5 statt 0 zurück. Die Tabelle zeichnet nur noch die sichtbaren Spalten: ein Kundencode oder ein Tagesdatum in Spalten friert den Bildschirm nicht mehr ein. Neu: is_thousands, CF_ICONS, die Konstanten VALUEFILTER_* und DATE_*.
| Was | 3.0 | 4.0 |
|---|---|---|
| crosstab: aus einem DataStore speisen | of_set_data(ds) | of_from_datastore(ds), gleiche Codes |
| crosstab: ein unbekanntes Feld (Tippfehler) an ein Hinzufügen, einen Filter, ein Format, eine Reihenfolge, eine Datumsgruppierung übergeben | 0, nichts geschieht | -5 |
crosstab: ein Filtertyp, ein Aggregat, ein Datumsteil außerhalb der Liste; eine berechnete Kennzahl in Zeilen; of_set_value_filter an einer Position ohne Kennzahl | 0; die Position rutschte auf die letzte Kennzahl | -5 |
crosstab: of_set_layout eines Textes, der kein JSON ist; of_remove_calc_field / of_remove_calc_measure eines unbekannten Namens | 0 | -5 |
crosstab: ad_value von ue_cell_double_clicked | das rohe Aggregat (400 unter „80,0 %“), 0 für eine leere Zelle | der angezeigte Wert (0.8), NULL für eine leere Zelle; ein leeres Element ist null in den Tupeln |
| crosstab: dasselbe Feld in Zeilen (oder Spalten, Filter) UND in Werte | hing von der Aufrufreihenfolge ab: der Wert verschwand; Entfernen einer Dimension entfernte alles | überall erlaubt; Hinzufügen oder Verschieben einer Dimension behält die Werte, Entfernen entfernt nur den gemeinten Chip |
| crosstab: ein leeres Element (NULL, leerer Text); ein Text mit Tabulator oder Zeilenumbruch im DataStore | „null“ oder eine Zeile ohne Beschriftung; Phantomzeilen, verschobene Spalten | ein einziges Element (leer), zuletzt; der Text bleibt in seiner Zeile |
crosstab: is_label nach einem neuen of_from_datastore; is_label = "" | verloren; ein Chip ohne Text | behalten; "" stellt die Kopfzeile des DataWindow wieder her |
| crosstab: Strg+C im Demomodus | ue_copy ausgelöst, Zwischenablage beschrieben | wie ein Export abgelehnt, das Raster sagt es |
crosstab: of_collapse_all; Elementfilter des Rasters; of_export_xlsx über 16 384 Spalten; Exporte in VALUES_ROWS | nur Zeilen; bei jedem Kästchen angewendet; eine unlesbare Datei; die Kennzahlen nebeneinander | Zeilen und Spalten; bei OK angewendet (höchstens 10 000 Elemente gelistet); abgelehnt, ue_xlsx_saved sagt warum; wie am Bildschirm |
Das Rezept: (1) ersetzen Sie of_set_data durch of_from_datastore; (2) wenn Sie den Rückgabewert von of_add_*_field oder eines Filters ignorierten, prüfen Sie < 0 — ein Tippfehler zeigt sich endlich; (3) prüfen Sie in ue_cell_double_clicked IsNull(ad_value) vor jeder Berechnung und lesen Sie ad_value als den angezeigten Wert (ein Anteil, keine Summe, in einem „%“-Modus).
11.34 Gemeinsamer Sockel: of_count und of_keys_at zählen in long #
of_count lieferte einen integer, und of_keys_at nahm einen integer-Rang — bei allen Komponenten, ihren Handles und den nicht visuellen Objekten, die sie tragen (commandpalette, messagebox, speechout, toaster). Jenseits von 32 767 Elementen lief die Zählung über: Ein Kalender (scheduler), der aus einem DataStore mit 40 000 Zeilen gespeist wird, ließ sich nicht mehr zählen, und seine letzten Zeilen ließen sich nicht durchlaufen. Die vier Signaturen sind jetzt in long: long of_count ( ), long of_count ( string as_keys ), string of_keys_at ( long al_index ), string of_keys_at ( string as_keys, long al_index ).
Das Rezept: Ein Aufruf ändert sich nicht. Eine integer-Variable, die of_count() empfängt, bleibt bis 32 767 richtig: Deklarieren Sie sie als long. Ein Nachkomme, der of_count oder of_keys_at überschrieb, übernimmt die neue Signatur — der Compiler zeigt Ihnen die Zeile.
11.35 shellexplorer: ein Neulesen, das den Zustand behält, jede Zeile für sich #
Die Überprüfung des Shell-Explorers behält seine Ereignisse: of_select, of_expand und of_collapse lösen sie wie ein Klick aus, wie in 3.0. of_refresh und ib_show_files schließen den Baum nicht mehr. Neu: is_file_filter (die gezeigten Dateien), ib_show_hidden (ausgeblendete Elemente, standardmäßig die Explorer-Einstellung), ib_enabled und of_refresh(Pfad), das einen einzigen Zweig neu liest.
| Was | 3.0 | 4.0 |
|---|---|---|
shellexplorer: of_refresh() oder geändertes ib_show_files | der Baum schloss sich, die Auswahl verschwand ohne Ereignis | die offenen Zweige und die Auswahl kehren zurück, über ihre Pfade gefunden; eine nicht mehr existierende Auswahl löst ue_selected("", "") aus |
shellexplorer: of_expand, of_select, of_collapse mit leerem Pfad | 0 | -5 |
shellexplorer: of_expand einer Datei oder eines Ordners ohne Kinder | nichts | ue_path_not_found(…, "expand", "not a branch") |
shellexplorer: of_keys_at(Pfad, i) | Pfad/Kind, das nichts zurücklesen konnte | der Pfad des Kindes, vollständig: Er geht zurück in of_has, of_select, of_expand |
| shellexplorer: derselbe Ordner auf zwei Ebenen (die Musik des Desktops und die des Benutzerordners) | ein Klick, ein Pfeil oder ein Doppelklick auf die eine wirkte auf die andere | jede Zeile antwortet für sich |
| shellexplorer: ausgeblendete Dateien und Ordner | nie gezeigt | gezeigt nach der Explorer-Einstellung des Arbeitsplatzes oder ib_show_hidden |
| shellexplorer: ein Zweig auf einer Freigabe, die nicht antwortet | „…“ für immer, auch geschlossen und wieder geöffnet | ue_error „… : timeout“ nach 30 Sekunden; der Zweig wird beim erneuten Öffnen neu angefragt |
Das Rezept: (1) ue_selected und ue_expanded werden auch nach einem of_select oder of_expand Ihres Codes ausgelöst, sobald der Ordner erreicht ist (ein noch zu lesender Pfad kommt etwas später): Erledigen Sie Ihre Arbeit im Ereignis, nicht gleich hinter dem Aufruf, oder lesen Sie of_selected_key(), sobald die Auswahl da ist; (2) behandeln Sie in ue_selected as_path = "" (die Auswahl ist verschwunden); (3) prüfen Sie -5 bei leerem Pfad; (4) setzen Sie ib_show_hidden = false, wenn Ihre Benutzer ausgeblendete Elemente nie sehen sollen, gleich was ihr Explorer sagt.
11.36 commandpalette: jedes Objekt berührt nur seine Palette, ein Schließen, das sich immer meldet, die Sprache der Anwendung #
Es gibt immer nur eine Palette auf dem Bildschirm: öffnet ein zweites Palettenobjekt seine eigene, ersetzt sie die erste. Ein Objekt steht jetzt nur noch für seine Palette und sein Kürzel ein. ue_opened und ue_closed werden bei of_open / of_close weiter ausgelöst: Sie melden den Lebenszyklus des Fensters, keine Geste (dieselbe Regel wie bei den Audio- und Videoplayern). Neu: of_insert_command (ein Befehl an gewählter Position), of_anchor_under (die Palette unter einem Steuerelement, in Bildschirmpixeln) und auf dem Handle is_group, is_hint, is_keywords, is_icon.
| Was | 3.0 | 4.0 |
|---|---|---|
commandpalette: ue_closed | ohne Argument; gar nichts, wenn die Palette vor dem Erscheinen starb (sofort geschlossen oder ersetzt, Fenster verweigert) | ue_closed(string as_reason) folgt jedem of_open, das 0 geliefert hat: "", cancelled, failed oder blocked |
commandpalette: of_is_open, of_close, of_reset, das Zerstören eines Objekts, dessen Palette durch die eines anderen ersetzt wurde | antworteten TRUE für die Palette des anderen und schlossen sie | stehen nur für ihre Palette ein: FALSE, und nichts wird geschlossen |
| commandpalette: ein Objekt zerstören (oder zurücksetzen), dessen Kürzel ein anderes Palettenobjekt desselben Fensters übernommen hat | entfernte das Kürzel des anderen: die Taste antwortete nirgends mehr | das Kürzel des anderen bleibt |
commandpalette: of_register_shortcut einer Taste, die der Hook nicht benennt (ctrl+ù, win+k, space ohne Modifikator) | 0 („gesetzt“), und die Taste tat nie etwas | -5; das vorige Kürzel bleibt |
commandpalette: of_register_shortcut mit leerem is_shortcut und ohne gesetztes Kürzel | 0 | 2 |
commandpalette: of_add_command mit einem Schlüssel, der ein Komma enthält | 0 — und is_recent las ihn als zwei Befehle zurück | -5 |
| commandpalette: eine Gruppe, die in mehreren Schritten deklariert wird (File, Edit, dann File) | zwei Überschriften „File“ | nur eine, an der Stelle ihres ersten Auftretens; die Reihenfolge der Befehle bleibt in der Gruppe erhalten |
| commandpalette: die Suche und Akzente | preferences fand „Préférences“ nicht | Akzente zählen nicht |
| commandpalette: die Sprache | die Palette sprach Englisch, gleich was PBT_SetLanguage sagte | die Sprache der Anwendung; ein von Ihnen gesetztes is_placeholder wird nicht übersetzt |
| commandpalette: das auf einer Zeile gezeigte Kürzel, AZERTY-Tastatur; AltGr im Suchfeld | Strg+A wurde als Strg+Q gelesen; € (AltGr+E) startete den als Strg+Alt+E gezeigten Befehl | die Taste wird so gelesen, wie die DLL sie benennt; ein getipptes Zeichen ist nie ein Kürzel |
commandpalette: ein ohne ipo_owner (ganze Anwendung) gesetztes Kürzel vor dem Kürzel eines Fensters, auf derselben Taste | gewann auch in diesem Fenster | das Kürzel des Fensters geht vor |
commandpalette: POSITION_ABSOLUTE | ein Befehl mit dem Schlüssel x oder y schob die Palette an den Bildschirmrand; bei zwei Bildschirmen ging sie auf den des Fensters | il_x / il_y gelten, auf dem Bildschirm des angeforderten Punkts |
commandpalette: inv_pump | interne Variable, die öffentlich blieb | geschützt: sie gehört nicht zur API, nichts zu lesen oder zu schreiben |
commandpalette: ein Befehl, dessen Text __license zitiert | die Palette öffnete sich nicht (-5) | öffnet sich: nur ein als Schlüssel geschriebenes reserviertes Wort wird weiterhin abgelehnt |
Das Rezept: (1) Löst Ihr Code ue_closed() selbst aus, geben Sie einen Grund mit (""); ein Skript, das es nur empfängt, kompiliert unverändert; (2) Warteten Sie nach of_open auf ue_opened, behandeln Sie auch ue_closed("cancelled"), "failed", "blocked"; (3) prüfen Sie 2 und -5 bei der Rückgabe von of_register_shortcut; (4) benennen Sie einen Befehlsschlüssel um, der ein Komma enthält.
11.37 radialmenu: ein bloßer Schlüssel, der richtig zielt, ein offenes Rad, das der Anwendung folgt, eine lesbare Beschriftung #
Das Rad wird einmal gezeichnet, und die Anwendung läuft weiter, solange es angezeigt wird: Was Sie inzwischen ändern, zählt jetzt. Die Nabe schreibt nichts mehr aus (seit 3.0 hatte sie es nicht mehr getan, entgegen der Dokumentation): Der angezeigte Zweig zeigt seine vollständige Beschriftung.
| Was | 3.0 | 4.0 |
|---|---|---|
radialmenu: of_item mit einem bloßen Schlüssel (of_item("csv")) | änderte Beschriftung und Zustand des einzigen Zweigs, der ihn trug, aber seine Farben wurden nicht gezeichnet, und das Handle überlebte das Entfernen des Elternzweigs | wird in die vollständige Adresse (import/csv) aufgelöst: dasselbe Handle, Farben eingeschlossen, mit dem Elternzweig freigegeben. Mehrdeutig oder unbekannt: Das Handle ändert nichts |
| radialmenu: ein Handle auf eine noch nicht hinzugefügte Adresse | eine darüber gesetzte Farbe färbte den später an dieser Adresse hinzugefügten Zweig, selbst nach of_clear | schreibt nichts; of_clear vergisst alle Farben |
radialmenu: of_show | lieferte nichts | liefert ein long: 0 oder -2, wenn die Komponente nicht erzeugt ist |
radialmenu: of_show(-1, -1) | öffnete das Rad am Cursor | öffnet es am Punkt (-1, -1), wie jede negative Koordinate; am Cursor ist of_show() |
| radialmenu: ein Zweig, der entfernt, geleert, ausgegraut oder ausgeblendet wird, während das Rad offen ist | ließ sich noch wählen: ue_item_selected für einen verschwundenen Zweig | lässt sich nicht mehr wählen: ue_dismissed; of_clear, of_remove_item und of_reset schließen das offene Rad |
| radialmenu: Rechtsklick an anderer Stelle, während das Rad offen ist | das neue Rad ersetzte das alte ohne ue_dismissed | ue_dismissed für das alte, dann das neue Rad |
| radialmenu: lange oder leere Beschriftung | nach zwei Zeilen abgeschnitten und nirgends lesbar; leer ein Segment ohne Inhalt | der angezeigte Zweig zeigt sie vollständig; leer wird der Schlüssel angezeigt |
| radialmenu: Leserichtung von rechts nach links | der Kranz drehte sich im Uhrzeigersinn, ← ging zurück | der Kranz dreht sich andersherum, ← und → tauschen die Rollen |
Das Rezept: (1) of_show liefert ein long: ein bloßer Aufruf kompiliert unverändert; (2) ersetzen Sie of_show(-1, -1) durch of_show(); (3) machten Sie in ue_dismissed rückgängig, was Sie beim Öffnen gesetzt hatten, ist nichts zu tun: Es kommt jetzt auch, wenn ein Rad ein anderes ersetzt; (4) ein Handle über einen Schlüssel, den zwei Zweige tragen, ändert nichts mehr: Geben Sie die Adresse an.
11.38 toaster: Events, die sagen, welcher Toast, Ablehnungen, die sich melden, ein Toast, der wartet, bis er gesehen wird #
Die drei Toast-Events ändern ihre Signatur, of_add_button liefert einen Code, und ein Toast geht nicht mehr verloren, wenn die Anwendung minimiert ist.
| Was | 3.0 | 4.0 |
|---|---|---|
toaster: ue_toast_clicked, ue_toast_action, ue_toast_dismissed | (string as_key …): as_key trug den Bezeichner des Toasts, als Text | (long al_id, string as_key …): al_id ist die von of_show gelieferte Zahl, as_key der is_key des Toasts (leer ohne Schlüssel) |
toaster: of_add_button | lieferte die Anzahl der Schaltflächen; ein bereits vergebener Schlüssel, ein leerer Schlüssel und eine vierte Schaltfläche gingen wortlos durch | liefert 0; -5 ohne Hinzufügen bei leerem, bereits vergebenem Schlüssel, einem mit / oder senkrechtem Strich, oder einer vierten Schaltfläche. Die Anzahl liest of_count() |
toaster: of_show mit einer Einstellung außerhalb des Bereichs | zeigte trotzdem an: eine unbekannte Art als Information, eine unbekannte Ecke oben links | liefert -5 und zeigt nichts: is_kind, is_position oder is_sound außerhalb ihrer Konstanten, il_max_visible außerhalb 0 bis 20, il_timeout unter TIMEOUT_AUTO |
toaster: derselbe is_key von zwei Toastern gezeigt | der zweite ersetzte den Toast des ersten und nahm ihm seine Events; eine Aktualisierung behielt die ursprüngliche Ecke | jeder Toaster hat seinen eigenen; eine Aktualisierung übernimmt auch Ecke, Bildschirmverankerung und Ankerfenster |
| toaster: der Klang | ein Systemklang bei jedem Toast, Information und Erfolg eingeschlossen; keiner für einen Toast aus der Warteschlange | is_sound: SOUND_AUTO (Standard) = nur Fehler und Warnung, SOUND_ALWAYS, SOUND_NEVER; gespielt, wenn der Toast angefordert wird, auch wenn er auf Platz wartet |
toaster: am Bildschirm verankerte Toasts aus zwei Fenstern oder ohne ipo_owner | landeten genau übereinander; die Obergrenze zählte je Fenster | ein Stapel je Monitor und Ecke, und il_max_visible zählt je Monitor |
| toaster: ein Toast an einem minimierten Fenster | landete bei -32 000 px und erlosch ungesehen | wartet: Er wird nicht angezeigt, und sein Countdown läuft erst, wenn das Fenster zurückkommt |
| toaster: ein Toast, der ankommt, während der Stapel überfahren wird | zählte herunter und konnte während des Lesens verschwinden | startet angehalten, wie die anderen |
toaster: PBT_SetLanguage, PBT_SetDefaultTheme, PBT_SetDefaultThemeAccent, PBT_SetDefaultFont, PBT_SetFlowDirection, während ein Toast angezeigt wird | erreichten ihn nicht; die Schriftgröße blieb 11 pt | folgen sofort, Schriftgröße eingeschlossen |
| toaster: der Text eines Toasts | ließ sich nicht markieren; das Ziehen der Bildlaufleiste eines langen Textes konnte antworten und schließen | lässt sich markieren und kopieren (Rechtsklick, Kopieren); Markierung und Bildlaufleiste schließen den Toast nicht mehr |
toaster: il_button_count | öffentliche Variable | privat: lesen Sie die Anzahl der Schaltflächen mit of_count() |
toaster: ein Toast, dessen Text __license zitiert | wurde nicht angezeigt | wird angezeigt: nur ein als Schlüssel geschriebenes reserviertes Wort wird weiterhin abgelehnt |
toaster: of_close eines angezeigten Toasts | kein Ereignis | ue_toast_dismissed, wie sein Kreuz; ein noch wartender, nie gesehener Toast löst nichts aus |
Das Rezept: (1) Fügen Sie long al_id als erstes Argument Ihrer ue_toast_clicked, ue_toast_action und ue_toast_dismissed hinzu und ersetzen Sie Long(as_key) durch al_id; as_key ist jetzt der Schlüssel des Toasts; (2) wenn Sie die Rückgabe von of_add_button als Anzahl der Schaltflächen gelesen haben, lesen Sie of_count(); (3) um einen Klang bei Information oder Erfolg zu behalten, setzen Sie is_sound = SOUND_ALWAYS.
11.39 messagebox: ein leeres Pflichtfeld wird nie bestätigt, Auswahlen mit eindeutigen Schlüsseln #
Fünf Verhaltensweisen ändern sich; keine Signatur.
| Was | 3.0 | 4.0 | |
|---|---|---|---|
messagebox: ib_input_required und eine Standardschaltfläche mit Countdown (of_add_button_timed) | der automatische Klick bestätigte das Dialogfeld bei leerem Feld (of_show lieferte die Schaltfläche, of_input_value eine leere Zeichenkette) | der Countdown läuft ab, ohne zu klicken; die Schaltfläche wartet, bis das Feld ausgefüllt ist | |
| messagebox: Esc oder Alt+F4 bei einer Schaltfläche, die zugleich Standard und Abbrechen ist, Pflichtfeld leer | lieferte 1, wie ein Klick auf diese Schaltfläche | liefert 0: ohne Auswahl geschlossen | |
messagebox: of_add_choice | akzeptierte einen bereits vergebenen oder / bzw. ` | ` enthaltenden Schlüssel | liefert -5 und fügt nichts hinzu |
messagebox: of_choose ohne jede Auswahl | zeigte ein Dialogfeld mit einer einzigen Abbrechen-Schaltfläche | zeigt nichts: leere Zeichenkette, und of_get_last_error meldet „no choice to show“ | |
messagebox: die Schaltflächen der fertigen Dialogfelder (of_info, of_confirm, of_yes_no, of_prompt…), wenn die Anwendung keine Sprache gesetzt hat | „Ok“ | „OK“, das Wort des englischen Katalogs („Cancel“, „Yes“, „No“ für die anderen) |
Das Rezept: (1) Ein Pflichtfeld wird jetzt von Hand bestätigt — wenn Sie sich auf den automatischen Klick verlassen haben, geben Sie dem Feld einen Standardwert (is_input_value); (2) geben Sie jeder Auswahl einen eindeutigen Schlüssel ohne / oder |, und prüfen Sie auf -5, wenn Ihre Schlüssel aus Daten stammen.
11.40 Gemeinsamer Sockel: die standardmäßig angegebene Sprache, die Dezimalzahlen jedes Rechners #
Zwei Korrekturen des gemeinsamen Sockels, gültig für alle Komponenten; keine Signatur ändert sich.
| Was | 3.0 | 4.0 |
|---|---|---|
die Sprache, die eine Komponente angibt (<html lang>) | Französisch, solange die Anwendung keine Sprache wählte | Englisch, die Standardsprache der Komponenten; die von der Anwendung gewählte Sprache ersetzt sie immer |
eine Dezimalzahl, die einer Eigenschaft (id_*) übergeben wird | nur ein Dezimalkomma wurde umgewandelt: auf einem Rechner mit einem anderen Dezimaltrennzeichen kam der Wert nicht an | das Dezimaltrennzeichen des Rechners wird umgewandelt, welches es auch ist |
Das Rezept: nichts zu ändern. Eine Anwendung, die ihre Sprache wählt, sieht sie weiterhin angewendet; ein Bildschirmleser, der eine Komponente einer englischen Anwendung auf Französisch vorlas, liest sie jetzt auf Englisch.
11.41 Tastatur, Fokus und Platz: was die Tests der 4.0 richtiggestellt haben #
Verhaltensweisen, die beim Durchspielen der Komponenten in einer echten Anwendung aufgefallen sind; keine Signatur ändert sich, eine Methode kommt hinzu.
| Was | 3.0 | 4.0 |
|---|---|---|
Enter auf einem fokussierten PowerBuilder-CommandButton | nichts (die Taste ging verloren) | die Schaltfläche wird gedrückt (clicked), wie in einem Windows-Dialogfeld; die Standardschaltfläche einer Leiste nicht |
Eine deaktivierte Komponente (ib_enabled = false) | Tab blieb darauf stehen | sie verlässt die Tab-Reihenfolge; wieder aktiviert (oder of_reset), nimmt sie ihren Platz wieder ein |
Ein Strg-Kürzel auf einem Zeichen ohne eigene Taste (AZERTY: - auf der Taste 6, + mit Umschalt) | Strg+- fand sein Kürzel nie | nach der Taste das Zeichen des aktiven Layouts: Strg+-, Strg++, Strg+,, Strg+. lösen auf jeder Tastatur aus |
| Tippen in einem offenen Menü (Suche, unterstrichene Buchstaben) | eine Taste der oberen Reihe lieferte ihre Ziffer (AZERTY: - kam als 6 an) | das Zeichen des Layouts; ein unterstrichenes &1 reagiert weiterhin auf die Taste 1 |
Der Kalender der Datumsauswahl (toolbar) | nur mit der Maus | auch mit der Tastatur: Pfeile (Tag, Woche), Bild auf/ab (Monat), Pos1/Ende, Enter wählt, Esc schließt |
| Alt mit zwei Menübändern (oder Menüleisten) im selben Fenster, ohne Unterfenster dazwischen | das zuerst erzeugte | das dem Fokus auf dem Bildschirm nächstgelegene |
breadcrumb in einer sehr schmalen Leiste | das erste Segment gab nie nach: der aktuelle Ort schrumpfte auf nichts, der Pfad lief über | nach der Mitte gibt der aktuelle Ort bis auf einen Buchstaben und „…“ nach, dann das erste Segment; nichts verlässt die Leiste |
menubar: eine Auswahl mit der Maus im Aufklappmenü | der Fokus blieb auf der Leiste (Bearbeiten > Einfügen fügte nirgends ein) | der Fokus kehrt zum Steuerelement zurück, das ihn hatte |
ribbon: in ein Kombinationsfeld tippen und dann in seiner Liste wählen | zwei ue_combo_changed: der getippte Text, dann die Auswahl | eines, die Auswahl |
toolbar: is_text = "" in ue_text_changed gesetzt, der Fokus im Feld | der alte Text kam zurück, mit einem zweiten Ereignis | das Feld bleibt leer |
| Der Fokus, der nach einem Fenster der Bibliothek (Befehlspalette) an eine Komponente zurückgegeben wird | die Seite, ohne Element: der Cursor des Code-Editors war verschwunden | das Element, das ihn hatte |
Eine Beschriftung mit unterstrichenem Buchstaben (&File) von rechts nach links | Buchstaben durcheinander („ileF“) | das Wort liest sich in der richtigen Reihenfolge |
n_pbt_utils.of_dir_folders(as_dir, ref as_names[]) | DirList in eine ListBox: 4,5 s für 30 000 Ordner, und das aktuelle Verzeichnis der Anwendung änderte sich | neu: die Unterordner, wie der Explorer sie zeigt, sortiert, in einem Durchgang; -4 unlesbar, -5 leerer Pfad |
breadcrumb: of_add_children(as_keys, as_child_keys[], as_texts[]) | ein Zweig nach dem anderen (of_add_child): 30 000 Unterordner öffneten das Menü in über 20 s | neu: eine ganze Ebene in einem Aufruf |
Das Rezept: nichts zu ändern. Eine Anwendung, deren fokussierter CommandButton Enter ignorieren sollte, deaktiviert ihn (Enabled = false) oder nimmt ihm den Fokus; für einen umfangreichen Ordner ersetzen Sie die Schleife über of_add_child durch ein einziges of_add_children.
11.42 Daten und Tastatur: was die zweite Testreihe der 4.0 richtiggestellt hat #
Verhaltensweisen, die beim Durchspielen der Datenkomponenten in einer echten Anwendung aufgefallen sind; keine Signatur ändert sich.
| Was | 3.0 | 4.0 |
|---|---|---|
| Enter oder Esc in einer Komponente gedrückt, die sie nicht nimmt | verloren: der PowerBuilder-CommandButton Default oder Cancel löste nicht aus | die Taste geht an das PowerBuilder-Fenster zurück, wie Kapitel 6.4 verspricht: Esc drückt die Schaltfläche Cancel, Enter die Schaltfläche Default |
PBT_SetLanguage, sofort gefolgt von einem Befehl an die Komponente | der Text eines durch diesen Befehl ausgelösten Ereignisses (ue_error von xmltree) blieb in der alten Sprache | die Sprache gilt ab dem nächsten Befehl |
jsontree, xmltree: der der Komponente gegebene Fokus (of_focus_webview, die Tab-Taste) | blieb auf der Seite: Pfeiltasten und Enter gingen ins Leere | der Baum nimmt ihn; F3 und Umschalt+F3 gehen zum nächsten oder vorherigen Treffer der Suche |
xmltree: ein NACH dem letzten Zeichen seiner Zeile gemeldeter Fehler | keine Spalte unterstrichen | das Zeilenende ist markiert (↵) |
codeeditor mit Zeilenumbruch (ib_wrap) | der Balken il_doc_line konnte eine Reihe zu hoch sitzen, am Ende der vorherigen Zeile | die Balken decken alle Reihen ihrer Zeile ab und folgen der Größenänderung |
codeeditor: „Alle ersetzen“ und of_replace_all auf einem langen Text | mehrere Sekunden, wenn der Fokus im Editor war; darüber hinaus konnte of_replace_all 0 liefern | sofort, und die Zahl der Ersetzungen wird geliefert; Strg+H mit leerer Suche setzt den Cursor in „Suchen“ |
crosstab: „Zu Spalten hinzufügen“ (oder Zeilen, Filtern) aus dem Menü eines Chips, per Tastatur | der Fokus ging verloren; nur Enter öffnete das Menü eines Chips | der Fokus folgt dem Chip in seine neue Zone; Umschalt+F10 und die Menütaste öffnen sein Menü ebenfalls |
json: Tausende of_add_* hintereinander | fast eine Sekunde für 2 000 Zeilen | einige zehn Millisekunden; das Dokument ist dasselbe |
Das Rezept: nichts zu ändern. Eine Anwendung, die in einer Komponente gedrücktes Esc selbst behandelte (ein mit of_register_shortcut registriertes Kürzel), behält es: ein Kürzel kommt vor dem Fenster.
11.43 Inhalte und Medien: was die dritte Testreihe der 4.0 richtiggestellt hat #
Verhaltensweisen, die beim Durchspielen der Inhalts- und Medienkomponenten in einer echten Anwendung aufgefallen sind; keine Signatur ändert sich.
| Was | 3.0 | 4.0 |
|---|---|---|
speechout: of_speak, dann of_pause im selben Skript | ue_started und das erste ue_sentence kamen vor ue_paused: die Stimme wurde als gestartet gemeldet | ue_started wird ausgelöst, wenn die Stimme wirklich zu sprechen beginnt; eine vorher gesetzte Pause hält sie: bis of_resume wird nichts gesprochen oder gemeldet |
speechout: eine Sprache ohne genaue Stimme auf dem Rechner (fr-CA, wo es nur fr-FR gibt) | ue_started meldete die angeforderte Sprache (fr-CA) | ue_started meldet die wirklich gelesene Sprache (fr-FR), nach ue_voice_fallback |
webbrowser: Tab nach dem letzten Steuerelement der Adressleiste | der Fokus verließ die Komponente zum PowerBuilder-Fenster | der Fokus geht in die Website, wie in einem Browser; Umschalt+Tab aus der Website führt zur Leiste zurück |
webbrowser: ib_private = true gesetzt, während bereits privat navigiert wird | wirkungslos: die Website fand wieder, was sie in der privaten Sitzung behalten hatte | jedes Mal eine neue, leere private Sitzung |
video im Vollbild: ein modales Fenster der Anwendung (eine MessageBox in ue_ended) | unter dem Film verborgen, der ihr die Tastatur wieder wegnahm: die Anwendung schien eingefroren | der Film gibt nach: das Fenster kommt nach vorn und erhält die Tastatur; nach dem Schließen übernimmt der Film wieder den Bildschirm, und Esc verlässt ihn |
tilesbox: eine Pfeiltaste am Rand, neben einer kleineren Kachel | Pfeil nach oben auf einer großen Kachel der ersten Reihe sprang seitlich zur kleinen Nachbarin | nur eine Kachel vollständig jenseits des Rands zählt: am Rand bleibt der Fokus, wo er ist |
dockcontainer: il_back_color / il_text_color eines gestapelten Bereichs | verloren, sobald sein Reiter aktiv war (er nahm den Akzent des Themas) | der aktive Reiter behält die Farben des Bereichs, wie seine Lasche auf der Leiste |
progressbar: id_value bei jedem Durchlauf einer langen Schleife gesetzt | etwa 2,5 s für 20 000 Zeilen | deutlich unter einer Sekunde; der Balken bewegt sich weiterhin während der Schleife |
Das Rezept: nichts zu ändern. Eine Anwendung, die sich auf ue_started verließ, um zu wissen, dass of_speak angenommen wurde, liest stattdessen seinen Rückgabewert (0); eine, die die Sprache von ue_started mit is_lang vergleicht, erfährt den Ersatz nun auch aus diesem Unterschied, zusätzlich zu ue_voice_fallback.
11.44 Daten: eine Zelle lesen, feiner sortieren und suchen (json, jsontree, xmltree, crosstab) #
Diese Ergänzungen der 4.0 entfernen keine Signatur. Zwei ändern, was Sie sehen, ohne dass Sie etwas geschrieben haben: Strg+C der Kreuztabelle kopiert nun die Überschriften mit, und ue_cell_double_clicked erhält ein Argument mehr.
| Was | 3.0 | 4.0 |
|---|---|---|
crosstab: ue_cell_double_clicked | ( string as_row_tuple_json, string as_col_tuple_json, double ad_value ) | ( string as_row_tuple_json, string as_col_tuple_json, integer ai_measure, double ad_value ): ai_measure ist die Position des doppelt angeklickten Werts in Werte, ab 1; mit den beiden Tupeln ist es die Adresse, die of_get_cell_value zurückliest |
crosstab: Strg+C auf Zellen | nur die Zahlen | die Überschriften dazu: die Namen der Spalten in einer ersten Zeile, das Element jeder Zeile (sein Pfad, „North / Boston“) in einer ersten Spalte; ib_copy_headers = false liefert nur die Zahlen |
crosstab: of_remove_field, of_get_cell_value | — | neu: ein Feld aus allen Bereichen nehmen, ohne das Layout neu aufzubauen; den Wert einer Zelle über ihre Tupel und die Position ihrer Kennzahl lesen |
json: of_get_array, of_pretty (long al_indent) | — | neu: alle Elemente eines Arrays in einem Aufruf; eine Einrückung in Leerzeichen, oder das Dokument kompakt in einer Zeile mit 0 |
jsontree, xmltree: die Suche | immer ohne Groß-/Kleinschreibung, und innerhalb von Wörtern | ib_find_match_case und ib_find_whole_word, wie beim codeeditor, mit den Schaltern Aa und ab des Suchfelds; standardmäßig bleibt die Suche die der 3.0 |
Das Rezept: ein Skript von ue_cell_double_clicked muss nichts ändern, das Argument kommt vor dem Wert hinzu. Eine Anwendung, die das Ergebnis von Strg+C in eine Verarbeitung einfügt, die nur Zahlen erwartet, setzt ib_copy_headers = false.
11.45 Navigation und Container: Registerkarten per Tastatur, Bereiche per Doppelklick (tab, dockcontainer, ribbon, stepbar, listbar) #
Diese Ergänzungen der 4.0 entfernen keine Signatur. Drei Gesten ändern, was ein Benutzer sieht, ohne dass Sie etwas geschrieben haben: der Mittelklick und Strg+Tab auf einem tab, und der Doppelklick auf einen Bereich eines dockcontainer oder auf die Titelleiste seines schwebenden Fensters.
| Was | 3.0 | 4.0 |
|---|---|---|
tab: Mittelklick auf eine Registerkarte | nichts | schließt eine schließbare Registerkarte auf demselben Weg wie ihr Kreuz: ue_tab_closing, wenn ib_veto_close = true, dann ue_tab_closed; eine nicht schließbare oder deaktivierte Registerkarte tut nichts |
tab: Strg+Tab, Strg+Umschalt+Tab, Strg+Bild ab / Bild auf | nichts | die nächste oder vorherige Registerkarte, die aktiv werden kann, im Kreis, ob die Tastatur im Band oder in einer gehosteten Seite ist (ein PowerBuilder-Steuerelement, eine andere Komponente); es ist eine Geste: ue_selection_changing, wenn ib_veto_selection = true, dann ue_selection_changed. Aus einem Steuerelement außerhalb des tab bleibt die Taste beim Fenster |
dockcontainer: Doppelklick auf eine Kopfzeile oder eine Registerkarte; auf die Titelleiste eines schwebenden Fensters | nichts; das schwebende Fenster wurde maximiert | koppelt den Bereich in ein schwebendes Fenster ab (ue_panel_floated); auf dessen Titelleiste dockt er ihn an seinem Platz wieder an (ue_panel_docked), wie sein Kreuz |
dockcontainer: Rechtsklick auf eine Kopfzeile oder eine Registerkarte | nichts | ein Menü Abkoppeln, Schließen, Andere schließen (die anderen schließbaren Bereiche derselben Gruppe); jedes Schließen stellt seine eigene Frage |
dockcontainer: ib_veto_close, ue_panel_closing, of_close_panel, n_pbt_dock_panel.ib_closable | — | neu: die Frage vor dem Schließen eines Bereichs (optional, standardmäßig false), das Schließen per Code (-4, wenn Sie ablehnen, -5 für den Hauptbereich oder einen nicht schließbaren Bereich) und die Schließbarkeit, live geändert |
ribbon: n_pbt_ribbon_item.is_image, id_min, id_max, id_step | beim Hinzufügen festgelegt | das Bild eines Steuerelements und der Bereich eines Drehfelds ändern sich live und lassen sich zurücklesen; der Wert eines Drehfelds wird ohne ue_value_changed in seinen neuen Bereich zurückgeholt, wie id_value |
stepbar: STATE_WARNING, STATE_SKIPPED, NAV_VISITED | — | neu: ein mit Warnung durchlaufener Schritt (bernsteinfarbener Punkt), ein übersprungener Schritt (gestrichelter Ring) und ein Modus, in dem jeder bereits erreichte Schritt anklickbar bleibt, nach einem Zurückgehen auch vorwärts |
listbar: n_pbt_listbar_section.ib_pinned | — | neu: ein unten an der Leiste angehefteter Abschnitt (Einstellungen, Hilfe), der beim Scrollen der Leiste sichtbar bleibt, auch in der Schiene; die gespeicherte Anordnung behält die Reihenfolge der Abschnitte |
Das Rezept: nichts zu ändern. In einer Seite eines tab wechselt Strg+Tab jetzt die Registerkarte, auch wenn der Fokus in einem Steuerelement der Seite ist, wie in einem Windows-Eigenschaftendialog. Um ein schwebendes Fenster des dockcontainer zu maximieren, bleibt seine Schaltfläche Maximieren.
11.46 Menüs: der Chevron der Menüleiste, eine Dropdown-Liste in der Symbolleiste, zehntausend Befehle (menubar, toolbar, commandpalette) #
Diese Ergänzungen der 4.0 entfernen keine Signatur. Ein Standardverhalten ändert sich: Eine zu schmale Menüleiste bricht nicht mehr um, sie klappt ihre letzten Titel in einen Chevron ein. Und of_open einer Befehlspalette verweigert das Öffnen ohne ipo_owner oder ipo_receiver nicht mehr.
| Was | 3.0 | 4.0 |
|---|---|---|
menubar: eine für ihre Titel zu schmale Leiste | brach um: ihre Höhe folgte den Zeilen, ue_auto_height bei jeder Breitenänderung | bleibt auf einer Zeile: Die Titel, die nicht passen, wandern vom Ende her in das Dropdown eines Chevrons (ihre Einträge als Kaskaden, Alt + ihr Buchstabe öffnet sie vom Chevron aus, die Pfeiltasten halten darauf wie auf einem Titel, links bei RTL); die Höhe ändert sich nicht mehr. ib_wrap = true stellt das frühere Verhalten wieder her |
menubar: ib_track_hover, ue_item_hover, of_add_header, n_pbt_menubar_menu.is_align | — | neu: der überfahrene Eintrag eines Dropdowns, für den Hilfetext einer Statusleiste (optional, standardmäßig false; eine leere Adresse beim Schließen), Abschnittsüberschriften in einem Dropdown und ein Menü am Ende der Leiste (ALIGN_END, Hilfe) |
toolbar: of_add_combo, of_add_combo_item, of_remove_combo_item, of_clear_combo, ue_combo_changed, n_pbt_toolbar_item.ib_editable | — | neu: eine Dropdown-Liste in der Leiste, bearbeitbar oder nicht, die in den Chevron eingeklappt funktionsfähig bleibt; ihr Event hat den Namen und die Bedeutung desjenigen des Menübands |
commandpalette: zwei Paletten auf demselben ipo_owner | teilten ihre Ereigniswarteschlange (eine konnte das ue_closed der anderen erhalten), und die zweite übernahm das Kürzel der ersten | jede ihre eigenen Events und ihr eigenes Kürzel; dasselbe Kürzel, von der zweiten registriert, geht an diese (1). of_open und of_register_shortcut liefern ohne ipo_owner oder ipo_receiver nicht mehr -5: die Events kommen immer an |
commandpalette: Tausende von Befehlen | jede Zeile gezeichnet: Öffnen und Tippen wurden langsamer | nur die sichtbaren Zeilen werden gezeichnet: 10.000 Befehle öffnen und filtern sich ohne Wartezeit |
| Tastenkürzel der ganzen Bibliothek: AltGr + eine Taste, die ein Zeichen schreibt (das Euro einer französischen Tastatur) | löste das Strg+Alt-Kürzel dieser Taste aus, auch in einem PowerBuilder-Feld | das Zeichen wird getippt, kein Kürzel wird ausgelöst; AltGr allein übergibt die Tastatur nicht mehr an eine Menüleiste oder ein Menüband |
Das Rezept: Eine Menüleiste, deren veränderliche Höhe gewollt war, setzt ib_wrap = true; eine Anwendung, die ihre Steuerelemente bei jeder Größenänderung in ue_auto_height neu anordnete, hat nach dem ersten Mal nichts mehr zu tun. Ein Anwendungskürzel auf Strg+Alt + einem Buchstaben, den die Tastatur des Benutzers mit AltGr schreibt, wird beim Tippen nicht mehr ausgelöst: Wählen Sie eine andere Taste.
11.47 Inhalt und Medien: ein Protokoll Zeile für Zeile, die tatsächliche Größe eines Bildes, ein Film, der wartet (statictext, picture, video) #
Diese Ergänzungen der 4.0 entfernen keine Signatur und ändern keinen Standardwert. Zwei Verhaltensweisen werden genauer: Der Zoom eines Bildes darf seine Obergrenze überschreiten, um die tatsächliche Größe zu erreichen, und ein Film einer URL, der ohne Netzwerk abgespielt wird, sagt es.
| Was | 3.0 | 4.0 |
|---|---|---|
statictext: of_append_text, ib_follow_end | — | neu: ein Protokoll, das Zeile für Zeile geschrieben wird — nur die hinzugefügte Zeile geht an die Komponente — und, als Option, die Ansicht, die unten bleibt, solange der Leser nicht nach oben scrollt |
statictext: ib_auto_width, ue_auto_width | — | neu: das Userobject übernimmt die Breite seines Textes (optional, standardmäßig false), wie ib_auto_height es für die Höhe tut |
picture: id_max_zoom, die Taste 1 | der Zoom hielt bei der 8.0-fachen Einpassung an, was auch geschah: ein großer, klein angezeigter Scan war nie Pixel für Pixel lesbar | die Obergrenze ist einstellbar (id_max_zoom, standardmäßig 8.0); die Taste 1 zeigt die tatsächliche Größe, und die Obergrenze steigt bis dorthin, wenn diese mehr verlangt |
video: ue_buffering, of_is_buffering | ein Film, der auf seine Daten wartete, blieb wortlos stehen | ein Ring in der Akzentfarbe des Themes dreht sich auf dem Bild, und ue_buffering(true) dann ue_buffering(false) rahmen das Warten ein |
video: ein Film einer URL, während der Arbeitsplatz kein Netzwerk hat | „diese Datei ist nicht auffindbar oder nicht abspielbar“, ue_failed mit REASON_UNSUPPORTED | „keine Netzwerkverbindung“ auf dem Bild, ue_failed mit REASON_NETWORK |
Das Rezept: nichts zu ändern. Ein Protokoll, das is_text bei jeder Zeile neu schrieb, wechselt zu of_append_text; Code, der REASON_UNSUPPORTED für einen Film einer URL ohne Netzwerk prüfte, prüft REASON_NETWORK.
11.48 Review vom 03.10.2026: eine wiederhergestellte Anordnung wird gemeldet, ein Export in einen relativen Pfad landet am richtigen Ort (toolbar, crosstab) #
Keine Signatur ändert sich. Zwei Verhaltensweisen richten sich nach der Regel der Bibliothek: Jede Änderung der Anordnung wird gemeldet, und ein relativer Schreibpfad wird wie bei den anderen Exporten aufgelöst.
| Was | 3.0 | 4.0 |
|---|---|---|
toolbar: of_set_layout | kein Event | löst ue_layout_changed aus, wie der dockcontainer und das datagrid: Jede Änderung der Anordnung wird gemeldet, ob sie vom Benutzer oder von Ihrem Code kommt |
crosstab: of_export_csv, of_export_xlsx in einen relativen Pfad | in den aktuellen Ordner des Augenblicks geschrieben — den ein DirList oder ein Dateidialog verschoben haben konnte; ue_csv_saved / ue_xlsx_saved lieferten den Pfad wie übergeben | in den Ordner geschrieben, in dem die Anwendung gestartet wurde, wie die anderen nativen Exporte; das Event liefert den vollständigen Pfad; ein Pfad, der vom aktuellen Ordner eines Laufwerks abhängt (\x, C:x), wird abgelehnt |
Das Rezept: Eine Anwendung, die die Anordnung in ue_layout_changed speichert, speichert nach of_set_layout denselben Wert erneut — folgenlos. Ein Export, der sich auf den aktuellen Ordner des Augenblicks verließ, gibt einen vollständigen Pfad an.