12. Von 4.0 auf 5.0 migrieren #
← Von 3.0 auf 4.0 migrieren · Inhalt · Versionshinweise →
5.0 ändert keine Signatur der siebenunddreißig Komponenten aus 4.0, auch kein Event — außer der Schaltflächenleiste (buttonbar, 12.7) und dem Event ue_link_clicked des Markdown-Viewers (markdownview), das ein zweites Argument erhält, as_kind (12.5). Drei Komponenten wechseln ihre Wörter. Der Fortschrittsbalken (progressbar) übernimmt die der Anzeigen — ib_label, il_color und is_label_format entfallen zugunsten von ib_show_value, il_value_color, is_format und is_unit (12.1). Das kartesische Diagramm (chartcartesian) schreibt seine Zahlen über is_format, wie die Anzeigen und das Kreisdiagramm: of_set_value_format und of_clear_value_format entfallen, und ii_point_count einer Reihe wird zu il_point_count (12.4). Die Kreuztabelle (crosstab) geht denselben Weg: of_set_value_format und of_clear_value_format entfallen zugunsten von is_format — auf dem Feld oder über of_value auf einem einzelnen Wert — und von ib_negative_red (12.8). Der Compiler zeigt Ihnen jede Zeile, die anzupassen ist. Die Seitenleiste (listbar) ändert ein Ereignis: ue_item_rclicked erhält zusätzlich den Bildschirmpunkt des Klicks, al_x und al_y (12.9). Das Kachel-Panel (tilesbox) benennt ein Ereignis um: ue_tile_context(as_keys) wird zu ue_tile_rclicked(as_keys, al_x, al_y), und die Position von of_move_tile und of_insert_tile wird zu long al_position (12.12). Das radiale Menü (radialmenu) verliert vier Tooltip-Eigenschaften, die es nie angezeigt hat — is_tooltip, is_super_tooltip_title, is_super_tooltip_text und is_super_tooltip_image (12.5). Der Kalender (scheduler) ändert drei Gesten-Events: ue_appointment_changing erhält as_kind, ue_appointment_moved und ue_appointment_resized erhalten die bisherigen Werte (12.10). Der Shell-Explorer (shellexplorer) ändert ein Ereignis: ue_error erhält zusätzlich den Pfad und einen konstanten Grund, as_path und as_reason (12.11). Der Rich-Text-Block (statictext) ändert ein Ereignis: ue_hyperlink erhält zusätzlich ab_opened, ob sich der Link wirklich geöffnet hat (12.5). Die Registerkarte (tab) ändert ein Ereignis: ue_tab_rclicked erhält zusätzlich den Bildschirmpunkt des Klicks, al_x und al_y (12.13). Der Soundplayer (soundplayer) ändert drei Ereignisse: ue_started, ue_ended und ue_failed erhalten zusätzlich die Nummer des Tons, al_sound (12.14). Der Toaster (toaster) ändert ein Ereignis: ue_toast_dismissed erhält zusätzlich den Grund des Schließens, as_reason (12.15). Der Webbrowser (webbrowser): of_go_back, of_go_forward und of_stop geben einen long zurück, und unter ib_veto_navigation wird eine vom Benutzer getippte Adresse bei ue_navigating erfragt (12.17). Die Symbolleiste (toolbar) ändert ein Ereignis: ue_item_rclicked erhält zusätzlich den Bildschirmpunkt des Klicks, al_x und al_y (12.18). Der Videoplayer (video) ändert eine Signatur: of_stop wird eine Funktion, die einen long zurückgibt (12.16) — ein als Anweisung geschriebener Aufruf kompiliert weiterhin. Drei Komponenten ändern ein Rechtsklick-Ereignis eines Elements, das zusätzlich seinen Bildschirmpunkt al_x, al_y erhält: die Schaltflächenleiste (ue_button_rclicked), der Brotkrumenpfad (breadcrumb, ue_item_rclicked) und das kartesische Diagramm (ue_point_rclicked); die Statusleiste (statusbar) liefert diesen Punkt wie die anderen, nicht mehr mit der Skalierung des Bildschirms multipliziert (12.19). Die Basis (12.20): Der Grund für das Scheitern einer nicht visuellen Komponente wird über of_get_last_error() gelesen — die Eigenschaft is_last_error verschwindet aus crypto, restclient, soundplayer, speechout, xml, u_pbt_regex und u_pbt_zip —, und of_stop, of_close und of_reset der nicht visuellen Komponenten liefern einen long.
Der Rest verlangt nichts von Ihrem Code: Das Datenraster (datagrid) und das Menüband (ribbon) erhalten numerische Eingabemasken, und der Editor einer numerischen Spalte des Rasters öffnet sich jetzt mit dem Text der Maske (12.2, 12.3). Die neuen Komponenten der 5.0 werden in den Versionshinweisen vorgestellt.
12.1 progressbar: die Wörter der Anzeigen #
5.0 bringt zwei Anzeigen, linear (gauge) und mit Zifferblatt (angulargauge). Auch ein Fortschrittsbalken zeigt einen Wert auf einer Skala: Die Bibliothek spricht dafür nur noch eine Sprache, und der Balken, der dasselbe mit anderen Worten sagte, übernimmt die Wörter der Anzeigen. Kein alter Name bleibt: weder eine Eigenschaft noch ein von of_set_property akzeptierter Name.
| Was | 4.0 | 5.0 |
|---|---|---|
| Ablesewert anzeigen | uo.ib_label = true | uo.ib_show_value = true |
| Farbe des Wertes (-1 = das Design, unverändert) | uo.il_color = RGB(…) | uo.il_value_color = RGB(…) |
| Ein Ablesewert, der den Wert schreibt | uo.is_label_format = "{value} of {max} rows" | uo.is_format = "#,##0" + uo.is_unit = "of 500 rows" |
| Der Prozentsatz (Standard, unverändert) | uo.is_label_format = "" | uo.is_format = "" |
| Steuern per Name | of_set_property("label", …), ("label_format", …), ("color", …) | ("show_value", …), ("format", …), ("unit", …), ("value_color", …) |
is_formatist ein PowerBuilder-Anzeigeformat, das auf den Wert angewendet wird ("#,##0","$#,##0.00"), mit den Trennzeichen der Anzeigesprache, genau wie bei den Anzeigen. Leer zeigt der Balken den Prozentsatz, wie bisher.- Die Platzhalter
{percent},{value},{min}und{max}gibt es nicht mehr. Eine Beschriftung, die Wert und Prozentsatz mischte ("{value} of {max} rows ({percent})"), hat keine genaue Entsprechung: Wählen Sie den Wert (Format und Einheit) oder den Prozentsatz (und eine Einheit). Das Maximum, das Ihr Code kennt, wird in die Einheit geschrieben. is_unitist neu: ein reiner Text, der nach dem Ablesewert geschrieben wird, durch ein Leerzeichen getrennt — nach dem Wert wie nach dem Prozentsatz.of_resetleert ihn.- Eine Maske mit
%schreibt den erledigten Anteil, nicht den Wert:is_format = "0.0%"ergibt „35.0%“ für 1.687 von 4.820 Zeilen, abgerundet wie der Prozentsatz — der Prozentsatz mit Nachkommastellen, den{percent}nicht schreiben konnte. - Ein pausiertes oder fehlgeschlagenes Warten wird zu einem vollen Balken. In 4.0 erstarrte ein Wartebalken (
ib_indeterminate), derSTATE_PAUSEDoderSTATE_ERRORerhielt, mitten im Gleiten, oft außerhalb seiner Spur: Der Fehler war nicht zu sehen. In 5.0 hält er als voller Balken (voller Ring) in der Statusfarbe an, wie die Windows-Taskleiste, und der Bildschirmleser meldet ihn nicht mehr als beschäftigt, sondern nennt seinen Status. of_set_property("tooltip", …)undsuper_tooltip_*liefern-5: Der Balken veröffentlicht keinen Tooltip, und der Weg über den Namen, der einen setzte, ist wie die Eigenschaften geschlossen.- Neu, ohne etwas anzupassen:
is_orientation(ORIENTATION_VERTICAL: ein senkrechter Balken anstelle einerVProgressBar),is_accessible_name(der Name, den der Bildschirmleser sagt) und der Text eines Wartens (nuris_unit, während der Balken wartet).
// 4.0 : the label wrote the value through placeholders
uo_progress.ib_label = true
uo_progress.il_color = RGB(/*red*/ 0, /*green*/ 120, /*blue*/ 215)
uo_progress.is_label_format = "{value} of {max} rows"
// 5.0 : the words of the gauges - a display format for the value, then a unit
uo_progress.ib_show_value = true
uo_progress.il_value_color = RGB(/*red*/ 0, /*green*/ 120, /*blue*/ 215)
uo_progress.is_format = "#,##0"
uo_progress.is_unit = "of 500 rows"
Das Rezept: Kompilieren Sie; jedes ib_label, il_color und is_label_format eines Fortschrittsbalkens wird gemeldet. Ersetzen Sie die ersten beiden durch ib_show_value und il_value_color. Für das dritte: Ein leerer Text bleibt in is_format leer; eine Beschriftung, die den Wert schrieb, wird zu einem Format ("#,##0") und einer Einheit; eine Beschriftung, die den Prozentsatz schrieb, lässt is_format leer und legt ihren Text in is_unit. Ein of_set_property, das label, label_format oder color nannte, liefert jetzt -5 und bewirkt nichts (of_get_last_error nennt die Eigenschaft): Suchen Sie diese Namen in Ihrem Code.
12.2 datagrid: ein numerischer Editor, der über eine Maske tippt #
Keine Signatur ändert sich, und ue_cell_edited erhält weiterhin die reine Zahl (1234.5). Was sich ändert, sieht man am Bildschirm: Die Eingabe in einer numerischen Spalte folgt jetzt einer Eingabemaske in der Syntax des DataWindows — der, die Sie über die neue Eigenschaft is_mask der Spalte angeben, sonst ihrem Anzeigeformat ohne seine Literale.
| Was | 4.0 | 5.0 |
|---|---|---|
Der Editor einer als $1,234.50 angezeigten Zelle | öffnete sich mit der reinen Zahl 1234.5; jedes Zeichen wurde angenommen | öffnet sich mit 1,234.50; die Gruppierung erscheint mit den Ziffern, die Dezimalstellen sind auf die Maske begrenzt, Buchstaben werden abgelehnt; eine eingefügte Zahl wird in der Anzeigesprache gelesen |
| Eine vierstellige Zahl unter einem numerischen Format | in manchen Sprachen nicht gruppiert (1234 auf Spanisch) | in allen Sprachen gruppiert (1.234 auf Spanisch) |
| Eine auf null gerundete negative Zahl | -0 | 0 |
| Den Editor öffnen und ohne Eingabe schließen | konnte einen Wert ändern, den das Format rundet | ändert nichts |
Eine Bewertungszelle (rating), von einem Bildschirmleser gelesen | fünf Sternzeichen | 4 / 5 |
// 5.0 : the input mask of a numeric column - the cell still receives the bare number
uo_grid.of_column(/*key*/ "revenue").is_mask = "#,##0.00"
Das Rezept: nichts zu ändern. Code, der den getippten Text las, sieht ihn nicht: ue_cell_edited liefert weiterhin die Zahl. Eine Spalte, deren Eingabe frei bleiben muss (ein Code, eine Teilenummer), ist eine Textspalte, keine numerische.
12.3 ribbon: die Masken eines Drehfelds #
Für ein Drehfeld ohne Maske ändert sich nichts. Zwei neue Eigenschaften seines Handles, in der Syntax von PowerBuilder: is_mask, die Eingabemaske ("#,##0.00", "0%"), und is_format, das Anzeigeformat mit seinen Literalen (0 "pt" zeigt 11 pt, getippt 11). id_value und ue_value_changed behalten die reine Zahl, der Wechsel zwischen beiden löst kein Event aus, und die Masken folgen dem Drehfeld in den Bereich einer eingeklappten Gruppe.
// 5.0 : a font size shown "11 pt", typed "11"
uo_ribbon.of_item(/*keys*/ "home/font/size").is_format = "0 ~"pt~""
Das Rezept: nichts zu ändern.
12.4 chartcartesian: das Zahlenformat über is_format #
Das kartesische Diagramm schrieb seine Zahlen über eine Funktion mit vier Argumenten (Dezimalstellen, Präfix, Suffix, Tausendertrennzeichen). 5.0 stellt Diagramme und Anzeigen unter eine einzige Sprache: ein PowerBuilder-Anzeigeformat, das einer DataWindow-Spalte, in der Eigenschaft is_format — des ganzen Diagramms und einer Achse über ihren Handle. Die Abschnitte positiv;negativ;null, die Literale und der Prozentsatz kommen mit, und die Trennzeichen bleiben die der Anzeigesprache. Kein alter Name bleibt.
| Was | 4.0 | 5.0 |
|---|---|---|
| Das Format des Diagramms | uo.of_set_value_format(0, "$", "", true) | uo.is_format = "$#,##0" |
| Das Format einer Achse | uo.of_set_value_format(AXIS_VALUE2, 1, "", " u", false) | uo.of_axis(AXIS_VALUE2).is_format = '0.0" u"' |
| Zurück zur Zahl, wie sie ist | uo.of_clear_value_format() | uo.is_format = "" (und "" auf jeder Achse mit eigenem Format) |
| Steuern per Name | — | of_set_property("format", "#,##0") |
| Die Zahl der Punkte einer Reihe (nur lesen) | uo.of_item("k").ii_point_count (integer) | uo.of_item("k").il_point_count (long) |
- Das Format einer Achse geht dem des Diagramms vor und bleibt. Das Format des Diagramms zu setzen löscht das der Achsen nicht mehr (die Form von
of_set_value_formatohne Achse tat es): Eine Achse kehrt mitis_format = ""zum Format des Diagramms zurück. - Ohne Format (leer oder ein nicht numerisches Format) wird die Zahl so geschrieben, wie sie ist, auf das Tausendstel, mit dem Dezimaltrennzeichen der Anzeigesprache — wie es das Standardformat tat.
// 4.0 : decimals, prefix, suffix and thousands as four arguments
uo_chart.of_set_value_format(/*decimals*/ 0, /*prefix*/ "$", /*suffix*/ "K", /*thousands*/ true)
uo_chart.of_set_value_format(/*axis*/ u_pbt_chartcartesian.AXIS_VALUE2, /*decimals*/ 1, /*prefix*/ "", /*suffix*/ " u", /*thousands*/ false)
// 5.0 : a display format, written as in a DataWindow - for the chart, then for one axis
uo_chart.is_format = "$#,##0K"
uo_chart.of_axis(/*axis*/ u_pbt_chartcartesian.AXIS_VALUE2).is_format = '0.0" u"'
Das Rezept: Kompilieren Sie; jedes of_set_value_format und of_clear_value_format wird gemeldet. Schreiben Sie das Format wie in einem DataWindow: decimals gibt die Zahl der 0 nach dem Punkt (-1 = #,##0.###), thousands das Gruppierungs-,, Präfix und Suffix stehen davor und dahinter (in Anführungszeichen, wenn sie Ziffern oder Leerzeichen enthalten). Das Format einer Achse gehört in of_axis(<Achse>).is_format.
12.5 Weitere Verhaltensweisen, die Sie bemerken können #
| Was | 4.0 | 5.0 | ||
|---|---|---|---|---|
Native Menüs einer Komponente mit eigenem Akzent (il_theme_accent) | der Akzent war nur im Kästchen eines aktivierten Eintrags zu sehen | auch der markierte Eintrag zeigt ihn, als Streifen am Anfangsrand (rechts bei RTL) | ||
button: Strg, Alt oder Umschalt + Eingabe (und Strg / Alt + Leertaste, Strg + Esc) auf dem Button mit dem Fokus | klickten diesen Button | gehen an das Fenster, wie von jedem anderen Steuerelement aus: Das Tastenkürzel eines anderen Buttons (is_shortcut = "Ctrl+Enter") wird ausgelöst, der fokussierte Button nicht; Eingabe und Leertaste allein klicken ihn weiterhin | ||
Ausgegrauter button mit ib_default (oder ib_cancel), dem Fokus am nächsten, in einem MDI-Blatt | Eingabe (Esc) ging an den Standard-Button eines anderen Blatts | die Taste bleibt in ihrem Blatt: das Feld oder der Standard-CommandButton von PB erhält sie | ||
breadcrumb: ii_max_visible gesetzt | eine genaue Zahl von Segmenten bei OVERFLOW_COLLAPSE (die Breite faltete nichts mehr ein), ignoriert bei OVERFLOW_SCROLL und OVERFLOW_SHRINK | eine Obergrenze in allen drei Modi; bei OVERFLOW_COLLAPSE faltet die Breite noch mehr ein, wenn die Leiste zu schmal ist, und der aktuelle Ort verlässt die Leiste nicht mehr | ||
breadcrumb: of_add_child mit leerem Text | eine leere Zeile im Menü | der Schlüssel des Zweigs, wie bei of_add_children | ||
breadcrumb: Strg+S, F5 und die anderen Tastenkürzel des Fensters während der Pfadeingabe | wurden nicht ausgelöst | werden ausgelöst, wie aus einem SingleLineEdit; Eingabe und Esc bleiben beim Feld | ||
breadcrumb: ue_children_needed, das nie zurückkehrt | kein Chevron öffnete sich mehr bis zum nächsten of_reset | ein Klick auf ein anderes Chevron gibt die Frage auf, und der Pfad lässt sie nach 10 Sekunden fallen | ||
chartcartesian: ein Band oder eine Schwelle ohne Farbe (-1 oder NULL) | ein voller Block in der Textfarbe | eine blasse Lasur des Themenakzents (eine Schwellenlinie: der Akzent); eine NULL-Grenze wird abgelehnt (-5) | ||
chartcartesian: ein NULL-Gewicht in einer Wärmekarte | die Zelle in der heißesten Farbe, mit „NaN“ beschriftet | eine leere Zelle: dort wird nichts gezeichnet, beschriftet oder angeklickt; eine Blase ohne Gewicht behält die Standardgröße, außerhalb der Skala | ||
chartcartesian: of_remove_series | die folgenden Reihen wechselten die Farbe; der Tooltip der entfernten Reihe zierte die nächste Reihe mit demselben Schlüssel | jede Reihe behält die beim Hinzufügen vergebene Farbe; Tooltip und Elementfarben gehen mit der Reihe | ||
chartcartesian: of_append_values / of_append_categories mit ib_animated | das ganze Diagramm fiel bei jedem Anhängen auf die Achse zurück und stieg wieder auf, solange das Fenster nicht voll war | nur die neue Form steigt auf, die anderen gleiten; die ganze Ankunft wird nur beim Hinzufügen einer Reihe erneut abgespielt | ||
chartcartesian: gestapelte Balken auf beiden Wertachsen | die beiden Stapel lagen übereinander | nebeneinander in der Kategorie | ||
chartcartesian: ein Auszeichnungs-Tag in einer Kategorie oder Wertebeschriftung | auf der Achse wörtlich geschrieben, im Panel ausgewertet | überall Text: das Tag wird entfernt (Achse, Panel, #x#, #label#) | ||
chartcartesian: Esc ohne Geöffnetes, Eingabe auf einer Lücke | vom Diagramm behalten | gehen an das Fenster: seinen Abbrechen-Button, seinen Standard-Button | ||
codeeditor: Strg+Tab oder Alt+Tab im Editor | rückten den Code ein: die Tastatur kam nicht mehr aus dem Editor heraus | gehen an das Fenster (die nächste Seite eines Registers); Esc und dann Tab verlässt den Editor, Strg+M oder ib_tab_moves_focus lassen Tab hinaus | ||
codeeditor: of_find mit einem ungültigen regulären Ausdruck | lieferte 0 | liefert -5, wie of_replace | ||
codeeditor: ein neues is_text während einer Suche | die Leiste blieb offen und löste ue_find_result aus | die Leiste schließt sich, ohne etwas auszulösen (ein Wert bleibt stumm) | ||
codeeditor: is_syntax = "SQL" zurückgelesen | "sql" | "SQL", wie geschrieben | ||
Gefalteter codeeditor: #regionopen, die Kopie und of_selected_text | als #region angezeigt; die Kopie lieferte die Anzeige, ohne die Zeilen der geschlossenen Regionen | wie geschrieben angezeigt; Kopie und of_selected_text liefern die Quelle des Bereichs, geschlossene Regionen eingeschlossen | ||
codeeditor: Markierungen und il_doc_line, wenn darüber Zeilen hinzugefügt oder entfernt werden | blieben auf derselben Zeilennummer | wandern mit ihrer Zeile; eine gelöschte Zeile nimmt ihre Markierungen mit | ||
codeeditor: die Einfügemarke nach „Alle ersetzen“ (of_replace_all) | auf der letzten Ersetzung | bleibt, wo sie war, verschoben um das davor Eingefügte | ||
codeeditor: Strg+Z, Strg+Y | der Verlauf des Browsers, verloren, wenn der Text bei Fokus anderswo geschrieben wurde | der Verlauf der Komponente (of_undo, of_redo): er zählt auch, was Ihr Code tut, ein neues is_text leert ihn | ||
crypto: of_totp_verify(secret, code, ref al_step) mit einem mit Leerzeichen getippten Code („864 010“) | abgelehnt, Schritt 0 | akzeptiert, wie bei der Form mit zwei Argumenten; die Leerzeichen werden ignoriert | ||
crypto: of_base64_encode_file einer Datei von 32 bis 64 MB in einer 32-Bit-Anwendung | bis 64 MB versprochen; der Speicher des Prozesses konnte ausgehen | "" und of_get_last_error() (höchstens 32 MB in 32 Bit); of_base64_encode_file_to_file kodiert eine Datei beliebiger Größe in eine andere Datei | ||
crypto: of_totp_uri eines von Hand getippten Geheimnisses („gezd gnbv“, eine „0“) | unverändert in die URI geschrieben | in Base32-Großbuchstaben ohne Leerzeichen und = geschrieben; ein anderes Zeichen: "" und of_get_last_error() | ||
crypto: ein NULL-Argument | is_last_error konnte NULL zurückkommen | zählt als leeres; of_get_last_error() ist nie NULL | ||
crypto: ein Ziel \x oder C:x (of_base64_decode_to_file, of_encrypt_file, of_decrypt_file) | -5 und eine falsche Meldung („not a base64 value“, „all needed“) | -5, und of_get_last_error() sagt, dass der Pfad vom aktuellen Ordner eines Laufwerks abhängt | ||
commandpalette: eine Suche und die zuletzt verwendeten Befehle (is_recent) | ein kürzlich verwendeter Befehl erhielt bis zu il_max_recent × 4 Punkte: bei einem großen Limit überholte er einen besseren Treffer | er entscheidet nur zwischen Ergebnissen, die etwa gleich gut passen | ||
commandpalette: ein Befehl ohne Gruppe (as_group = ""), zwischen zwei Gruppen deklariert | unter der Überschrift der davor deklarierten Gruppe aufgeführt | zuerst in der Liste, ohne Überschrift | ||
commandpalette: Pos1 / Ende im Suchfeld mit Text, Umschalt+Pos1 | bewegten die Auswahl in der Liste; Umschalt+Pos1 markierte nichts | bewegen die Einfügemarke im Feld; Strg+Pos1 / Strg+Ende erreichen die Liste; Umschalt markiert im Feld | ||
commandpalette: ein Rechts- oder Mittelklick auf eine Zeile | führte den Befehl aus | tut nichts | ||
commandpalette: of_command mit einem Schlüssel, den kein Befehl trägt | ib_enabled / ib_visible lasen sich true, ein Schreiben ging stillschweigend verloren | sie lesen sich false; ein Schreiben geht verloren und of_get_last_error sagt es | ||
commandpalette: ein zweites Palettenobjekt, das ein Kürzel übernommen hatte, wird zerstört | die Taste antwortete niemandem mehr, bis das erste sie erneut registrierte | das Kürzel geht an das erste zurück | ||
commandpalette: is_recent mit Leerzeichen oder wiederholten Schlüsseln, ein niedrigeres il_max_recent | "a, b" behielt nur a; ein Duplikat erschien zweimal; is_recent blieb lang | bereinigt, auf das Limit gekürzt und beim Öffnen bereinigt an is_recent zurückgegeben | ||
dockcontainer: das Dock aufbauen, eine Anordnung wiederherstellen | ue_layout_changed bei jedem Hinzufügen, das erste kannte nur ein Panel: eine im Ereignis gespeicherte Anordnung wurde von einer halb aufgebauten überschrieben | einmal für eine von of_set_redraw(false) … (true) eingerahmte Folge, bei der Wiederaufnahme (und für Änderungen im Abstand unter 40 ms); of_set_layout löst es einmal aus. Lesen Sie die gespeicherte Einstellung vor dem Erstellen der Panels | ||
dockcontainer: das vorderste Panel eines Stapels wechselt ohne Klick auf seine Registerkarte | nichts wurde ausgelöst (ein per of_add_panel oder of_move_panel gestapeltes Panel, das vorderste geschlossen, abgekoppelt oder entfernt, ein wieder angedocktes Panel) | ue_panel_selected des nach vorne gekommenen Panels, nach ue_panel_closed, ue_panel_floated oder ue_panel_docked; eine wiederhergestellte Anordnung löst keines aus. n_pbt_dock_panel.ib_front liest es zurück | ||
dockcontainer: ib_visible = true auf einem geschlossenen Panel eines Stapels | es kam hinter die aktive Registerkarte zurück | es kommt nach vorne, und ue_panel_selected folgt; in einer eingeklappten Gruppe bleibt es auf der Leiste | ||
dockcontainer: of_move_panel auf das Panel selbst (as_target = as_key) | lieferte 0 ohne Wirkung, oder teilte seinen Stapel | liefert -5; um einen Stapel zu teilen, zielen Sie auf ein anderes Panel des Stapels (of_move_panel("b", "a", POSITION_BOTTOM)) | ||
dockcontainer: ein Panel, das in eine eingeklappte Gruppe verschoben wird oder aus ihr heraus | ib_pinned änderte sich ohne Ereignis | ue_panel_pinned folgt | ||
dockcontainer: ein Klick ohne Verschieben auf eine Trennlinie | löste ue_layout_changed aus | löst nichts aus: nichts hat sich geändert | ||
dockcontainer: of_keys_at mit numerischen Schlüsseln | die ganzzahligen Schlüssel zuerst (2, 10, zeta) | die Reihenfolge des Hinzufügens (zeta, 10, 2) | ||
dockcontainer zur Laufzeit zerstört (CloseUserObject) | seine Steuerelemente kamen ins Fenster zurück, ausgeblendet | sie erhalten die Sichtbarkeit zurück, die sie vor of_add_panel hatten | ||
dockcontainer: of_add_panel eines Steuerelements, das das Dock ENTHÄLT | die Fenster verschachtelten sich im Kreis | liefert -5, das Steuerelement bleibt, wo es war | ||
crosstab: AGG_COUNT | zählte die Zeilen | zählt die nicht leeren Werte, wie die Funktion Anzahl von Excel; das neue AGG_COUNT_ROWS zählt die Zeilen | ||
crosstab: eine Summe ohne jeden Wert; eine „Abweichung zum Vorherigen“ neben einer leeren Zelle | 0 | eine leere Zelle (of_get_cell_value liefert NULL) | ||
crosstab: Top N oder Bottom N (of_set_value_filter oder das Menü) auf einem Feld, das unter einem anderen seines Bereichs steht | über die ganze Tabelle gereiht | innerhalb jedes übergeordneten Elements gereiht (die beste Stadt jeder Region); auf der ersten Ebene unverändert; die mit dem N-ten gleichauf liegenden Elemente bleiben alle | ||
crosstab: kein Feld in Spalten | eine Summenspalte, die die einzige Spalte verdoppelte (`Nord | 650 | 650`) | keine Summenspalte mehr; ib_col_grand_total behält seinen Wert |
crosstab: mehrere Kennzahlen und Felder in Spalten | eine Spalte Gesamt je Kennzahl, ohne Kennzahlnamen und nicht sortierbar | eine Kopfzeile „Gesamt“, darunter eine Kopfzeile je Kennzahl, sortierbar | ||
crosstab: ue_layout_changed | von den Gesten des Benutzers ausgelöst, und nur von is_thousands und of_remove_field | auch von jedem Befehl des Codes ausgelöst, der ändert, was of_get_layout liefert (of_set_layout eingeschlossen), einmal je Befehl; nur einmal am Ende eines von of_set_redraw(false) … (true) eingerahmten Aufbaus; nie, wenn sich nichts ändert, auch nicht bei of_reset | ||
crosstab: ein Prozentwert (SHOW_PCT_*) | 57.9 % in allen Sprachen | so geschrieben, wie die Anzeigesprache es schreibt: 57.9% auf Englisch, 57,9 % auf Französisch | ||
crosstab: der Bezeichnungsfilter | nur im Chip-Menü eines numerischen Feldes angeboten; bei einem Datum verglich of_set_label_filter das Jahr (2025-03-15 galt als 2025) | für jedes Feld angeboten; bei einem Datum nimmt die Text-Überladung Tage: LABEL_BEFORE, LABEL_AFTER, LABEL_BETWEEN ("yyyy-mm-dd", Tage eingeschlossen); die numerische Überladung oder LABEL_CONTAINS / LABEL_BEGINS / LABEL_ENDS auf einem Datum: -5 | ||
crosstab: of_group_date_field auf einem Feld ohne Datumswerte | 0 und ein einziges Element „(leer)“ | -5 | ||
crosstab: of_add_calc_field / of_add_calc_measure vom Raster abgelehnt (Name bereits belegt, Formel nicht übersetzbar) | 0; nur ue_calc_field_error sagte es | -5 und der Grund in of_get_last_error (ue_calc_field_error wird weiterhin ausgelöst); ein Name mit / oder ` | : -5; eine Formel akzeptiert .5 und 1e3` | |
crosstab: of_set_value_filter Top oder Bottom mit weniger als 1 Element; of_expand_to_level unter 1 | auf 1 gesetzt | -5 | ||
crosstab: of_get_cell_value aus einem Event aufgerufen, das während eines Befehls dieses Skripts ausgelöst wurde | -2, wie bei einer nicht erstellten Komponente | -4, und of_get_last_error sagt warum: lesen Sie nach dem Event | ||
crosstab: das Menü Optionen des Rasters (das Zahnrad) | „Gesamtsumme“ und „Zwischensummen“ schalteten beide Achsen nach dem Zustand der Zeilen um | ein Eintrag je Achse: Gesamtsummenzeile und -spalte, Zwischensummen der Zeilen und Spalten | ||
crosstab: of_from_datastore — eine CHAR-Spalte, eine Dezimalzahl, das Format einer Spalte | die Füllleerzeichen blieben im Element; das Format wurde ignoriert | die Füllleerzeichen werden entfernt; eine Dezimalzahl wird mit dem Trennzeichen des Arbeitsplatzes gelesen; das Format der Spalte ist das Standardformat ihrer Werte | ||
datagrid: eine ausgewählte Zeile, die die Suche oder ein Filter ausblendet oder of_remove_row entfernt | blieb stillschweigend ausgewählt (of_selected_keys und ue_row_menu_clicked trugen sie) | verlässt die Auswahl, und ue_selection_changed meldet es; of_select_rows nimmt keine ausgeblendete Zeile | ||
datagrid: ib_hidden, is_pin, ii_index auf ihren bisherigen Wert gesetzt; ein Klick auf den Griff ohne Ziehen | lösten ue_layout_changed aus | lösen nichts aus: nichts hat sich geändert | ||
datagrid: Layoutänderungen zwischen of_set_redraw(false) und of_set_redraw(true) | ein ue_layout_changed pro Änderung | ein einziges, bei der Wiederaufnahme, mit dem endgültigen Layout | ||
datagrid: ein Typ oder Renderer außerhalb der Konstanten (of_add_column, is_renderer, is_selection_mode); of_add_row_menu_item ohne erstellte Komponente | angenommen und unverändert zurückgelesen, ohne Wirkung; 0 | of_add_column liefert -5 (of_get_last_error sagt, welcher); ein unbekannter Renderer liest sich "", ein unbekannter Modus SELECT_NONE; -2 | ||
datagrid: of_reload_row oder of_update_row einer bearbeiteten Zelle | die Markierung „geändert“ blieb | sie verschwindet: die Zeile hält wieder, was der DataStore hält | ||
datagrid: eine Spalte mit Codetabelle, ein Datum bearbeiten; eine time-Spalte eines DataStores | das <select> und das Datumsfeld der Engine; eine Uhrzeit war Text | Liste und Kalender der Bibliothek (ein Datum lässt sich auch TIPPEN, in der Reihenfolge der Sprache); eine Uhrzeit (TYPE_TIME): Sortierung, Filter > 09:00, Format, Eingabe 9:5 | ||
datagrid: ein Filter > 3 auf einer Bewertung ohne Typ oder einer Spalte mit Codetabelle | suchte den Text „> 3“: keine Zeile | vergleicht die Daten (die Zahl, den Code) | ||
datagrid: ein Baum unter einer Suche; eine Zeile, deren Elternteil nicht im Raster ist | das gefundene Kind blieb verborgen; die Zeile erschien nie | seine Vorfahren werden geöffnet gezeigt; die Zeile hängt an der Wurzel | ||
datagrid: of_from_datastore / of_load_rows nach of_open_source; of_append_rows ohne Schlüssel nach of_from_datastore; ein CHAR-Wert | das Raster blieb bei Platzhaltern; die Zeile wurde abgelehnt (-5); behielt ihre Auffüllung mit Leerzeichen | die Quelle wird verlassen; der Schlüssel folgt der größten RowID; gekürzt | ||
datagrid: of_export_xlsx | Datumswerte wurden als Text geschrieben; keine Obergrenze | echte Excel-Datumswerte; eine zu große Arbeitsmappe (über etwa 18 MB) wird abgelehnt, ue_xlsx_saved sagt warum | ||
messagebox: Esc oder Alt+F4 bei einem Dialogfeld ohne Abbrechen-Schaltfläche | schlossen das Dialogfeld und lieferten 0 — auch of_info, das 1 versprach | wie unter Windows: Ein Dialogfeld mit einer einzigen Schaltfläche schließt über diese (of_info liefert 1), ein Ja/Nein-Dialogfeld schließt sich nicht — es muss beantwortet werden; ib_closable = true liefert die 0 der 4.0 zurück. Ein aus einem MessageBox übernommener Test = 2 lässt keine Löschung mehr durch | ||
messagebox: eine Abkürzung (of_info, of_error, of_confirm, of_prompt…) nach dem Setzen von il_accent, is_position, ib_movable, einer Größe oder ib_input_password | alles wurde stillschweigend gelöscht: Das Kennwort von of_prompt erschien im Klartext | die Abkürzung ersetzt nur den Inhalt (Titel, Meldung, Symbol, Schaltflächen, Kontrollkästchen, Wahlen); das Erscheinungsbild und die Einstellungen des Feldes bleiben. of_reset() löscht alles | ||
messagebox: of_reset() nach einem Dialogfeld | of_get_last_error, of_checked, of_action und of_input_value sprachen noch vom alten Dialogfeld | sie werden zurückgesetzt | ||
messagebox: ein Pflichtfeld voller Leerzeichen | akzeptiert | leer: die Standardschaltfläche wartet (der getippte Wert kommt unverändert zurück) | ||
messagebox: eine [action]-Zone im Titel, in einer Beschriftung oder in der Fußnote; ein Link in einer Wahl; zwei Schaltflächen mit demselben Kürzel | die Zone tat nichts; der Link öffnete den Browser UND wählte; Alt+Buchstabe antwortete mit der ersten Schaltfläche | die Zone antwortet wie in der Meldung (of_action); der Link öffnet sich, ohne zu wählen; Alt+Buchstabe verschiebt den Fokus von einer Schaltfläche zur anderen, die Eingabetaste wählt | ||
messagebox: Strg+C | verlor das & von &&, kopierte die Tags einer Schaltfläche, ignorierte die Eingabe | die Beschriftungen wie angezeigt, „Beschriftung: Wert“ des Feldes (nie ein Kennwort), die Details und die Fußnote | ||
messagebox: ein Nachkomme, der xx_set_style_override oder xx_clear_style_override (geschützt) aufrief | überschrieb ein Themen-Token des Dialogfelds | sie sind entfallen: il_accent färbt das Dialogfeld | ||
json und jsontree: eine Pfadebene mit ~0 oder ~1 | so gelesen, wie er steht; ein Schlüssel mit / hatte keinen Pfad | ~1 ist ein / des Schlüssels, ~0 ein ~ (JSON Pointer, RFC 6901): paths/~1users liest den Schlüssel /users; ein Schlüssel mit ~ wird im Pfad ~0 geschrieben | ||
json: eine leere Pfadebene (a//b, a/) oder ein Pfad, der mit / beginnt | mit -5 abgelehnt, als fehlend gelesen | eine leere Ebene ist der Schlüssel "", ein führendes / ist die vollständige Form des Zeigers: /name ist name, / bezeichnet den Schlüssel "" der Wurzel | ||
json: of_get_number, of_get_decimal, of_get_longlong auf einem String wie "12 kg" oder "1,5" | las den Anfang: 12, 1 | 0: ein String zählt nur, wenn er vollständig eine JSON-Zahl ist — "12.50" ist weiterhin 12,5 | ||
json: of_set_members mit einem Schlüssel, den das Dokument schon hat | der Schlüssel wurde ein zweites Mal geschrieben: n_pbt_json las den ersten, ein Browser oder ein Server den letzten | der Wert wird an Ort und Stelle ersetzt; ein Schlüssel, den das Fragment wiederholt, behält seinen letzten Wert | ||
json: of_pretty eines Dokuments mit einem of_set_raw-Wert, der mehr als 512 Ebenen tief verschachtelt ist | ein anderes Dokument, bei 512 Ebenen abgeschnitten | ein leerer Text | ||
jsontree: Klick auf einen Schlüssel mit /, einen leeren Schlüssel oder unter einem doppelten Schlüssel | ein Pfad, der in n_pbt_json einen ANDEREN Wert las | x~1y für den Schlüssel x/y, a//b für einen leeren Schlüssel; of_selected_addressable liefert false unter dem zweiten von zwei gleichen Schlüsseln | ||
jsontree: Strg+C mit einem mit der Maus markierten Textstück | der ganze Knoten | das markierte Stück | ||
jsontree: ein JSON-Text, der mit einem BOM beginnt | abgelehnt (ue_error) | angezeigt, wie n_pbt_json ihn liest; is_json liest sich zurück, wie gesetzt | ||
jsontree: die Meldung von ue_error auf Englisch | Invalid JSON : … | Invalid JSON: … (jede Sprache behält ihre Zeichensetzung); 01, 1., 1e melden Bad number | ||
jsontree: of_expand_path während einer Suche | beim nächsten Suchschritt wieder eingeklappt, ohne ue_node_toggled | bleibt offen, mit den darüber geöffneten Blöcken | ||
jsontree: Leertaste auf einem ausgewählten Wert | rollte den Baum um eine Seite | tut nichts (ein Block klappt weiterhin ein) | ||
xmltree: ein Leerraum zwischen zwei Kindern (<b>x</b> <i>y</i>) | hatte keine Zeile: /p/text()[1] lieferte -5 | eine eigene Zeile, als ␠ gezeigt, mit ihrem Pfad: die Zeilennummern gemischten Inhalts ändern sich | ||
xmltree: ein Text zwischen zwei Kindern (Hello <b>x</b> again) | Hello, again: Randleerzeichen abgeschnitten | Hello , again: nur die Layout-Zeilenumbrüche entfallen | ||
xmltree: of_select_path eines XPath, dessen erster Knoten ein Layout-Leerraum ist (//text()) | -5 | der erste Knoten, den der Baum ZEIGT, wird ausgewählt | ||
xmltree: of_selected_value eines Elements, das nur Zeilenumbrüche enthält (als <x/> gezeigt) | "" | diese Zeilenumbrüche, wie n_pbt_xml sie liest | ||
xmltree: Strg+C mit einem mit der Maus markierten Textstück | das XML des ganzen Knotens | das markierte Stück | ||
xmltree: die Meldung von ue_error auf Englisch | Invalid XML : … | Invalid XML: … (jede Sprache behält ihre Zeichensetzung) | ||
xmltree: of_expand_path während einer Suche | beim nächsten Suchschritt wieder eingeklappt, ohne ue_node_toggled | bleibt offen, mit den darüber geöffneten Elementen | ||
xmltree: Leertaste auf einem ausgewählten Blatt | rollte den Baum um eine Seite | tut nichts (ein Element mit Kindern klappt weiterhin ein) | ||
jsontree, xmltree: eine Suche, die sich schließt (Esc im Suchfeld, of_clear_search, of_reset, ib_search_enabled = false) | kein Ereignis: eine Zeile „3 / 12“ der Anwendung blieb falsch | ue_search_result(0, 0), einmal; nichts, wenn keine Suche lief | ||
PBT_SetDefaultFont mit einer Größe: codeeditor, jsontree, xmltree, ribbon, toolbar, crosstab, datagrid, tilesbox, stepbar, listbar, dockcontainer, video, picture, Menüs und Tooltips | Code, Dokument, Menüband (seine Designgröße) und viele Nebentexte behielten ihre Größe | sie folgen der Größe der Anwendung in ihren Proportionen; die Größe der Anwendung hat Vorrang vor der Menübandgröße des Designs; ein ii_font_size des codeeditor hat Vorrang vor beiden | ||
markdownview: ue_link_clicked | (string as_url) | (string as_url, string as_kind): ein bereits geschriebenes Skript des Events bleibt gültig; as_kind (LINK_WEB, LINK_MAIL, LINK_DOCUMENT, LINK_FILE, LINK_OTHER) sagt, was der Link ist — sortieren Sie danach statt nach dem Text der Adresse | ||
markdownview: ein Bild eines Dokuments auf einer Netzwerkfreigabe | geladen | abgelehnt, es sei denn, es liegt auf der Freigabe, von der das Dokument gelesen wurde, oder mit ib_network_pictures; ein aus dem Web gelesenes Dokument zeigt keine Datei des Arbeitsplatzes | ||
markdownview: ein neues is_markdown desselben Dokuments, of_refresh | die Ansicht sprang nach oben | die Leseposition bleibt; ein neues is_source beginnt weiterhin oben | ||
markdownview: of_toc, of_scroll_to und eine Suche direkt nach is_source | wirkten auf das vorherige Dokument | die Datei wird im Hintergrund gelesen: of_toc liefert 0, of_scroll_to und die Suche warten auf sie; lesen Sie das Verzeichnis in ue_loaded | ||
markdownview: eine vom Autor ausgerichtete Spalte (:--, --:) in einer Rechts-nach-links-Anwendung | wechselte die Seite | behält ihre Seite; nur die Standardausrichtung folgt der Richtung | ||
markdownview: ue_load_failed für einen mit is_markdown gesetzten Text | nie ausgelöst | ausgelöst (REASON_FAILED, leeres as_source) für einen Text, den die Komponente nicht lesen kann; das vorherige Dokument bleibt angezeigt | ||
menubar: das Tastenkürzel eines Eintrags (is_shortcut) | wirkte auf den Zustand, den das letzte Öffnen des Menüs hinterlassen hatte | löst zuerst ue_menu_opening seines Menüs aus, wie Windows: ein Eintrag, den dieses Event ausgraut, antwortet nicht, und ue_menu_closed meldet es | ||
menubar: ein Öffnen, das vor dem Erscheinen abgebrochen wird (schnelles Gleiten, Esc oder Alt während ue_menu_opening, Fokusverlust) | ue_menu_opening ohne ue_menu_closed; nach Esc öffnete sich das Dropdown trotzdem | nichts öffnet sich, und ue_menu_closed folgt: jedes ue_menu_opening erhält genau ein ue_item_selected oder ein ue_menu_closed | ||
menubar: Alt dann Esc, F10 dann Esc | Esc ging auch an das Fenster: seine Abbrechen-Schaltfläche | Esc verlässt den Menümodus und bleibt bei der Leiste | ||
menubar: ein per Tastatur geöffnetes Menü (Alt+Buchstabe, F10 dann Eingabe) | kein Eintrag hervorgehoben: Eingabe wählte nichts | der erste Eintrag ist hervorgehoben, Eingabe wählt ihn | ||
menubar: Alt, wenn die Leiste bereits den Fokus hat | der Menümodus schaltete beim Drücken um: Alt+Umschalt (Tastaturlayout) schaltete ihn ein | beim Loslassen eines einzelnen Alt, wie unter Windows | ||
menubar: ein Klick auf einen ausgegrauten Titel oder den leeren Teil der Leiste | die Leiste behielt die Tastatur, das bearbeitete Feld verlor sie | die Tastatur bleibt beim Steuerelement, in dem getippt wurde | ||
menubar: is_shortcut auf einer Adresse, die keinen Eintrag bezeichnet | die Taste war im ganzen Fenster belegt, sogar nach of_clear | nichts wird aktiviert: setzen Sie es nach of_add_item | ||
pdfviewer: ib_allow_save / ib_allow_print eines Betrachters | galten für alle Betrachter der Anwendung; ein of_reset an anderer Stelle gab einem vertraulichen Dokument Speichern zurück | jeder Betrachter behält seine eigene Einstellung | ||
pdfviewer: ib_allow_save / ib_allow_print vor is_source gesetzt | drei Ladevorgänge, drei ue_load_completed; ein fehlgeschlagenes Dokument wurde bei jeder Änderung erneut versucht | ein einziger Ladevorgang; ein fehlgeschlagenes Dokument wird nicht erneut versucht | ||
pdfviewer: ii_page gesetzt, während ein Dokument angezeigt wird, dann ein anderes is_source | das nächste Dokument öffnete sich auf dieser Seite | die Seite gehörte zum angezeigten Dokument: das nächste öffnet sich auf seiner ersten Seite; um ein Dokument auf einer Seite zu öffnen, setzen Sie is_source und dann ii_page | ||
pdfviewer: derselbe Wert erneut gesetzt (ii_page, ii_zoom, is_fit, ib_viewer_toolbar) | lud das Dokument neu und löste ue_load_completed aus | bewirkt nichts | ||
pdfviewer: ii_zoom außerhalb von 25 bis 500 | unverändert an den Betrachter übergeben | auf 25 bis 500 zurückgeführt, so zurückgelesen, wie angewendet | ||
pdfviewer: eine Adresse https://name:geheim@…; eine Quelle nur aus Leerzeichen | an den Betrachter übergeben, der sie mit einem ungenauen Grund ablehnte, das Geheimnis kam in den Ereignissen zurück; unverändert zurückgelesen, of_refresh gab 0 zurück | sofort über ue_load_failed abgelehnt (REASON_UNSUPPORTED): Laden Sie das Dokument mit dem restclient herunter; als "" zurückgelesen, of_refresh gibt -4 zurück | ||
picture: id_max_zoom bei einem Bild, das größer als sein Rahmen ist | Mausrad, + und id_zoom gingen bis zur tatsächlichen Größe | sie halten an der Obergrenze; nur die Taste 1 geht darüber hinaus | ||
picture: eine neue is_source oder ib_zoomable = false bei einem gezoomten Bild | der Zoom ging stillschweigend auf 1.0 zurück | ue_zoom_changed(1.0) wird ausgelöst (of_reset bleibt stumm); setzen Sie id_zoom nach is_source | ||
picture: ein Pfad mit Leerzeichen darum (eine CHAR-Spalte) | abgelehnt, REASON_UNSUPPORTED | angezeigt; is_source liest sich wie geschrieben zurück | ||
picture: die Zoomtasten mit gedrückter Strg-, Alt- oder Windows-Taste | Strg++ zoomte, Alt+1 zeigte die tatsächliche Größe | Ihrer Anwendung überlassen (Tastenkürzel, Zugriffstasten) | ||
picture: ein umgefärbtes Bild (mono:, tint:) einer anderen Website, deren Server Anfragen anderer Herkunft ablehnt | ue_loaded und ein leerer Rahmen | ue_error mit REASON_FAILED, die Meldung sagt warum | ||
radialmenu: is_tooltip, is_super_tooltip_title, is_super_tooltip_text, is_super_tooltip_image | existierten, zeigten nie etwas: Der Starter hat keine Oberfläche | entfernt: Der Compiler zeigt die Zeile, löschen Sie sie | ||
radialmenu: of_close, ein zweites of_show, of_clear oder of_reset, während ein Rad offen ist | ue_dismissed kam, als das Rad den Bildschirm verließ; of_is_open blieb bis dahin true | ue_dismissed sofort, einmal je Öffnung; of_is_open false, sobald der Aufruf zurückkehrt | ||
radialmenu: of_remove_item eines Zweigs, den das offene Rad nicht zeigt (ausgeblendet) | das Rad schloss sich (ue_dismissed) | das Rad bleibt offen; es schließt sich nur, wenn es den Zweig zeigte | ||
radialmenu: of_remove_item mit einem bloßen Schlüssel ("csv") | -5 | aufgelöst wie bei of_item (der einzige Zweig, der ihn trägt); -5, wenn zwei Zweige ihn teilen | ||
radialmenu: of_show eines Rades ohne Inhalt, während ein anderes offen ist | ue_dismissed, und das alte Rad blieb auf dem Bildschirm | das alte Rad schließt sich auch: ein ue_dismissed je Öffnung | ||
radialmenu: il_back_color_hover eines Zweigs ohne il_text_color_hover | die angezeigte Beschriftung behielt den Text des Themas (weiß auf Blassrosa im dunklen Thema) | ein auf diesem Farbton lesbarer Text wird gewählt; eine von Ihnen gesetzte Farbe wird nie geändert | ||
restclient: ib_windows_auth oder is_client_certificate und eine Umleitung auf einen anderen Host | die Windows-Anmeldedaten und das Zertifikat folgten der Umleitung | nur Host und Port der Anfrage erhalten sie: der andere Host bekommt die Anfrage ohne sie | ||
restclient: ein Header-Wert jenseits von Latin-1 (Griechisch, Japanisch…) | von of_set_header angenommen (0), danach lieferte jede Anfrage des Objekts -5 | schon von of_set_header abgelehnt (-5, of_get_last_error() nennt den Grund); of_set_basic nimmt sie an: sein Paar geht als Base64 seines UTF-8 ab | ||
restclient: eine fehlerhafte Methode ("GE T"), Anmeldedaten in der URL (https://user:pwd@…), ein Feldname von of_upload mit einem Anführungszeichen | -4 „request failed: 0“; die Anmeldedaten verschwanden kommentarlos; der Multipart-Körper war defekt | -5 und der Grund in of_get_last_error() (für Anmeldedaten: nehmen Sie of_set_basic) | ||
restclient: eine 303 oder eine 301 bzw. 302 nach einem POST, die als GET weitergeht | behielt den Content-Type des ursprünglichen Körpers | geht ohne Content-Type | ||
restclient: ue_progress | für jeden asynchronen Körper ausgelöst, ohne je die Gesamtgröße zu erreichen: ein Balken blieb bei 39 % | für jeden asynchronen Körper ausgelöst (die Doku sagt es), und das letzte, unmittelbar vor ue_response, ist die Gesamtgröße | ||
restclient: of_response_header eines mehrfach gesendeten Headers (Link, Set-Cookie) | nur der erste Wert | alle, verbunden durch , — Set-Cookie durch einen Zeilenumbruch | ||
restclient: der gesendete User-Agent | PBToolboxAI/4.0, fest eingetragen | die Version der Bibliothek; of_set_header("User-Agent", …) ersetzt ihn weiterhin | ||
restclient: eine Anfrage, wenn der HTTP-Client nicht angelegt werden konnte | ging über eine Wegwerf-Sitzung ab, ohne Windows-Authentifizierung, Client-Zertifikat und Cookies | -2, und il_status sagt es | ||
restclient: of_set_header("Authorization", …) nach of_set_basic | beide Authentifizierungen wurden gesendet | eine Authentifizierung zugleich: das gesetzte Authorization ersetzt die Basic-Authentifizierung | ||
ribbon: ein vom Code geschriebener Wert (is_text, id_value), während das Feld eines Kombinationsfelds oder Drehfelds den Fokus hat | das Feld behielt den alten Text; beim Verlassen wurde ue_combo_changed / ue_value_changed mit dem alten Wert ausgelöst, der Ihren ersetzte | das Feld zeigt ihn sofort, außer der Benutzer tippt gerade (seine Eingabe gewinnt); das Feld ohne Eingabe zu verlassen löst nichts aus | ||
ribbon: eine Beschriftung mit Tags (is_label, Titel einer Registerkarte, einer Gruppe, eines Banners, Anwendungsschaltfläche) | wie getippt angezeigt, Tags eingeschlossen (das Panel einer eingeklappten Gruppe interpretierte sie) | die Rich-Text-Auszeichnung wird überall interpretiert; ein Text des Benutzers geht durch of_escape_markup | ||
ribbon: das Mausrad über dem Menüband | jede kleine Bewegung eines Touchpads wechselte die Registerkarte; ein eingeklapptes Menüband wechselte ebenfalls, ohne etwas zu zeigen | eine Registerkarte pro Raste (kleine Bewegungen summieren sich); nichts bei einem eingeklappten Menüband | ||
ribbon: of_add_spinner mit einem Schritt von 0 oder weniger oder einem Minimum über dem Maximum; widersprüchliche id_min / id_max / id_step | angenommen: tote oder umgekehrte Pfeile, ein Wert außerhalb des Bereichs angezeigt | of_add_spinner liefert -5 und hält den Wert im Bereich; ein Schritt von 0 oder weniger wird abgelehnt (of_get_last_error sagt, warum); eine über die andere hinaus gesetzte Grenze nimmt diese mit, wie bei einem NumericUpDown — die Reihenfolge der beiden Zuweisungen spielt keine Rolle mehr | ||
ribbon: ein is_keytip, das nicht aus Buchstaben A-Z und Ziffern besteht ("É", "-") | gespeichert und gelesen, nie über die Tastatur erreichbar | abgelehnt: nichts ändert sich, of_get_last_error sagt, warum | ||
ribbon: Esc auf der zweiten Ebene der Zugriffstasten (die Befehle einer Registerkarte) | schloss alle Zugriffstasten | kehrt zu den Buchstaben der Registerkarten zurück, wie in Office; ein zweites Esc schließt | ||
speechout: of_speak_from(0) oder eine negative Zahl | las ab dem ersten Satz | -5, nichts wird gelesen (Positionen zählen ab 1) | ||
speechout: ii_rate, ii_pitch, ii_volume außerhalb ihres Bereichs gesetzt (ii_rate = 1000) | lasen sich wie gesetzt zurück (1000), während die Stimme die Grenze anwandte | lesen sich so zurück, wie sie gelten (400) | ||
speechout: ein [rate]…[/rate]-Stück in einem Satz | ein eigener Satz: sein ue_sentence, seine Nummer, und ein Punkt nach [/rate] wurde zu einem „Satz“ | bleibt in seinem Satz: ein einziges ue_sentence mit dem ganzen Text, eine Nummer, ue_word zählt in diesem Text, of_spoken_text eine Zeile pro Satz; das Satzzeichen geht mit dem Stück | ||
speechout: [rate=0] | mit 100 % gelesen | das langsamste Tempo, 10 % | ||
speechout: eine Regel von of_add_replacement auf einem Wort, das auch Name oder Wert eines Tags ist (total mit [mark=total], rate, ein Wort in [spell]) | schrieb das Tag um: die Marke änderte ihren Namen, das Tag wurde vorgelesen, der buchstabierte Text änderte sich | die Regel schreibt nur den Text zwischen den Tags um | ||
speechout: ein Arbeitsplatz ganz ohne Stimme | ue_error, dann ein „laufendes“ Lesen: ue_started, jedes ue_sentence, ue_stopped; of_speak_sync gab 0 zurück | ue_error und sonst nichts: kein Lesen, kein ue_started; of_speak_sync gibt -4 zurück | ||
speechout: is_lang ohne Region ("fr", "en") | ue_voice_fallback bei jedem Lesen | kein Ersatz für eine Stimme dieser Sprache, gleich welcher Region | ||
speechout: of_clear_queue hinter einem of_speak (das laufende Lesen ist kein Text der Warteschlange) | ue_queue_done am Ende des Lesens | kein ue_queue_done: kein Text der Warteschlange wurde gelesen | ||
speechout: eine Initiale (John F. Kennedy), ein abgekürzter Monat (Oct. 10), ein Akronym mit Punkten (U.S.) | beendete den Satz | bleibt im Satz (ein Monat oder ein Akronym beendet ihn vor einem Großbuchstaben, wie etc.): die Satznummern können sich ändern | ||
statusbar: ein anklickbarer, ausgegrauter Bereich mit Tooltip | der Tooltip erschien nie | er erscheint, um zu sagen, warum der Bereich ausgegraut ist | ||
statusbar: of_count, of_keys_at, of_has auf der Adresse eines Bereichs ("enc") | 0, "", false: die Einträge seiner Liste wurden nicht gesehen | die Einträge seiner Liste, ohne Trenner | ||
statusbar: eine Position in einer Dropdown-Liste (of_insert_menu_item, of_move_menu_item) | zählte die Trenner mit | zählt nur die Einträge, wie die Positionen der Bereiche | ||
statusbar: ein Bereichs- oder Eintragsschlüssel, der mit __ beginnt | angenommen | abgelehnt, -5: er ist der Komponente vorbehalten | ||
statusbar: is_tooltip und die fünf Farben auf einem Listeneintrag (of_menu_item) | gespeichert und gelesen, ohne Wirkung | ignoriert, leer gelesen (-1 für eine Farbe): das native Menü zeigt sie nicht | ||
statusbar: der Griff (ib_show_resize_grip) in einem MDI-Blatt, oder eine Leiste, die nicht am unteren Rand ihres Fensters liegt | er änderte die Größe des Rahmens, von seiner Ecke aus | er ändert die Größe des Blatts; kein Griff, wenn die Leiste nicht in der unteren Ecke sitzt | ||
statusbar: die Menü-Taste oder Umschalt+F10 auf einem fokussierten Bereich | nichts | ue_panel_rclicked, an der Ecke unten links des Bereichs | ||
stepbar: Eingabe oder Leertaste auf einem Schritt, in einem Fenster mit Standardschaltfläche | ue_step_clicked und die Standardschaltfläche („Weiter“) wurde ausgelöst | nur ue_step_clicked: die Taste bleibt bei der Leiste | ||
stepbar: of_clear_steps, während die Leiste auf einem Schritt steht | löste nichts aus | ue_step_changed(verlassener Rang, verlassener Schlüssel, 1, ""), wie das Entfernen des aktuellen Schritts; of_reset löst nichts aus | ||
stepbar: ii_current jenseits von „alles erledigt“ (weiter als Anzahl der Schritte + 1) | ue_step_changed meldete sofort einen Rang, den es nicht gab; das Eintreffen des Schritts blieb stumm | nichts wird ausgelöst, solange die Leiste wartet; ue_step_changed wird ausgelöst, wenn der Schritt eintrifft | ||
stepbar: of_move_step auf einer Leiste auf „alles erledigt“ | konnte die Leiste wieder öffnen: ein Schritt wurde wieder aktuell, mit ue_step_changed | die Leiste bleibt auf „alles erledigt“, nichts wird ausgelöst | ||
stepbar: NAV_VISITED, ein vor den aktuellen Schritt eingefügter oder verschobener Schritt | anklickbar | als erledigt angezeigt, aber nicht anklickbar: er wurde nie erreicht | ||
stepbar: ein Schritt mit Warnung (STATE_WARNING) | eine bernsteinfarbene Markierung | eine bernsteinfarbene Markierung mit zweitem Ring: er sieht nicht mehr wie ein erledigter Schritt aus, wo der Akzent bernsteinfarben ist | ||
statictext: ue_hyperlink | (string as_url) | (string as_url, boolean ab_opened): ein bereits geschriebenes Skript des Events bleibt gültig; ab_opened ist FALSE, wenn sich der Link nicht geöffnet hat (ein anderes Schema als http, https, mailto — of_get_last_error() sagt warum —, oder von ue_hyperlink_opening geschlossen gehalten) | ||
statictext deaktiviert auf einem eigenen Hintergrund (il_back_color, ein [bk]-Abschnitt) | der Text nahm das Grau des Designs an, unlesbar auf einem dunklen oder farbigen Hintergrund | seine Farben bleiben erhalten und werden abgeschwächt; auf der Fläche des Designs das Grau des Designs, wie bisher | ||
statictext: PBT_SetDefaultFont mit einer Größe | die Größe blieb bei 11 pt | die angegebene Größe gilt (11 pt ohne sie, unverändert) | ||
statictext: ii_font_size außerhalb von 6 bis 200 | unverändert angewendet | auf die nächste Grenze zurückgeführt, wie das [size]-Tag, und so zurückgelesen, wie angewendet | ||
statictext: Doppelklick auf ein Wort mit ib_selectable | ein einziges ue_clicked vor ue_double_clicked | zwei ue_clicked, dann ue_double_clicked, wie der StaticText von PowerBuilder; das Loslassen nach einem markierenden Ziehen bleibt ohne Klick | ||
statictext: of_reset eines als abgeschnitten gemeldeten Textes | nichts | ue_text_overflow(false) | ||
statictext: is_text nach of_append_text gelesen, wenn eine Zeile ein Tag offen ließ | [b]Start[br]two: erneut gesetzt, lief der Fettdruck in die nächste Zeile weiter | [b]Start[/b][br]two, was der Bildschirm zeigt; eine leere Zeile behält ihre Höhe; unter ib_marquee laufen die Zeilen als eine Zeile | ||
statictext: ib_auto_width und ein geleerter Text | behielt die Breite des vorherigen Textes | schrumpft auf seinen Innenabstand; ein Designwechsel misst die Breite ebenfalls neu | ||
xml: of_count, of_get_values, of_get_attrs, of_get_attr_names, wenn nichts geladen ist, ein gebautes Element noch offen ist oder die Engine den XPath ablehnt | lieferten 0, wie eine Suche ohne Treffer | liefern -4 (-2, wenn die Seite nicht antwortet), of_get_last_error() sagt warum; 0 ist immer eine echte Null. Ein Test > 0 ändert sich nicht; ein Test = 0, der „nichts gefunden“ bedeutete, sieht die Ablehnung jetzt getrennt | ||
xml: of_get_attr und of_remove_attr eines fehlenden Attributs, of_get_attrs mit leerem Namen | leer ohne Grund, 0 („erledigt“), 0 | leer und „no such attribute“ in of_get_last_error() (ein leer geschriebenes Attribut bleibt ohne Grund), -4, -5 | ||
xml: of_set_value, of_set_attr, of_add_child mit einem Text, der ein Steuerzeichen (Char(1)) oder ein CR enthält | unverändert geschrieben: das Dokument ließ sich nicht mehr laden, das CR kam als LF zurück | das verbotene Zeichen wird entfernt, wie beim Builder; das CR wird geschrieben und so zurückgelesen | ||
xml: Builder — ein zweites Element auf oberster Ebene, ein Text ohne offenes Element, ein Attribut nach einem Kind | geschrieben (zwei Wurzeln) oder wortlos ignoriert | weggelassen, und of_get_last_error() sagt warum | ||
xml: of_get_value("sum(//qty)") über einen Text, der keine Zahl ist; of_get_value("/") | der Text NaN; leer | leer und „the expression is not a number“; der Text des Dokuments |
Das Rezept: nichts zu ändern.
12.6 Was hinzugekommen ist #
Nichts davon verlangt eine Änderung Ihres Codes. Die acht neuen Komponenten der 5.0 werden in den Versionshinweisen vorgestellt.
| Objekt | Hinzugefügt |
|---|---|
| progressbar | is_unit: ein Text nach dem Ablesewert ("of 500 rows", "MB") |
| datagrid | is_mask einer Spalte (n_pbt_datagrid_column): die Eingabemaske einer numerischen Spalte; eine Spalte ohne Anzeigeformat zeigt ihre is_mask |
| datagrid | die Tastatur der Spaltenköpfe (Pfeil nach oben ab der ersten Zeile; Eingabe sortiert, Umschalt+Eingabe fügt der Sortierung hinzu; Alt+Ab oder die Menütaste öffnet das Menü der Spalte; Strg+Umschalt+Pfeile verschieben sie, Alt+Pfeile ändern ihre Breite); TYPE_TIME; of_get_last_error sagt, warum ein Aufruf -5 lieferte |
| ribbon | is_mask und is_format eines Drehfelds (n_pbt_ribbon_item); is_group: sich ausschließende Umschalter einer Gruppe (n_pbt_ribbon_item) und Optionseinträge eines Menüs (n_pbt_ribbon_menu_item); ue_item_rclicked (Rechtsklick auf ein Steuerelement, eine Gruppe, eine Registerkarte oder eine Schaltfläche der Symbolleiste für den Schnellzugriff, mit dem Bildschirmpunkt al_x, al_y; auch Menütaste und Umschalt+F10) und ue_rclicked (außerhalb jedes Items); is_title einer kontextbezogenen Gruppe (n_pbt_ribbon_ctx_group), deren QuickInfo auf dem Banner erscheint; Zugriffstasten der Schaltflächen der Symbolleiste für den Schnellzugriff; Item-Farben der Menüeinträge und der Schaltflächen der Symbolleiste für den Schnellzugriff; barrierefreie Namen aller Steuerelemente |
| breadcrumb | die Pfadeingabe wird zur Adressleiste: ib_auto_complete, ue_path_typing und of_add_suggestion (Vervollständigung beim Tippen), ib_veto_path, ue_path_entering und is_path_error (ein abgelehnter Pfad behält die Eingabe) |
| chartcartesian | of_from_datastore (DataStore, DataWindow, DataWindowChild), of_map und die Konstanten ROLE_*, of_reload: die Grafik eines DataWindow (Zeilen je Kategorie und Reihe summiert, an Ort und Stelle neu gelesen); of_set_point_color / of_get_point_color; ue_point_rclicked, ue_rclicked; of_get_categories; of_remove_axis_section |
| codeeditor | of_undo, of_redo, ib_can_undo, ib_can_redo und ue_undo_state_changed (der steuerbare Rückgängig-Verlauf); ue_modified_changed; of_toggle_comment (Strg+/); of_next_marker (F8); ib_match_brackets; ib_tab_moves_focus (Strg+M) |
| crypto | Blobs (of_base64_encode_blob, of_base64_decode_blob, of_hash_blob, of_hmac_blob, of_crc32_blob, of_encrypt_blob, of_decrypt_blob); of_base64_encode_file_to_file; of_jwt_verify_jwks, of_jwk_to_pem, of_pem_to_jwk; die erwarteten Claims von of_jwt_verify und il_jwt_leeway_seconds; JWT_HS384/HS512, JWT_RS384/RS512, JWT_PS256/PS384/PS512, JWT_ES384 und KEY_EC_P384; Schema und Hash von of_sign / of_verify (SIGN_PKCS1, SIGN_PSS); die Zusatzdaten von of_encrypt_with_key / of_decrypt_with_key; der Hash von of_rsa_encrypt / of_rsa_decrypt; die Einstellungen von of_totp_code, of_totp_verify, of_totp_uri und of_hotp_code; of_password_needs_rehash |
| buttonbar | is_style einer Schaltfläche (STYLE_PRIMARY, STYLE_FLAT, STYLE_DANGER), is_badge (eine Text-Plakette), il_badge_color, is_mnemonic, ii_image_size und ii_badge_size der Leiste, ib_enabled der ganzen Leiste, ue_button_rclicked und ue_rclicked, of_clear_shortcuts |
| commandpalette | of_load_menu(menu): die Palette aus einem PowerBuilder-Menü gefüllt, bei jedem Öffnen neu gelesen; of_loaded_item(as_key) liefert das Element eines Befehls; of_get_last_error() |
| dockcontainer | ib_front eines Panels (n_pbt_dock_panel, nur lesend): das Panel, das sein Stapel zeigt; der Eintrag Automatisch ausblenden im Panel-Menü, auch auf der Lasche der Leiste; Umschalt+F10 und die Menütaste öffnen dieses Menü unter der Registerkarte; das aktive Panel, das die Tastatur hat: of_active_panel() und ue_active_panel_changed(as_key) |
| crosstab | of_value(position) und sein Handle n_pbt_crosstab_value (ein Wert des Bereichs Werte: is_agg, is_show, is_conditional_formatting, is_format, ib_negative_red, is_label, of_field()); of_value_count, of_remove_value, of_move_value; of_get_cell_rows (die Zeilen des DataStore hinter einer Zelle); is_format eines Feldes; AGG_COUNT_ROWS, LABEL_BEFORE, LABEL_AFTER |
| messagebox | of_messagebox (die Argumente von MessageBox(), Question! und YesNo! inbegriffen) und die Konstanten BUTTONS_*; of_retry_cancel; die Standardschaltfläche von of_confirm, of_yes_no, of_yes_no_cancel (al_default); Wiederholen, Abbrechen, Ignorieren, Schließen übersetzt; ib_closable, ib_sound; is_details, is_details_label; is_footer, is_footer_icon; ib_input_multiline, il_input_max_length, is_input_pattern, is_input_error; of_prompt, das maskiert und verlangt; eine deaktivierte Wahl (of_add_choice, ab_enabled) |
| jsontree | of_get_layout, of_set_layout und ue_layout_changed (die Faltungen, die Auswahl, die oberste Zeile); of_selected_addressable, of_selected_type, of_selected_count, of_copy_path; ue_node_rclicked (Rechtsklick, Menütaste); ib_find_decoded (die Suche in den decodierten Werten, Schalter &) |
| xmltree | of_find_xpath (jeder Knoten eines XPath, durchlaufen mit of_search_next); of_get_layout, of_set_layout und ue_layout_changed (die Faltungen, die Auswahl, die oberste Zeile); of_selected_kind (Konstanten KIND_*), of_selected_name, of_selected_namespace, of_copy_path; ue_node_rclicked (Rechtsklick, Menütaste); ib_find_decoded (die Suche in den decodierten Werten, Schalter &) |
| json | of_from_datastore und of_to_datastore (DataStore, DataWindow, DataWindowChild): ein DataStore als Array typisierter Objekte und zurück; Datumswerte nach ISO 8601 (of_set_date, of_set_datetime, of_set_time, of_add_date, of_add_datetime, of_add_time, of_get_date, of_get_datetime, of_get_time); of_get_last_error und of_error_position (wo ein Text kein JSON ist); of_escape_key |
| listbar | ue_item_invoked (ein Klick auf den Eintrag, der bereits ausgewählte eingeschlossen); ib_search, is_filter, ue_filter_changed (eine Suche); of_from_datastore (DataStore, DataWindow, DataWindowChild), of_map und die Konstanten ROLE_* (eine Zeile = ein Eintrag) |
| markdownview | is_base_path, ib_allow_html (eine kurze Liste harmloser HTML-Tags), ib_network_pictures, ib_remote_pictures, ib_tasks_editable und ue_task_toggled, ib_track_heading und ue_heading_visible, is_position, ii_zoom, of_selected_text, of_copy und Strg+Einfg, die Konstanten LINK_*; GitHub-Hinweise, nackte E-Mail-Adressen und Emojis |
| menubar | of_load_menu(menu): die ganze Leiste aus dem PowerBuilder-Menü eines Fensters, bei jedem Öffnen neu gelesen, seine Clicked-Skripte ausgeführt; of_loaded_item; of_insert_item (ein Eintrag an einem Rang) und of_clear_items (eine Kaskade leeren und den Eintrag behalten); of_open, of_close, of_is_open |
| pdfviewer | of_load_blob(blob) und of_load_blob(blob, string): ein PDF in einem Blob (mit SELECTBLOB gelesen), ohne Datei angezeigt, gleich welcher Größe; is_find (ein beim Öffnen hervorgehobener Text); ib_navigation_pane (die Seitenleiste des Betrachters); is_destination (an einem benannten Ziel des PDF öffnen); ib_allow_search, ib_allow_rotate und ib_allow_fullscreen (die Befehle Suchen, Drehen und Vollbild der Leiste des Betrachters) |
| picture | of_set_picture(blob): ein im Speicher gehaltenes Bild (SelectBlob), wie SetPicture des nativen Picture; ib_clickable: das Bild wird zur Schaltfläche für die Tastatur (Tab, Eingabe, Leertaste); die Formate TIFF, WMF, EMF und RLE, im Flug umgewandelt; ein Name für Bildschirmleser, der die Plakette und den Fehlschlag nennt |
| radialmenu | of_show_over(dragobject ado_control {, boolean ab_keyboard}): das Rad zentriert auf einem Steuerelement, sein erster Zweig leuchtet, wenn es von der Tastatur kommt; auf dem Zweig-Handle is_image (Symbol an Ort und Stelle geändert), is_tone (Konstanten TONE_* von u_pbt_radialmenu) und is_group (Optionsgruppe) |
| restclient | of_url und of_url_encode (eine kodierte URL-Abfrage); of_post_form und of_post_form_async (ein HTML-Formular); of_oauth_client_credentials (ein sich selbst erneuerndes OAuth2-Token); of_retrieve (DataStore, DataWindow, DataWindowChild: ein JSON-Array als Zeilen); die Header einer einzelnen Anfrage (of_request und of_request_async, viertes Argument as_headers); is_last_request; ib_check_revocation |
| statusbar | ib_spring (und eine Breite von -1 in of_add_panel, of_insert_panel): ein Bereich, der den freien Platz nimmt; of_dock_bottom (die Leiste am unteren Fensterrand); is_help und is_help_panel (die MicroHelp eines PowerBuilder-Rahmens); ib_announce (Bildschirmleser); der Tooltip eines gekürzten Textes |
| tilesbox | of_move_tile(as_keys, as_to_key, al_position): eine vom Code in eine andere Gruppe geschickte Kachel, mit Farben, Plakette und Seiten; Esc bricht ein Ziehen ab, das Panel rollt, wenn sich der Mauszeiger seinem Rand nähert; ein Bildschirmleser hört die Plakette und das Laufband einer Kachel; ein SVG-Symbol bleibt auf einer großen Kachel scharf; die Kopfzeile einer Gruppe hellt sich unter dem Mauszeiger auf; die Windows-Einstellung „weniger Animationen“ wird beachtet |
| statictext | ib_mnemonic (das & einer PowerBuilder-Beschriftung), ii_max_lines (höchstens N Zeilen, „…“), il_max_log_lines und of_clear (ein begrenztes, geleertes Protokoll), ii_max_width (Obergrenze von ib_auto_width), ib_veto_links und ue_hyperlink_opening (entscheiden, ob sich ein Link öffnet); ein Protokoll wird Bildschirmlesern Zeile für Zeile angesagt; deaktiviert verlassen die Bereiche der Auszeichnung die Tab-Reihenfolge |
| xml | of_get_number, of_get_decimal, of_get_longlong, of_get_boolean, of_get_date, of_get_datetime: der Wert am XPath, gegen seinen XML-Schema-Typ geprüft und auf jedem Rechner gleich gelesen (NULL und of_get_last_error(), wenn er nicht von diesem Typ ist) |
| xml | Überladungen decimal, date, datetime, boolean von of_leaf, of_element_attr und of_set_value: mit Punkt und in ISO 8601 geschrieben, unabhängig vom Rechner |
12.7 buttonbar: Schlüssel, Beschriftung, dann Symbol; das „&“ und das Kürzel #
Die Schaltflächenleiste sprach anders als der Rest der Bibliothek: das Symbol vor der Beschriftung, die Position als zweites Argument und ein is_shortcut, das „Alt-Buchstabe“ bedeutete, wo es überall sonst „Kürzel“ bedeutet — is_shortcut = "Ctrl+S" belegte Alt+C. 5.0 gleicht sie an button, die Symbolleiste und den CommandButton von PowerBuilder an.
| Was | 4.0 | 5.0 |
|---|---|---|
| Eine Schaltfläche hinzufügen | uo.of_add_button("save", "img\save.png", "Save") | uo.of_add_button("save", "&Save", "img\save.png") |
| Eine reine Textschaltfläche | uo.of_add_button("ok", "", "OK") | uo.of_add_button("ok", "OK") |
| Eine Schaltfläche einfügen | uo.of_insert_button("mid", 2, "", "Mid") | uo.of_insert_button("mid", "Mid", "", 2) |
| Der Alt-Buchstabe einer Schaltfläche | is_shortcut ← "S" (Alt+S) | die Beschriftung "&Save" oder uo.of_button("save").is_mnemonic = "S" |
| Ein Kürzel auf einer Schaltfläche | uo.of_register_shortcut("Ctrl+S", "save") | dasselbe oder uo.of_button("save").is_shortcut = "Ctrl+S" — im Tooltip angezeigt |
| Ein „&“ in einer Beschriftung | unverändert angezeigt | markiert den Alt-Buchstaben; && für ein geschriebenes „&“ |
| Die Plakette | uo.of_button("inbox").il_badge = 3 | uo.of_button("inbox").is_badge = "3" (ein Text: "New", "!"); il_badge wird weiter akzeptiert |
Die fokussierte Schaltfläche, ohne is_default | voll im Akzent gefärbt | nur sein Fokusrahmen |
is_shortcuteiner Schaltfläche ist ein Kürzel. Während 5.0 wird ein einzelner Buchstabe dort noch als Alt-Buchstabe von 4.0 gelesen (er geht inis_mnemonic); schreiben Sie stattdessen das „&“ in die Beschriftung. Ein Kürzel, das das Fenster nie auslösen kann (ein Buchstabe allein,Ctrl+Shift), wird abgelehnt:is_shortcutliefert leer,of_register_shortcutliefert-5.- Eine deaktivierte Schaltfläche stiehlt keine Taste mehr. Die deaktivierte Standardschaltfläche einer Leiste oder der Alt-Buchstabe einer deaktivierten Schaltfläche lässt Enter und den Buchstaben beim Fenster — sie gehen nicht mehr an die Schaltfläche einer ANDEREN Leiste (zwei MDI-Blätter); das Kürzel einer deaktivierten Schaltfläche lässt seine Taste beim Fenster (etwa einem Menü-Accelerator). Die Pfeiltasten überspringen eine deaktivierte Schaltfläche.
// 4.0 : the icon before the label
uo_bar.of_add_button(/*key*/ "save", /*image_file*/ "img\save.png", /*text*/ "Save")
// The Alt letter went to is_shortcut (the letter S alone), the chord to of_register_shortcut
uo_bar.of_register_shortcut(/*chord*/ "Ctrl+S", /*key*/ "save")
// 5.0 : key, label, icon - the "&" of the label gives Alt+S
uo_bar.of_add_button(/*key*/ "save", /*text*/ "&Save", /*image*/ "img\save.png")
// The chord is a property of the button, shown in its tooltip
uo_bar.of_button(/*key*/ "save").is_shortcut = "Ctrl+S"
Das Rezept: Kompilieren Sie; ein Aufruf von of_insert_button wird gemeldet (die Position kommt zuletzt). Ein of_add_button mit drei Argumenten kompiliert weiterhin: Vertauschen Sie die letzten beiden (die Beschriftung, dann das Symbol) — eine Schaltfläche, deren Beschriftung ein Dateipfad ist, zeigt Ihnen die übrigen. Ersetzen Sie jedes is_shortcut aus einem Buchstaben durch ein „&“ in der Beschriftung und verdoppeln Sie jedes „&“, das angezeigt werden soll (R&&D).
12.8 crosstab: das Format der Werte über is_format #
Die Kreuztabelle schrieb die Zahlen einer Kennzahl über eine Funktion mit vier oder fünf Argumenten (Dezimalstellen, Tausendertrennzeichen, Symbol, Symbol davor), die für alle Werte eines Feldes galt: Dasselbe Feld zweimal in Werte — der Betrag und sein Anteil an der Summe — konnte keine zwei Formate haben. 5.0 stellt es unter die Sprache der Diagramme und Anzeigen: ein PowerBuilder-Anzeigeformat in is_format, auf dem Handle des Feldes (of_field) für alle seine Werte oder auf dem Handle eines Wertes (of_value(position), neu) nur für ihn. Leer übernimmt ein Wert das Format der DataWindow-Spalte. Kein alter Name bleibt.
| Was | 4.0 | 5.0 |
|---|---|---|
| Das Format aller Werte eines Feldes | uo.of_set_value_format("amount", 2, "locale", "$", true) | uo.of_field("amount").is_format = "$#,##0.00" |
| Ein Symbol nach der Zahl | uo.of_set_value_format("amount", 0, "", " EUR") | uo.of_field("amount").is_format = '#,##0" EUR"' |
| Das Format eines Wertes (dasselbe Feld zweimal) | — | uo.of_value(2).is_format = "#,##0.00" |
| Negative in Rot | nur das Chip-Menü | uo.of_value(1).ib_negative_red = true |
| Zurück zum Standardformat | uo.of_clear_value_format("amount") | uo.of_field("amount").is_format = "" (das Format der DataWindow-Spalte) |
- Das Tausendertrennzeichen eines Wertes ohne Format bleibt
is_thousands, wie das Menü Optionen des Rasters: Das tat einof_set_value_formatmit leerem Trennzeichen. Die Währung, die das Chip-Menü anbietet, bleibtis_currency_symbol. - Ein Wert ohne Format zeigt jetzt das Format seiner Spalte im DataWindow, von
of_from_datastoregelesen: Ein Betrag, dessen Spalte#,##0.00trägt, wird ohne eine Zeile Code mit zwei Dezimalstellen angezeigt.
// 4.0 : decimals, thousands, symbol and its side as arguments - for every value of the field
uo_cross.of_set_value_format(/*field*/ "amount", /*decimals*/ 2, /*thousands*/ "locale", /*suffix*/ "$", /*symbol_before*/ true)
// 5.0 : a display format, written as in a DataWindow - for the field, then for its second value alone
uo_cross.of_field(/*field*/ "amount").is_format = "$#,##0.00"
uo_cross.of_value(/*position*/ 2).is_format = "#,##0"
Das Rezept: Kompilieren Sie; jedes of_set_value_format und of_clear_value_format wird gemeldet. Schreiben Sie das Format wie in einem DataWindow: ai_decimals gibt die Zahl der 0 nach dem Punkt, ein Tausendertrennzeichen das Gruppierungs-, ("none": keines), das Symbol steht davor oder dahinter (in Anführungszeichen, wenn es Ziffern oder Leerzeichen enthält). Das Format eines einzelnen Wertes gehört in of_value(<Position>).is_format.
12.9 listbar: der Rechtsklick trägt seinen Punkt, eine Anordnung wird gemeldet #
Die Seitenleiste schließt sich der Bibliothek in drei Punkten an: Der Rechtsklick auf einen Eintrag liefert seinen Bildschirmpunkt wie bei den Bäumen, den Rastern und dem Kanban; ein Befehl des Codes, der die Anordnung ändert, meldet sie wie eine Geste; ein ausgegrauter Eintrag wird nicht mehr zur Auswahl. Sie erhält außerdem ein Ereignis für den Klick auf den bereits ausgewählten Eintrag, eine Suche und den Aufbau aus einem DataStore (12.6).
| Was | 4.0 | 5.0 |
|---|---|---|
ue_item_rclicked | (string as_keys) | (string as_keys, long al_x, long al_y): der Punkt in Bildschirmpixeln; die Menütaste und Umschalt+F10 lösen es ebenfalls aus |
of_set_layout, das die Anordnung ändert | kein Ereignis | ein ue_layout_changed (nie ue_section_toggled) |
of_move_item / of_move_section an den bereits gehaltenen Rang | ue_layout_changed | nichts: nichts hat sich bewegt |
of_select_item eines ausgegrauten Eintrags | 0, er wurde zur Auswahl | -5, ohne ue_selection_changing zu fragen; den bereits ausgewählten Eintrag auszugrauen, behält ihn |
ib_auto_width gelesen, während die Leiste eingeklappt ist | true | was die Anwendung gesetzt hat |
of_item einer Adresse mit einer Ebene ("nav") | erreichte den Abschnitt | ein Handle, das nichts benennt; ein Abschnitt wird über of_section erreicht |
| Derselbe Buchstabe zweimal getippt | ein Präfix dd, oft ohne Treffer | die nächste Zeile, die mit ihm beginnt; ein Leerzeichen mitten im Präfix gehört dazu |
| Ein ausgegrauter Eintrag unter dem Mauszeiger | ohne Tooltip | ihr Tooltip erscheint; der Klick bewirkt weiterhin nichts |
// 4.0 : PointerX() of the userobject - the menu opened too high under a ribbon
m_entry.PopMenu(PointerX(), PointerY())
// 5.0 : the pointer of the WINDOW for a PowerBuilder menu (al_x, al_y serve a menu of the library)
m_entry.PopMenu(parent.PointerX(), parent.PointerY())
Das Rezept: Nichts verweigert die Kompilierung — ein Skript von ue_item_rclicked behält as_keys. Öffnen Sie Ihr Menü am Mauszeiger des Fensters (parent.PointerX()), oder übergeben Sie al_x, al_y an of_show eines contextmenu. Setzen Sie die anfängliche Auswahl, bevor Sie ib_veto_selection einschalten, und prüfen Sie, dass Ihr ue_layout_changed den Aufruf verträgt, den of_set_layout jetzt auslöst.
12.10 scheduler: die Art einer Änderung und die bisherigen Werte #
Der Kalender schließt sich dem Gantt-Diagramm an: Die Frage vor einer Geste sagt, ob es ein Verschieben oder eine Größenänderung ist, und die folgenden Ereignisse liefern die bisherigen Werte — ein Protokoll, ein Rückgängigmachen oder eine Bestätigung müssen keine eigene Kopie jedes Termins mehr führen. Eine Auswahl, die Ihr Code entfernt, wird gemeldet, und vier Aufrufe lehnen jetzt ab, was sie stillschweigend annahmen.
| Was | 4.0 | 5.0 |
|---|---|---|
ue_appointment_changing | (string as_key, string as_start, string as_end, string as_resource) | (string as_key, string as_kind, string as_start, string as_end, string as_resource): as_kind ist CHANGE_MOVE oder CHANGE_RESIZE |
ue_appointment_moved | (string as_key, string as_start, string as_end, string as_resource) | (string as_key, string as_start, string as_end, string as_resource, string as_old_start, string as_old_end, string as_old_resource) |
ue_appointment_resized | (string as_key, string as_start, string as_end) | (string as_key, string as_start, string as_end, string as_old_start, string as_old_end) |
| Ihr Code entfernt, leert oder lädt den ausgewählten Termin neu | kein Ereignis | ue_selection_changed(""); of_reset bleibt stumm |
of_add_appointment, dessen Ende vor dem Beginn liegt | 0, das Ende wurde Beginn + 30 Min. | -5, of_get_last_error sagt warum |
of_scroll_to_time("abc") | 0, nichts scrollte | -5 |
of_set_field auf der Spalte mit ROLE_KEY | 0, zwei Termine mit einem Schlüssel | -5: Ein Schlüssel ändert sich durch Neuladen |
of_show_appointment eines ausgeblendeten, gefilterten oder auf einer ausgeblendeten Ressource liegenden Termins | 0, die Ansicht wechselte zu einem Tag, an dem nichts zu sehen war | -5, nichts bewegt sich |
is_now nach einer Navigation des Benutzers gesetzt | brachte die Ansicht zu seinem Tag zurück | die Ansicht bleibt, wohin der Benutzer gegangen ist |
of_clear_appointments | behielt die Spalten des DataStores für of_map | vergisst den DataStore: of_map akzeptiert die Spalten des nächsten |
// 5.0 : ue_appointment_changing event of uo_sched : (string as_key, string as_kind, string as_start, string as_end, string as_resource) returns boolean
// A resize keeps the day : only a move is checked
if as_kind = u_pbt_scheduler.CHANGE_RESIZE then return true
// Nothing on a Saturday or a Sunday : returning false puts the appointment back
if DayNumber(Date(Left(as_start, 10))) = 1 or DayNumber(Date(Left(as_start, 10))) = 7 then return false
return true
Das Rezept: Nichts verweigert die Kompilierung — ein Skript von ue_appointment_changing, ue_appointment_moved oder ue_appointment_resized behält seine Argumente, die neuen kommen hinzu. Wenn Ihr ue_selection_changed Schaltflächen aktiviert, erhält es jetzt "", wenn der ausgewählte Termin verschwindet; prüfen Sie die Rückgabewerte von of_add_appointment, of_scroll_to_time, of_set_field und of_show_appointment, die jetzt -5 liefern können. Um die Gesten ohne Code zu speichern, siehe ib_write_back.
12.11 shellexplorer: der Fehler nennt seinen Grund #
Der Shell-Explorer gibt jetzt in ue_error wie in ue_path_not_found einen Grund, den Ihr Code prüfen kann — eine REASON_*-Konstante von u_pbt_shellexplorer, gleich in jeder Sprache von Windows. Er löst ue_selected für den bereits gewählten Ordner nicht mehr aus und meldet mit ue_collapsed einen Zweig, den er selbst schließt. Er erhält außerdem den Rechtsklick auf einen Ordner (ue_node_rclicked) und die Adresse der Wurzel.
| Was | 4.0 | 5.0 |
|---|---|---|
ue_error | (string as_message) | (string as_path, string as_reason, string as_message): der Pfad ("" für den Desktop), eine REASON_*-Konstante, der Text der Shell |
as_reason von ue_path_not_found | ein englischer Satz (not found, outside the root, not a branch…) | eine REASON_*-Konstante (not_found, outside_root, not_a_branch…); not_shown für einen Pfad, der existiert, den der Baum aber nicht zeigt |
| Den bereits gewählten Ordner erneut wählen (Klick, Pos1 auf der ersten Zeile) | ue_selected | nichts |
| Ein Zweig, den der Baum selbst schließt (leer zurückgekommen, von der Shell verweigert) | kein Ereignis | ue_collapsed |
ib_show_files, ib_show_hidden, is_file_filter, is_root mit ihrem Wert geschrieben | der Baum wird neu gelesen | nichts wird neu gelesen; is_file_filter ohne Dateien gesetzt wartet auf sie |
of_collapse eines zweimal gezeichneten Pfads | jede Zeile, je ein ue_collapsed | die Zeile, die of_select erreicht, ein ue_collapsed |
of_count(""), of_keys_at("", i) | die angezeigten Zeilen, wie of_count() | die erste Ebene (die Wurzel), wie of_count(is_root) |
// 5.0 : ue_error event of uo_tree : (string as_path, string as_reason, string as_message)
// Test the reason, never the text of the shell
if as_reason = u_pbt_shellexplorer.REASON_TIMEOUT then
st_status.text = "The network folder " + as_path + " does not answer"
else
st_status.text = as_message
end if
Das Rezept: Nichts verweigert die Kompilierung — ein Skript von ue_error behält as_message, die neuen Argumente kommen hinzu. Eine Prüfung auf den TEXT von as_reason in ue_path_not_found ("not found", "outside the root") wird mit einer REASON_*-Konstante neu geschrieben; eine Anwendung, die bei jedem ue_selected einen Bereich neu lud, tut es jetzt einmal je Änderung.
12.12 tilesbox: der Rechtsklick trägt seinen Punkt, ein Befehl des Codes wird gemeldet, die Anordnung überlässt die Rechte der Anwendung #
Das Kachel-Panel schließt sich der Bibliothek an: sein Rechtsklick liefert den Bildschirmpunkt wie bei den Bäumen, den Rastern und dem Kanban; ein Befehl des Codes, der eine Kachel verschiebt, eine Gruppe einklappt oder eine Größe ändert, löst dieselben Ereignisse aus wie eine Geste; die Anordnung enthält die Sichtbarkeit nicht mehr, sie bleibt Sache der Anwendung. Es erhält außerdem das Verschieben einer Kachel in eine andere Gruppe per Code (12.6).
| Was | 4.0 | 5.0 |
|---|---|---|
ue_tile_context | (string as_keys) | ue_tile_rclicked (string as_keys, long al_x, long al_y): der Punkt in Bildschirmpixeln; die Menütaste und Umschalt+F10 lösen es ebenfalls aus, an der linken unteren Ecke der Kachel |
of_move_tile, of_insert_tile | integer ai_index | long al_position; eine Überladung of_move_tile(as_keys, as_to_key, al_position) schickt die Kachel in eine andere Gruppe |
of_move_tile an eine andere Stelle | nichts | ue_tile_moved, ue_layout_changed |
ib_collapsed einer Gruppe, vom Code gesetzt | ue_group_toggled | ue_group_toggled, ue_layout_changed |
is_size, vom Code gesetzt | nichts | ue_layout_changed (nie ue_tile_resized, das sagt, dass der Benutzer sie gewählt hat) |
is_size einer unbekannten Größe ("huge") | die Kachel wurde medium | abgelehnt: nichts wird geschrieben, of_get_last_error sagt warum; of_add_tile / of_insert_tile liefern -5 |
Die Anordnung (of_get_layout, ue_layout_changed) | enthielt die Sichtbarkeit der Gruppen und Kacheln | enthält sie nicht mehr: of_set_layout blendet nie wieder ein, was Ihr Code ausgeblendet hat; eine 4.0-Anordnung wird ohne sie gelesen |
of_set_layout, das die Anordnung ändert | kein Ereignis | ein ue_layout_changed; -5 bei einem JSON, das keine Anordnung ist ({}) |
of_tile / of_group einer Adresse, die nichts benennt | ein Handle pro Aufruf, behalten | das wirkungslose Handle, dasselbe für alle: es schreibt nichts und liest sich leer |
// 4.0 : the right click of a tile
// ue_tile_context event of uo_tiles : (string as_keys)
// 5.0 : the same script, under the new name, with the screen point
// ue_tile_rclicked event of uo_tiles : (string as_keys, long al_x, long al_y)
Das Rezept: Kompilieren Sie; Ihr Skript von ue_tile_context bleibt an einem Ereignis, das es nicht mehr gibt — verschieben Sie es nach ue_tile_rclicked, das as_keys behält. Wenn Ihr ue_layout_changed die Anordnung speichert, sieht es jetzt auch, was Ihr Code ändert; ein ue_tile_moved, das nur auf den Benutzer reagieren soll, ignoriert die Verschiebungen, die Ihr Code gerade vorgenommen hat. Wenn Sie die Sichtbarkeit in der Anordnung aufbewahrt haben, setzen Sie sie beim Öffnen per Code (ib_visible), nach den Rechten.
12.13 tab: der Rechtsklick trägt seinen Punkt, eine angewendete Anordnung wird gemeldet #
Die Registerkarte schließt sich der Bibliothek an: Der Rechtsklick auf eine Registerkarte liefert bei ausgeschaltetem integriertem Menü seinen Bildschirmpunkt wie bei den Bäumen, den Rastern und dem Kanban, und of_set_layout, das die Anordnung ändert, meldet sie wie eine Geste. Ein an seinen Platz zurückgegebenes Ziehen meldet nichts mehr. Sie erhält außerdem bei Bedarf erzeugte Seiten (ue_page_needed, of_supply_page), den Doppelklick (ue_tab_double_clicked), ib_cycle_keys, is_close_mode, ii_strip_width und, auf einer Seite, ib_modified und is_badge — siehe die Seite der Registerkarte.
| Was | 4.0 | 5.0 |
|---|---|---|
ue_tab_rclicked | (string as_key) | (string as_key, long al_x, long al_y): der Punkt in Bildschirmpixeln; die Menütaste und Umschalt+F10 lösen es ebenfalls aus, an der linken unteren Ecke der Registerkarte |
of_set_layout, das die Anordnung ändert | kein Ereignis | ue_layout_changed, einmal |
ein an seinen Platz zurückgegebenes Ziehen, of_move_page an den eigenen Platz | ue_tab_reordered und ue_layout_changed | nichts: Die Reihenfolge hat sich nicht geändert |
mehrere Verschiebungen unter of_set_redraw(false) | ein ue_layout_changed pro Verschiebung | ein einziges, bei der Wiederaufnahme |
| Umschalt+F10 auf einer Registerkarte, integriertes Menü | das Menü öffnete sich unter der Maus | unter der Registerkarte |
| senkrechte Leiste und langer Titel | die Leiste nahm die Breite des Titels an | höchstens 40 % der Komponente, Auslassungspunkte; ii_strip_width legt sie fest |
il_accent einer Seite | nur der Fokusrahmen | unterstreicht auch die aktive Registerkarte |
is_shortcut auf dem Handle eines Schlüssels ohne Seite | registriert: Die Taste wurde umsonst belegt | nichts wird registriert, of_get_last_error sagt warum |
of_insert_page, dessen Verschiebung scheitert | negativer Code, die Seite blieb | negativer Code, die Seite wird wieder entfernt |
// 4.0 : the right click of a tab, built-in menu off
// ue_tab_rclicked event of uo_tabs : (string as_key)
// 5.0 : the same script, with the screen point
// ue_tab_rclicked event of uo_tabs : (string as_key, long al_x, long al_y)
Das Rezept: Nichts verweigert die Kompilierung — ein Skript von ue_tab_rclicked behält as_key. Öffnen Sie Ihr Menü am Mauszeiger des Fensters (parent.PointerX()), oder übergeben Sie al_x, al_y an of_show eines contextmenu. Prüfen Sie, dass Ihr ue_layout_changed den Aufruf verträgt, den of_set_layout jetzt auslöst.
12.14 soundplayer: die Nummer eines Tons, eine sofort zurückgegebene Ablehnung #
Der Soundplayer ändert drei Dinge, die Ihr Code sehen kann. Seine Ereignisse tragen die Nummer des Tons: ue_started, ue_ended und ue_failed erhalten ein letztes Argument, al_sound — die Nummer, die of_play_over und of_enqueue jetzt liefern (sie lieferten 0) und die das neue of_stop_sound nimmt. Eine sofort abgelehnte Quelle ist ein Code: of_play, of_play_over, of_crossfade und of_preload liefern -5, den Grund in of_get_last_error(), für eine leere Quelle, eine http://-Adresse, eine fehlerhafte file://-Adresse oder ein über seinen Namen abgelehntes Format — und lösen kein ue_failed mehr aus; der laufende Ton spielt weiter. In der Warteschlange (of_enqueue) kommt die Ablehnung weiterhin über ue_failed, bei ihrer Runde. Weitere -5: of_pause und of_resume ohne etwas anzuhalten oder fortzusetzen, of_beep und of_beep_sync mit 0 Hz oder 0 ms, of_meter außerhalb von 1 bis 64 Balken.
// Local variables
string ls_url
long ll_rc
// The address of the sound, typed by the user
ls_url = sle_url.text
// 4.0 : of_play returned 0, and an http:// address came back later through ue_failed
// 5.0 : the refusal is a code, at once ; of_get_last_error() gives the reason
ll_rc = inv_sound.of_play(/*source*/ ls_url)
if ll_rc = -5 then
MessageBox("Sound", inv_sound.of_get_last_error())
end if
Was sich ändert, ohne Ihrem Code etwas abzuverlangen: of_stop klingt jetzt über il_fade_ms aus, wie die Dokumentation es versprach (ue_stopped kommt weiterhin sofort); wenn il_timeout_ms abläuft, wird nur der Ton des synchronen Aufrufs abgebrochen — der Hintergrund, die Überlagerungen und die Warteschlange laufen weiter; of_crossfade zu einer abgelehnten Quelle behält den laufenden Titel; of_level ist 0 und of_spectrum liefert keinen Balken, wenn der Meter aus ist; of_equalizer(ab_on, ai_gains[]) setzt ein Band, das das Array nicht erreicht, auf 0 zurück; of_clear_queue vergisst auch die Töne, die die Warteschlange schon gespielt hat; die Meldungen von ue_failed folgen der Anzeigesprache (as_reason bleibt das zu prüfende Wort). Der Player erhält außerdem die bewegliche Warteschlange (of_next, of_previous, of_queue_index, ue_source_changed, ib_queue_repeat), die lückenlose Schleife (ib_gapless_loop, REASON_TOO_LONG), den Abschnitt (of_play_range), die Stummschaltung (ib_muted) und die Pufferung (ue_buffering, of_is_buffering) — siehe die Seite des Soundplayers.
Das Rezept: Nichts verweigert die Kompilierung — ein Skript von ue_started, ue_ended oder ue_failed behält seine Argumente, al_sound kommt hinzu. Prüfen Sie die Rückgabewert-Tests von of_play_over und of_enqueue (aus = 0 wird > 0) und den Code, der für eine http://-Adresse oder eine leere Quelle auf ue_failed wartete: er prüft jetzt das -5 des Aufrufs.
12.15 toaster: der Grund eines Schließens, ein vom Code geschlossener Toast meldet sich immer #
Der Toaster sagt, warum ein Toast geschlossen wurde: ue_toast_dismissed erhält ein letztes Argument, as_reason — REASON_TIMEOUT, REASON_USER (sein Kreuz), REASON_CODE (of_close, of_close_all) oder REASON_OWNER_CLOSED (sein Fenster wurde geschlossen). Und jeder vom Code geschlossene Toast meldet es, auch direkt nach of_show, bevor er gezeichnet wurde, oder während er auf seinen Platz wartete: Eine Anwendung, die auf ue_toast_dismissed wartete, um ihren Zustand freizugeben, hängt nicht mehr von einem Wettlauf ab.
| Was | 4.0 | 5.0 |
|---|---|---|
ue_toast_dismissed | (long al_id, string as_key) | (long al_id, string as_key, string as_reason), constants REASON_* |
of_close eines noch nicht gezeichneten oder wartenden Toasts | nichts wurde ausgelöst | ue_toast_dismissed, REASON_CODE |
of_close eines Toasts eines anderen Toasters | schloss ihn, die Meldung ging an den anderen | -5, nichts wird geschlossen, of_get_last_error sagt warum |
das Fenster von ipo_owner wird geschlossen | seine Toasts verschwanden wortlos | ue_toast_dismissed, REASON_OWNER_CLOSED |
| ein zerstörter Toaster, Toasts auf dem Bildschirm | sie blieben, stumm | die dauerhaften und die mit Schaltflächen schließen sich mit ihm; die anderen enden von selbst |
of_show, bevor die Anzeige-Engine bereit ist | -6: „Runtime fehlt“ | -4: erneut versuchen; of_get_last_error sagt warum |
| Ecke eines am Fenster verankerten Toasts | das ganze Fenster: der Toast verdeckte die Titelleiste und ihre Schaltflächen | der Clientbereich (der des Rahmens bei MDI) |
| ein sehr langer Titel | schob das Kreuz und die Schaltflächen aus dem Fenster | begrenzt, er scrollt |
// 4.0
// Event ue_toast_dismissed von inv_toaster : (long al_id, string as_key)
// 5.0 : dasselbe Skript, mit dem Grund
// Event ue_toast_dismissed von inv_toaster : (long al_id, string as_key, string as_reason)
Das Rezept: Nichts verweigert die Kompilierung — ein Skript von ue_toast_dismissed behält al_id und as_key, as_reason kommt hinzu. Prüfen Sie den Code, der annahm, ein sofort durch of_close geschlossener Toast würde nichts sagen: Er meldet es jetzt. Toasts bleiben an den Toaster gebunden, der sie gezeigt hat: Ein of_close auf die Kennung eines anderen Toasters liefert -5. Der Toaster erhält außerdem of_close_all (alle seine Toasts schließen) und of_get_last_error — siehe die Seite des Toasters.
12.16 video: eine sofort zurückgegebene Ablehnung, ein Film und seine Untertitel in einem Aufruf, derselbe Film fortgesetzt #
Der Videoplayer ändert fünf Dinge, die Ihr Code sehen kann. Eine Ablehnung wird sofort zurückgegeben, wie beim Soundplayer (12.14): of_play(), of_play(source) und of_play_range geben -5 zurück, den Grund in of_get_last_error(), für eine leere Quelle, eine http://-Adresse oder ein an seinem Namen abgelehntes Format (avi, wmv, flv) — und lösen kein ue_failed mehr aus; der laufende Film geht weiter. Die Eigenschaft is_source behält ihr ue_failed: eine Eigenschaft hat keinen Rückgabecode. Derselbe Film wird nicht neu geladen: of_play(source) oder is_source auf dem bereits geladenen Film setzt ihn fort, wo er ist (ue_resumed), statt ihn neu zu starten; of_seek(0) startet ihn neu. Eine Suche bleibt im Abschnitt von of_play_range, die des Benutzers wie of_seek: Pos1 geht zum Anfang des Abschnitts, ein Klick hinter sein Ende zu seinem Ende — vorher verließ Pos1 den Ausschnitt, und ein Klick dahinter hielt den Film an. Ein nicht abspielbarer Listeneintrag löst zuerst ue_source_changed aus, dann ein einziges ue_failed — es kam vorher, und zweimal. of_stop wird eine Funktion: es gab nichts zurück (Subroutine), es gibt 0 zurück, oder -2, wenn die Komponente nicht erzeugt ist — wie of_stop des Webbrowsers.
// Local variables
string ls_path
long ll_rc
// The film chosen by the user
ls_path = sle_film.text
// 4.0 : of_play returned 0, and an http:// address or an .avi came back later through ue_failed
// 5.0 : the refusal is a code, at once ; the reason is in of_get_last_error
ll_rc = uo_video.of_play(/*source*/ ls_path)
if ll_rc = -5 then
MessageBox("Video", uo_video.of_get_last_error())
end if
Was sich ändert, ohne Ihrem Code etwas abzuverlangen: eine Marke, die durch eine Suche WÄHREND DER PAUSE erreicht wird, löst kein ue_marker_reached mehr aus (nur ue_seeked); Leertaste und Wiedergabe-Schaltfläche eines Players ohne Film tun nichts mehr (sie lösten ue_failed(REASON_NO_SOURCE) aus); die vom Benutzer gewählte Untertitelsprache folgt zum nächsten Film der Liste; ein http://-Poster wird abgelehnt und is_poster liest sich leer; ein abgelehntes is_subtitles liest sich leer; eine nicht auffindbare Untertiteldatei des Arbeitsplatzes löst ue_subtitles_failed(REASON_NOT_FOUND) aus; das Geschwindigkeitsmenü ist per Tastatur bedienbar, und seine Pfeile ändern die Lautstärke nicht mehr; im Vollbild zeigt sich die Leiste über die Tastatur; die gemerkte Position (ib_remember_position) hängt nicht mehr von der Schreibweise des Pfads ab, und nur die letzten 200 Filme werden behalten (eine Position aus 4.0 wird noch einmal gelesen). Der Player erhält of_play(source, subtitles) (der Film und SEINE Untertitel: vor einem zweiten Film gesetzt, gingen sie mit dem ersten), ib_forward_seek, of_watched_ms, of_watched_percent, ue_watched_completely und ib_skip_failed — siehe die Seite des Videoplayers.
Das Rezept: nichts verweigert das Kompilieren. Lesen Sie den Code noch einmal, der nach of_play für eine http://-Adresse, eine leere Quelle oder eine .avi auf ue_failed wartete: er prüft jetzt die -5 des Aufrufs. Lesen Sie auch eine „Abspielen“-Schaltfläche noch einmal, die sich darauf verließ, dass of_play(source) von vorn beginnt: fügen Sie of_seek(0) hinzu.
12.17 webbrowser: eine Geste des Benutzers wird erfragt, eine Seite von of_show_html hat keine Adresse #
Mit ib_veto_navigation = true wird ue_navigating jetzt auch für eine Geste des Benutzers erfragt: eine in die Leiste getippte Adresse, Link öffnen im Kontextmenü, ein durch einen Klick geöffnetes neues Fenster. In 4.0 fragten diese drei Wege nicht. Nur eine von Ihrem Code gesetzte Adresse wird nie erfragt, ebenso wenig eine Umleitung des Servers: Für eine Serverliste, die auch für Umleitungen gilt, setzen Sie die neue Eigenschaft is_allowed_hosts.
| Was | 4.0 | 5.0 |
|---|---|---|
ue_navigating unter dem Veto: getippte Adresse, Link öffnen, neues Fenster | die Seite öffnete sich ohne Rückfrage | die Rückfrage wird gestellt; false behält die Seite |
is_address, die Leiste, ue_load_completed nach of_show_html | die ganze Seite, kodiert (data:text/html;charset=utf-8,…, bis zu 2 MB) | "" |
is_title einer Seite ohne <title> | ihre Adresse | "" |
of_go_back, of_go_forward, of_stop | ohne Rückgabewert | long: 0, sobald angefordert, -2 Komponente nicht erstellt |
ib_private nach einer Seite geändert | is_address, is_title, die Leiste und die Pfeile behielten die vorherige Seite | alles liest sich leer: die Ansicht ist neu |
| Eingabe in einer leeren Adressleiste | die Seite wurde leer | nichts |
| Eine Seite der Website lädt, Adressleiste angezeigt | Neu laden bleibt Neu laden | Neu laden wird zu Abbrechen und kehrt zurück, sobald die Seite geladen ist |
Das Rezept: nichts verweigert das Kompilieren, ein ignorierter long kompiliert. Ein für die Links der Website geschriebenes Skript von ue_navigating sieht jetzt auch die vom Benutzer getippten Adressen: Wenn es anhand der Adresse entscheidet, soll es deren Host vergleichen, wie das Beispiel der Komponentenseite — oder überlassen Sie die Liste is_allowed_hosts. Code, der as_url von ue_load_completed oder is_address nach of_show_html las, erhält eine leere Zeichenkette.
12.18 toolbar: der Rechtsklick trägt seinen Punkt, ein Befehl des Codes wird gemeldet #
Die Symbolleiste schließt sich der Bibliothek an: der Rechtsklick eines Werkzeugs liefert seinen Bildschirmpunkt, wie bei den Bäumen, den Rastern und der Registerkarte, und das Verschieben einer Leiste per ii_band / ii_index löst ue_bar_reordered wie die Geste aus. Zwei Hinzufügungen lehnen ab, was sie stillschweigend annahmen, und ein Tastenkürzel, das dort gesetzt wird, wo nichts lebt, wird nicht mehr registriert. Sie erhält außerdem is_text auf einer Leiste, einen von einem Bildschirmleser gelesenen Namen für jedes Werkzeug und jedes Feld sowie eine Tastatur, die die Felder durchquert — siehe die Seite der Symbolleiste.
| Was | 4.0 | 5.0 |
|---|---|---|
ue_item_rclicked | (string as_keys) | (string as_keys, long al_x, long al_y): der Punkt in Bildschirmpixeln; die Menütaste und Umschalt+F10 lösen es ebenfalls aus, an der unteren linken Ecke des Werkzeugs, ebenso der Rechtsklick eines Feldes |
ii_band / ii_index, die eine Leiste verschieben | ue_layout_changed | ue_bar_reordered, ue_layout_changed |
of_add_datepicker mit einem Datum, das nicht jjjj-mm-tt ist ("31/12/2026") | 0, das Datum unverändert angezeigt | -5, nichts wird hinzugefügt |
of_add_menu_separator auf einem Eintrag ohne Untereintrag | 0: der Eintrag wurde grau und ließ sich nicht mehr wählen | -5 |
is_shortcut oder of_register_shortcut auf einer Adresse ohne Inhalt, einem Eintrag mit Kaskade oder einer Auswahl einer Liste | registriert: die Taste wurde im ganzen Fenster abgefangen | nichts registriert; of_register_shortcut liefert -5, of_get_last_error sagt warum |
| Strg+A, Strg+C, Strg+V, Strg+X, Strg+Z, Strg+Y in einem Feld der Leiste | das Werkzeug mit dem Tastenkürzel wurde ausgelöst | das Feld bearbeitet seinen Text |
is_text einer Datumsauswahl | behalten und zurückgelesen, nie angezeigt | ignoriert, liest "" |
// 4.0 : the right click of a tool
// ue_item_rclicked event of uo_toolbar : (string as_keys)
// 5.0 : the same script, with the screen point
// ue_item_rclicked event of uo_toolbar : (string as_keys, long al_x, long al_y)
Das Rezept: nichts verweigert die Kompilierung — ein Skript von ue_item_rclicked behält as_keys. Öffnen Sie Ihr Menü am Punkt al_x, al_y (übergeben Sie ihn an of_show eines contextmenu). Prüfen Sie, dass ein Skript von ue_bar_reordered auch die Verschiebungen Ihres Codes annimmt, testen Sie den Rückgabecode von of_add_datepicker, wenn das Datum aus einem regionalen Feld kommt, und setzen Sie is_shortcut nach dem Hinzufügen des Werkzeugs oder des Eintrags.
12.19 Der Rechtsklick auf ein Element trägt seinen Punkt: buttonbar, breadcrumb, chartcartesian, statusbar #
Eine einzige Regel für jeden Rechtsklick auf ein Element der Bibliothek: das Ereignis erhält den Schlüssel (oder die Adresse) des Elements, dann al_x, al_y, den Punkt, an dem ein Menü zu öffnen ist, in Bildschirmpixeln — der Zeiger, oder über die Tastatur (Menü-Taste, Umschalt+F10) die Ecke unten links des Elements (unten rechts bei Leserichtung von rechts nach links; die Mitte einer Form, die kein Rechteck ist: ein Punkt eines Diagramms). Ein contextmenu der Bibliothek öffnet sich dort unverändert: uo_menu.of_show(al_x, al_y). Drei Ereignisse, die ihn nicht trugen, erhalten ihn; die Statusleiste multiplizierte ihren mit der Skalierung des Bildschirms, und ein dort geöffnetes Menü landete auf einem Bildschirm mit 125 % oder 150 % weit vom Zeiger entfernt.
| Was | 4.0 | 5.0 |
|---|---|---|
buttonbar · ue_button_rclicked | (string as_key) | (string as_key, long al_x, long al_y) |
breadcrumb · ue_item_rclicked | (string as_keys) | (string as_keys, long al_x, long al_y) |
chartcartesian · ue_point_rclicked | (string as_key, long al_index, double ad_value) | (string as_key, long al_index, double ad_value, long al_x, long al_y) |
statusbar · al_x, al_y von ue_panel_rclicked | mit der Skalierung des Bildschirms multipliziert | der Punkt, wie die Seite ihn liest, wie bei jedem Rechtsklick |
// 5.0 : the menu of a button, opened where the user right-clicked it
// ue_button_rclicked event of uo_buttons : (string as_key, long al_x, long al_y)
is_menu_button = as_key
uo_menu.of_show(/*x*/ al_x, /*y*/ al_y)
Das Rezept: nichts verweigert die Kompilierung — ein Skript dieser Ereignisse behält seine Argumente. Öffnen Sie Ihr Menü am Punkt al_x, al_y (übergeben Sie ihn an of_show eines contextmenu); ein PowerBuilder-Menü behält PopMenu(PointerX(), PointerY()) Ihres Fensters. Ein Skript, das die Skalierung der Koordinaten von ue_panel_rclicked selbst korrigierte, darf das nicht mehr tun.
12.20 Die Basis: der Fehler einer Komponente ist ihr eigener, jedes Verb liefert einen Code #
Fünf Änderungen betreffen die ganze Bibliothek oder eine ganze Familie von Komponenten. Nur eine verweigert die Kompilierung: is_last_error einer nicht visuellen Komponente, jetzt of_get_last_error().
| Was | 4.0 | 5.0 |
|---|---|---|
of_get_last_error() einer visuellen Komponente | die letzte Meldung der DLL, eine für den ganzen Prozess — oft die einer anderen Komponente | was dieser Komponente geschah: ein abgelehnter Name oder ein Aufruf dieser Komponente an die DLL, dessen Grund im Moment des Fehlschlags gelesen wird; sonst leer |
Der Grund für das Scheitern einer nicht visuellen Komponente (crypto, restclient, soundplayer, speechout, xml, u_pbt_regex, u_pbt_zip) | inv.is_last_error | inv.of_get_last_error() |
of_stop, of_close, of_reset der nicht visuellen Komponenten (commandpalette, crypto, messagebox, restclient, soundplayer, speechout, toaster, xml) | ohne Rückgabewert | ein long, 0 sobald erledigt — wie die visuellen Komponenten |
of_set_property("tooltip", …) und super_tooltip_* auf einer Komponente ohne Tooltip (webbrowser, pdfviewer, radialmenu, progressbar) | setzte einen Tooltip, den die Dokumentation für nicht vorhanden erklärt | -5, und of_get_last_error() sagt warum |
Das Kürzel eines übernommenen PowerBuilder-Menüs (of_load_menu von menubar und commandpalette) | Ctrl++, PageUp, Insert (menubar); nichts jenseits von F12 (Palette) | eine Schreibweise, die des contextmenu: Ctrl+Plus, PgUp, Ins, F13 bis F24, Num 0 bis Num 9, Num + |
// Local variables
string ls_why
// 4.0 : ls_why = inv_crypto.is_last_error
// 5.0 : the reason of a failure, by the same method as every component
ls_why = inv_crypto.of_get_last_error()
Das Rezept: Der Compiler zeigt jedes .is_last_error, das durch .of_get_last_error() zu ersetzen ist. Ein als Anweisung geschriebener Aufruf von of_stop, of_close oder of_reset kompiliert weiterhin. Ein Skript, das of_get_last_error() einer Komponente las, um das Scheitern eines anderen Aufrufs zu erfahren (ein direkt aufgerufener Export der DLL, eine andere Komponente), liest jetzt den Grund dieser Komponente oder nichts: Fragen Sie den, der gescheitert ist.
Hinzugefügt, nichts nachzuarbeiten: is_accessible_name und is_accessible_description auf allen visuellen Komponenten — Name und Beschreibung, die ein Bildschirmleser sagt (3.4); of_from_datastore eines DataWindow oder eines DataWindowChild bei crosstab und datagrid, wie bei den anderen datengebundenen Komponenten; die vollständige Form von of_insert_command (commandpalette), die Hinweis, Kürzel und Schlüsselwörter wie of_add_command nimmt, mit einer Position als long.