codeeditor — u_pbt_codeeditor #
← Komponentenreferenz · Inhalt des Handbuchs
Code-Editor mit Syntaxhervorhebung: zehn Sprachen, Zeilennummern, Falten von Regionen, Suchen und Ersetzen, Diagnosemarkierungen in der Leiste und Ablegen von Dateien.
▶ Live ansehen — Demoanwendung, Kachel Code editor: die Vorschau, der zugehörige Code und diese Seite, nebeneinander.
Auf einen Blick #
| Userobject | u_pbt_codeeditor |
| Item-Klasse | — (Komponente ohne Items) |
| Wofür | Code, eine SQL-Abfrage oder eine Konfigurationsdatei eingeben oder anzeigen: überall dort, wo ein multilineedit zu unleserlich ist |
| Opt-in-Optionen | ib_track_caret, ib_allow_drop, ib_folding |
Schnellstart #
// open-Event des Fensters
uo_editor.is_syntax = uo_editor.SYNTAX_SQL
uo_editor.is_text = "SELECT c.name, SUM(o.amount) AS total~r~n" &
+ "FROM customer c~r~n" &
+ " INNER JOIN orders o ON o.cust_id = c.id~r~n" &
+ "WHERE o.status = 'paid'~r~n" &
+ "GROUP BY c.name"
// Local variables
string ls_sql
// Zuruecklesen, was der Benutzer tatsaechlich eingegeben hat
ls_sql = uo_editor.of_get_text()
is_textliefert dasselbe: Die Eingabe des Benutzers landet dort, sobald sie sich gesetzt hat (Eventue_changed).
Unterstützte Sprachen #
is_syntax akzeptiert eine dieser Konstanten oder SYNTAX_NONE (leere Zeichenkette) für reinen Text ohne Hervorhebung.
| Sprache | Konstante | Weitere akzeptierte Schreibweisen |
|---|---|---|
| PowerScript | SYNTAX_POWERSCRIPT | pb, powerbuilder |
| SQL | SYNTAX_SQL | tsql, plsql |
| JavaScript | SYNTAX_JAVASCRIPT | js, jsx |
| JSON | SYNTAX_JSON | jsonc |
| C-Familie | SYNTAX_C · SYNTAX_CPP · SYNTAX_CSHARP · SYNTAX_JAVA | c++, cxx, cs |
| HTML / XML | SYNTAX_HTML · SYNTAX_XML | htm, xhtml, svg |
| CSS | SYNTAX_CSS | scss, less |
| Python | SYNTAX_PYTHON | py |
| YAML | SYNTAX_YAML | yml |
| Markdown | SYNTAX_MARKDOWN | md, mkd |
Sprachen derselben Familie teilen sich die Hervorhebung (SYNTAX_JAVA färbt wie SYNTAX_C, SYNTAX_XML wie SYNTAX_HTML): Die Konstante, die Sie wählen, dokumentiert Ihre Absicht, das Ergebnis auf dem Bildschirm ist dasselbe. Der Wert unterscheidet nicht zwischen Groß- und Kleinschreibung, und ein unbekannter Name fällt ohne Fehler auf reinen Text zurück. is_syntax wird genau so zurückgelesen, wie es geschrieben wurde, Groß- und Kleinschreibung eingeschlossen: "SQL" bleibt "SQL".
Eigenschaften #
Inhalt und Sprache #
| Eigenschaft | Typ | Standard | Zweck |
|---|---|---|---|
is_text | string | "" | Der im Editor angezeigte Code. Beim Zurücklesen liefert er den aktuellen Inhalt, die Eingabe des Benutzers eingeschlossen, mit den übergebenen Zeilenenden: ein CRLF-Text wird in CRLF zurückgelesen, ein reiner CR-Text in CR, gefaltet oder nicht; ein Text, der sie mischt, wird in CRLF zurückgelesen. Ein neuer Text wird ab seiner ersten Zeile angezeigt, entfernt die Markierungen von of_add_marker und gilt nicht als geändert (ib_modified); er schließt auch die Suchleiste und leert den Rückgängig-Verlauf (of_undo), ohne ein Event auszulösen |
is_syntax | string | "" | Sprache der Hervorhebung: Konstanten SYNTAX_* (siehe Tabelle oben). SYNTAX_NONE = reiner Text. Wird so zurückgelesen, wie er geschrieben wurde: SYNTAX_CSHARP bleibt SYNTAX_CSHARP, auch wenn C# die C-Grammatik teilt; auch die Groß- und Kleinschreibung bleibt erhalten ("SQL" wird als "SQL" zurückgelesen) |
ib_readonly | boolean | false | Schreibgeschützter Editor: Der Benutzer kann lesen, ohne ändern zu können |
ib_modified | boolean | false | true, sobald der Text von dem als gespeichert erklärten abweicht: ein neues is_text ist nicht geändert, Eingabe, of_insert_text oder ein Ersetzen machen ihn geändert, Rückgängigmachen bis zum gespeicherten Text setzt ihn wieder auf false. Setzen Sie ihn nach dem Speichern auf false zurück; true erzwingt ihn. ue_modified_changed meldet, wann eine Änderung ihn umschaltet |
ib_can_undo | boolean | false | Nur lesbar, live gelesen: true, wenn of_undo (oder Strg+Z) eine Änderung rückgängig machen kann — false schreibgeschützt oder gefaltet. Ein neues is_text leert den Verlauf; ue_undo_state_changed meldet, wann sie sich ändert |
ib_can_redo | boolean | false | Nur lesbar, live gelesen: true, wenn of_redo (oder Strg+Y) eine rückgängig gemachte Änderung wiederherstellen kann; eine neue Änderung leert sie |
Anzeige #
| Eigenschaft | Typ | Standard | Zweck |
|---|---|---|---|
ib_line_numbers | boolean | true | Blendet die Zeilennummernleiste links ein oder aus; ausgeblendet behält eine schmale Leiste die Faltmarkierungen und die Diagnosen von of_add_marker |
ib_current_line | boolean | true | Hebt die Zeile hervor, in der die Einfügemarke steht; im Modus ib_wrap deckt das Band alle Reihen der Zeile ab |
ib_folding | boolean | false | Opt-in: erlaubt das Falten der Regionen #region … #endregion (//#region in PowerScript, JavaScript oder C) über die Leiste: #region beginnt gefaltet, #regionopen geöffnet; die Markierungen bleiben auch bei ib_line_numbers = false. Es ist ein Lesemodus: solange er aktiv ist, nimmt der Editor keine Eingabe an, denn das Eingabefeld enthält dann den gefalteten Text und nicht die Quelle; der Strg+Z-Verlauf bleibt erhalten: er kommt zurück, wenn das Falten endet. Eine Markierung ist per Tastatur erreichbar (Tab); Eingabe oder Leertaste faltet sie zu oder auf. Die gefalteten Zeilen werden so angezeigt, wie sie geschrieben sind (#regionopen eingeschlossen), und eine Kopie (Strg+C) oder of_selected_text liefert die Quelle des Bereichs, die Zeilen einer geschlossenen Region eingeschlossen; Rückgängig wird beim Falten nicht angeboten |
ib_wrap | boolean | false | Bricht lange Zeilen um, statt seitlich zu scrollen |
ib_match_brackets | boolean | true | Rahmt die runde, eckige oder geschweifte Klammer neben der Einfügemarke und ihr Gegenstück ein; Klammern in einer Zeichenkette oder einem Kommentar zählen nicht |
ii_tab_size | integer | 4 | Anzahl der Spalten, die ein Tabulator einnimmt, von 1 bis 12 (jeder andere Wert fällt auf 4 zurück); Eingabe nach einer öffnenden Klammer rückt um diese Breite ein |
is_font_family | string | "" | Schriftart des Editors (leer = Schriftart mit fester Zeichenbreite aus dem Design) |
ii_font_size | integer | 0 | Schriftgröße in Pixeln (0 = die Standardgröße der Anwendung, PBT_SetDefaultFont, ohne sie 13 Pixel) |
Navigation und Interaktionen #
| Eigenschaft | Typ | Standard | Zweck |
|---|---|---|---|
ib_search_enabled | boolean | true | Aktiviert die integrierte Suchleiste (Strg+F, Strg+H zum Ersetzen — siehe „Tastatur“); bei false liefert of_find -4 |
ib_find_match_case | boolean | false | Suchoption: findet nur Text mit derselben Groß-/Kleinschreibung. Die Schaltfläche Aa der Leiste ist derselbe Schalter; gilt für of_find, of_replace und of_replace_all |
ib_find_whole_word | boolean | false | Suchoption: findet den Text nur als ganzes Wort (der _ gehört zum Wort: ls_a wird in ls_ab nicht gefunden). Schaltfläche ab der Leiste. Buchstaben und Ziffern aller Schriften gehören zum Wort (ab wird in abπ nicht gefunden) |
ib_find_regex | boolean | false | Suchoption: der Text ist ein regulärer Ausdruck (JavaScript-Syntax); der Ersatz von of_replace kann dann $1, $& und $<name> verwenden. Ein ungültiger Ausdruck findet nichts, rahmt das Feld rot ein und lässt of_replace -5 liefern. Schaltfläche .* der Leiste. Ein Ersetzen nimmt auch leere Treffer: ^ schreibt vor jede Zeile, $ dahinter; of_find liefert -5 bei einem ungültigen Ausdruck, und eine Suche hält bei 10.000 Treffern an (der Zähler zeigt 10000+) |
il_doc_line | long | 0 | Bringt die angegebene Zeile in die Mitte der Ansicht und markiert sie mit einem Akzentband (Nummerierung ab 1, wie die Leiste) — die Zeile, auf die eine Dokumentation oder ein Suchergebnis zeigt. Einfügemarke und Auswahl des Benutzers bleiben unverändert (il_caret_line bewegt die Einfügemarke). Eine in einer gefalteten Region verborgene Zeile öffnet diese Region; das Band wird auch im Modus ib_wrap gezeichnet. 0 entfernt das Band; eine Zeile hinter dem Textende markiert nichts und wird so zurückgelesen, wie sie geschrieben wurde; jedes neue is_text entfernt das Band. Das Band wandert mit seiner Zeile, wenn der Text bearbeitet wird |
il_caret_line | long | 1 | Die Zeile der Einfügemarke, ab 1, live gelesen (gefaltet: die der Leiste). Das Schreiben setzt die Einfügemarke an den Anfang dieser Zeile und bringt sie auf den Bildschirm — das „Gehe zu Zeile“ eines Compilerfehlers; eine in einer gefalteten Region verborgene Zeile öffnet diese Region, eine Zeile hinter dem Ende bleibt bei der letzten. Mit ib_track_caret folgt ue_caret_changed, wie bei einem Klick — nichts, wenn die Einfügemarke bleibt, wo sie ist |
il_caret_column | long | 1 | Die Spalte der Einfügemarke, ab 1, live gelesen: der Rang des Zeichens in seiner Zeile (ein Tabulator zählt als eins). Das Schreiben bewegt die Einfügemarke entlang ihrer Zeile; hinter dem Zeilenende bleibt sie an diesem Ende. Mit ib_track_caret folgt ue_caret_changed, wie bei einem Klick |
ib_track_caret | boolean | false | Opt-in: löst bei jeder Bewegung der Einfügemarke ue_caret_changed aus — Geste des Benutzers oder Befehl Ihres Codes; ein neues Dokument (is_text, ein Laden) sagt nichts über die Einfügemarke |
ib_allow_drop | boolean | false | Opt-in: nimmt Dateien aus dem Windows-Explorer entgegen; die vollständigen Pfade kommen über ue_drop_files an |
ib_tab_moves_focus | boolean | false | true: Tab verlässt den Editor, statt einzurücken — der Editor, der nur ein Feld eines Formulars ist. Unabhängig vom Wert sitzt niemand fest: Strg+Tab bleibt beim Fenster, Esc und dann Tab verlässt den Editor, und Strg+M schaltet diesen Modus über die Tastatur um (live gelesen, dem Bildschirmleser angesagt) |
is_theme_style | string | "" | Visueller Stil der Komponente (Konstanten THEME_STYLE_*); leer = der der Anwendung, bei jeder Änderung übernommen |
is_theme_mode | string | "" | Helle oder dunkle Variante (Konstanten THEME_MODE_*); leer = die der Anwendung, bei jeder Änderung übernommen |
il_theme_accent | long | -1 | Akzentfarbe dieser Komponente (-1 = Akzent der Anwendung, sonst der des Designs) |
is_tooltip | string | "" | Einfacher Tooltip beim Überfahren der Komponente |
is_super_tooltip_title | string | "" | Titel des erweiterten Tooltips (hat Vorrang vor is_tooltip) |
is_super_tooltip_text | string | "" | Text des erweiterten Tooltips (Rich-Markup zulässig) |
is_super_tooltip_image | string | "" | Bild des erweiterten Tooltips |
Methoden #
| Methode | Zweck |
|---|---|
of_get_text ( ) → string | Liefert den aktuellen Inhalt — denselben Wert wie is_text, für Code, der einen Methodenaufruf bevorzugt |
of_find (string as_text) | Öffnet die Suchleiste, trägt den Text ein und hebt alle Vorkommen hervor, gemäß den Optionen ib_find_* (gefaltet nur in den sichtbaren Zeilen). Das erste Vorkommen ab der Einfügemarke wird auf den Bildschirm geholt; die Einfügemarke selbst bewegt sich erst, wenn der Benutzer die Leiste schließt. Ein leerer Text leert das Feld und entfernt die Hervorhebungen. Liefert 0, sobald angewendet, -4, wenn ib_search_enabled false ist, -2, wenn die Komponente nicht erstellt ist. Bei einem ungültigen regulären Ausdruck (ib_find_regex) liefert sie -5 |
of_insert_text (string as_text) | Fügt Text an der Einfügemarke ein, genau so, als hätte der Benutzer ihn getippt: die aktuelle Auswahl wird ersetzt, die Einfügemarke steht danach hinter der Einfügung, und diese wird auf den Bildschirm geholt. Das ist die Methode einer Schaltfläche Ausschnitt einfügen, wo is_text die laufende Arbeit verwerfen würde. Während einer Suche wird an der Einfügemarke des Benutzers eingefügt, nie über dem Treffer. Liegt der Fokus im Editor oder in seiner Suchleiste, läuft die Einfügung über den Bearbeitungsweg des Browsers: Strg+Z macht sie weiterhin rückgängig. Löst ue_changed aus, und mit ib_track_caret folgt ue_caret_changed, wie bei einer Eingabe. Nichts wird eingefügt, solange der Editor schreibgeschützt (ib_readonly) oder gefaltet (ib_folding) ist. Liefert 0, sobald angewendet, -4 bei Schreibschutz oder Faltung, -5 bei leerem Text, -2, wenn die Komponente nicht erstellt ist |
of_replace (string as_find, string as_replace) | Ersetzt das erste Vorkommen von as_find ab der Einfügemarke (danach wieder von oben) und holt es auf den Bildschirm; die Optionen ib_find_* gelten, und mit ib_find_regex kann der Ersatz $1, $& und $<name> verwenden. Ein Strg+Z macht es rückgängig. Mit ib_track_caret folgt ue_caret_changed, wenn sich die Einfügemarke bewegt. Liefert die Anzahl der ersetzten Vorkommen (1 oder 0, wenn es keines gibt), -4 bei Schreibschutz oder Faltung, -5 bei leerer Suche oder ungültigem Ausdruck, -2, wenn die Komponente nicht erstellt ist |
of_replace_all (string as_find, string as_replace) | Ersetzt alle Vorkommen von as_find in einem Rückgängig-Schritt. Dieselben Optionen und Codes wie of_replace; liefert die Anzahl der ersetzten Vorkommen; die Einfügemarke bleibt, wo sie war, verschoben um das, was davor eingefügt wurde |
of_selected_text ( ) → string | Liefert den vom Benutzer ausgewählten Text, live gelesen ("" ohne Auswahl), mit den Zeilenenden von is_text. Gefaltet ist es die Quelle des Bereichs: die Zeilen einer geschlossenen Region, die er überspannt, sind enthalten |
of_select_range (long al_from_line, long al_from_col, long al_to_line, long al_to_col) | Wählt von (Zeile, Spalte) bis (Zeile, Spalte) aus, alles ab 1, und holt die Auswahl auf den Bildschirm; die Einfügemarke steht am zuletzt angegebenen Ende, und eine Spalte hinter dem Ende ihrer Zeile bleibt an diesem Ende. Mit ib_track_caret folgt ue_caret_changed, wie bei einem Ziehen. Liefert 0, sobald angewendet, -5 bei einer Zeile außerhalb des Dokuments oder einer Spalte kleiner als 1, -4, solange der Editor gefaltet ist, -2, wenn die Komponente nicht erstellt ist |
of_line_count ( ) | Liefert die Anzahl der Zeilen des Dokuments, gefaltet oder nicht, live gelesen — die Obergrenze eines Dialogs „Gehe zu Zeile“ |
of_add_marker (long al_line, string as_kind, string as_tooltip) | Markiert eine Zeile der Leiste mit einer Diagnose — MARKER_ERROR, MARKER_WARNING oder MARKER_INFO — und einem Tooltip (Markup zulässig): was ein Compiler sagt, dort, wo er es sagt. Mehrere Markierungen können sich eine Zeile teilen: die schwerste bestimmt das Symbol, der Tooltip listet alle auf. Sie gehören zum Dokument: ein neues is_text entfernt sie. Liefert 0, sobald angewendet, -5 bei einer Zeile außerhalb des Dokuments oder einer unbekannten Art, -2, wenn die Komponente nicht erstellt ist. Eine Markierung wandert mit ihrer Zeile, wenn der Text bearbeitet wird, und eine gelöschte Zeile nimmt ihre Markierungen mit; F8 / Umschalt+F8 oder of_next_marker erreichen sie über die Tastatur, und ihr Text wird dem Bildschirmleser vorgelesen. Der Tooltip akzeptiert Auszeichnungen: eine Compilermeldung mit eckigen Klammern läuft zuerst durch n_pbt_utils.of_escape_markup |
of_remove_marker (long al_line) | Entfernt alle Markierungen einer Zeile. Liefert 0, sobald entfernt, -5, wenn die Zeile keine trägt, -2, wenn die Komponente nicht erstellt ist |
of_clear_markers ( ) | Entfernt alle Markierungen der Leiste. Liefert 0, sobald angewendet, -2, wenn die Komponente nicht erstellt ist |
of_marker_count ( ) | Liefert die Anzahl der Markierungen in der Leiste, live gelesen (zwei auf einer Zeile zählen als zwei) |
of_next_marker ( ) | Setzt die Einfügemarke auf die nächste Diagnose der Leiste (nach der letzten zurück zur ersten), holt sie auf den Bildschirm und zeigt ihre Meldung — was F8 tut (Umschalt+F8 geht zurück). Liefert die erreichte Zeile ab 1, 0, wenn die Leiste keine Markierung hat, -2, wenn die Komponente nicht erstellt ist |
of_undo ( ) | Macht die letzte Änderung rückgängig — getippt, eingefügt oder von Ihrem Code vorgenommen (of_insert_text, ein Ersetzen, of_toggle_comment): der Verlauf gehört der Komponente, Strg+Z ist derselbe Schritt, und fortlaufendes Tippen an einer Stelle ist ein Schritt. Die Markierungen folgen. Löst ue_changed aus. Liefert 0, sobald rückgängig gemacht, -4, wenn nichts rückgängig zu machen ist oder der Editor schreibgeschützt oder gefaltet ist, -2, wenn die Komponente nicht erstellt ist |
of_redo ( ) | Stellt wieder her, was of_undo (oder Strg+Z) rückgängig gemacht hat; Strg+Y und Strg+Umschalt+Z sind derselbe Schritt. Eine neue Änderung leert, was wiederhergestellt werden konnte. Liefert 0, sobald wiederhergestellt, -4, wenn nichts wiederherzustellen ist oder der Editor schreibgeschützt oder gefaltet ist, -2, wenn die Komponente nicht erstellt ist |
of_toggle_comment ( ) | Kommentiert die Zeilen der Auswahl (ohne Auswahl die Zeile der Einfügemarke) mit dem Zeilenkommentar von is_syntax aus — // in PowerScript, -- in SQL, # in Python — oder hebt die Auskommentierung auf, wenn alle kommentiert sind; HTML, XML, CSS und Markdown umschließen die Zeilen mit einem Blockkommentar. Strg+/ tut dasselbe, Strg+Z macht es rückgängig. Liefert 0, sobald angewendet, -4 schreibgeschützt oder gefaltet oder wenn die Sprache keinen Kommentar hat (JSON, reiner Text), -2, wenn die Komponente nicht erstellt ist |
of_reset ( ) | Setzt alle Eigenschaften auf ihren Standard zurück und leert den Editor. Liefert 0 nach der Anwendung, -2 wenn die Komponente nicht erzeugt ist |
of_set_redraw (boolean) | Fasst eine Folge von Änderungen zu einer einzigen Darstellung zusammen. Liefert 0 nach der Anwendung, -2 wenn die Komponente nicht erzeugt ist |
of_save_as_png (string) · of_save_as_jpg (string) | Exportiert die Darstellung als Bild. Liefert 0 nach dem Schreiben des Bildes, -4 wenn das Schreiben fehlschlägt, -2 wenn die Komponente nicht erzeugt ist |
Events #
| Event | Ausgelöst wenn |
|---|---|
ue_changed ( ) | Der Benutzer hat den Inhalt geändert und seine Eingabe hat sich gesetzt — auch nach of_insert_text oder einem Ersetzen ausgelöst. Das Event trägt nichts: es zu füllen hieße, bei jeder gesetzten Eingabe das ganze Dokument neu zu lesen, für eine Anwendung, die meist nur wissen will, dass es sich geändert hat. Wer den Code will, fragt danach — is_text oder of_get_text(); ib_modified sagt, ob er vom gespeicherten Text abweicht |
ue_caret_changed (long al_line, long al_col) | Die Einfügemarke hat sich bewegt (Taste, Klick, Ziehen, Eingabe oder Ihr Code); Zeile und Spalte ab 1 gezählt, die Zeile ist im gefalteten Zustand die der Leiste, die Spalte der Rang des Zeichens in seiner Zeile (ein Tabulator zählt als eins). Ihr Code löst es wie die Geste aus (il_caret_line, il_caret_column, of_select_range, of_insert_text, of_replace); nichts, wenn die Einfügemarke bleibt, wo sie ist, und ein neues Dokument (is_text, ein Laden) sagt nichts über die Einfügemarke — erfordert ib_track_caret = true |
ue_find_result (long al_count, long al_index) | Eine Suche ist abgeschlossen oder springt zu einem anderen Vorkommen: al_count Vorkommen gefunden, al_index = Rang des gerade hervorgehobenen (ab 1). Während der Eingabe wird es nur ausgelöst, wenn sich die Anzahl ändert; das Schließen der Leiste löst es nicht aus; eine leere Suche ebenso wenig; ein neues is_text schließt die Leiste, ohne es auszulösen |
ue_modified_changed (boolean ab_modified) | Eine Änderung schaltet ib_modified um — der erste Tastendruck nach einem Laden oder Speichern, ein Rückgängig bis zum gespeicherten Text, ein Einfügen oder Ersetzen durch Ihren Code: aktivieren oder grauen Sie hier eine Speichern-Schaltfläche, ohne auf ue_changed zu warten. Ein neues is_text, of_reset oder ein von Ihrem Code geschriebenes ib_modified sind Werte: sie lösen nichts aus |
ue_undo_state_changed (boolean ab_can_undo, boolean ab_can_redo) | ib_can_undo oder ib_can_redo ändert sich durch eine Änderung oder ein Rückgängig: die Schaltflächen Rückgängig und Wiederholen eines Menübands oder Menüs folgen ihm. Ein neues is_text leert den Verlauf, ohne es auszulösen |
ue_drop_files (string as_files[]) | Dateien wurden aus Windows abgelegt: vollständige Pfade, ein Eintrag pro Datei. Erfordert ib_allow_drop = true |
ue_drag_enter ( ) | Ein Dateiziehvorgang gelangt auf den Editor (ib_allow_drop) |
ue_drag_leave ( ) | Der Dateiziehvorgang verlässt den Editor |
ue_ready ( ) | Die Komponente ist fertig geladen; alles zuvor Gesendete wurde nachgespielt |
ue_runtime_missing ( ) | Die WebView2-Runtime fehlt: die Komponente bleibt leer |
ue_bg_color (long al_color) | Die Komponente hat ihre Design-Hintergrundfarbe berechnet; das Userobject hat sie bereits übernommen (backcolor) |
Tastatur #
| Taste | Wirkung |
|---|---|
| Tab | Rückt bis zum nächsten Tabstopp ein (ii_tab_size); mehrere Zeilen ausgewählt: rückt den ganzen Block ein; nur ein einfaches Tab: Strg+Tab und Alt+Tab bleiben beim Fenster (die nächste Seite eines Registers) |
| Umschalt+Tab | Rückt die Zeile oder den Block aus |
| Eingabe | Neue Zeile mit derselben Einrückung, eine Stufe tiefer nach {, ( oder [ |
| Strg+F | Öffnet die Suchleiste, mit der Auswahl gefüllt (ib_search_enabled) |
| Strg+H | Öffnet die Leiste mit ihrer Ersetzen-Zeile (nur bei bearbeitbarem Editor) |
| F3 · Umschalt+F3 | Nächster · vorheriger Treffer, aus dem Code oder der Leiste |
| Eingabe · Umschalt+Eingabe (Leiste) | Nächster · vorheriger Treffer; im Ersetzen-Feld ersetzt Eingabe den aktuellen Treffer und Strg+Eingabe alle |
| Esc | Schließt die Leiste und setzt die Einfügemarke auf den aktuellen Treffer; bei geschlossener Leiste verlässt Esc und dann Tab den Editor (Esc erreicht auch die Abbrechen-Schaltfläche des Fensters) |
| Strg+M | Schaltet „Tab verschiebt den Fokus“ um (ib_tab_moves_focus), dem Bildschirmleser angesagt |
| Strg+Z · Strg+Y · Strg+Umschalt+Z | Rückgängig · wiederholen · wiederholen, wie of_undo / of_redo |
| Strg+/ | Kommentiert die Zeilen der Auswahl aus oder ein, wie of_toggle_comment |
| F8 · Umschalt+F8 | Nächste · vorherige Diagnose der Leiste: die Einfügemarke geht auf ihre Zeile, ihre Meldung erscheint unten im Editor und wird dem Bildschirmleser vorgelesen |
| Tab, dann Eingabe oder Leertaste (Leiste) | Erreicht eine Faltmarkierung und faltet sie zu oder auf (ib_folding) |
Die Spalte, die ue_caret_changed und il_caret_column melden, ist der Rang des Zeichens in seiner Zeile: ein Tabulator zählt als eins, unabhängig von seiner Breite auf dem Bildschirm.
Beispiele #
Ein Editor für SQL-Abfragen #
// Das Zeichnen waehrend der Einrichtung anhalten
uo_query.of_set_redraw(/*on*/ false)
// SQL-Hervorhebung, dann die anzuzeigende Abfrage
uo_query.is_syntax = uo_query.SYNTAX_SQL
uo_query.is_text = "-- Beste Kunden nach vereinnahmtem Umsatz~r~n" &
+ "SELECT c.name, SUM(o.amount) AS total~r~n" &
+ "FROM customer c~r~n" &
+ " INNER JOIN orders o ON o.cust_id = c.id~r~n" &
+ "WHERE o.status = 'paid'~r~n" &
+ "GROUP BY c.name~r~n" &
+ "ORDER BY total DESC"
// Ein einziges Neuzeichnen, alles auf einmal
uo_query.of_set_redraw(/*on*/ true)
// clicked-Event von cb_execute
// Local variables
string ls_sql
// Die Abfrage so ausfuehren, wie sie eingegeben wurde
ls_sql = uo_query.of_get_text() // die tatsaechliche Eingabe des Benutzers
of_execute(ls_sql)
Ein schreibgeschützter Betrachter #
Ideal, um generierten Code, ein Protokoll oder einen Auszug zu zeigen, den der Benutzer lesen, aber nicht ändern soll.
// PowerScript-Hervorhebung
uo_preview.is_syntax = uo_preview.SYNTAX_POWERSCRIPT
// Ein reiner Betrachter: kein Cursor, keine Leiste, keine Hervorhebung
uo_preview.ib_readonly = true // nur lesen, keine Einfuegemarke
uo_preview.ib_line_numbers = false // blendet die Nummernleiste aus
uo_preview.ib_current_line = false // keine Hervorhebung der aktuellen Zeile
uo_preview.ib_wrap = true // bricht um, statt zu scrollen
uo_preview.ii_tab_size = 2 // Tabulatoren ueber 2 Spalten dargestellt
// Der anzuzeigende Code
uo_preview.is_text = of_generate_code()
Die Position der Einfügemarke in einer Statusleiste verfolgen #
// Jede Cursorbewegung melden (ue_caret_changed)
uo_editor.ib_track_caret = true // ausdrueckliches Opt-in : sonst gar kein Event
// ue_caret_changed-Event von uo_editor : (long al_line, long al_col)
uo_status.of_panel(/*key*/ "pos").is_text = "Zeile " + String(al_line) + ", Sp. " + String(al_col)
Ohne ib_track_caret meldet die Einfügemarke nichts: Dieser Auslöser feuert sehr häufig und bleibt abgeschaltet, solange Sie ihn nicht anfordern.
Suchen und zu einer Zeile springen #
// Oeffnet die Suchleiste und hebt alle Vorkommen hervor
uo_editor.of_find(/*text*/ "ll_total")
// ue_find_result-Event von uo_editor : (long al_count, long al_index)
if al_count = 0 then
uo_status.of_panel(/*key*/ "main").is_text = "Kein Treffer"
else
uo_status.of_panel(/*key*/ "main").is_text = String(al_index) + " / " + String(al_count)
end if
// Local variables
long ll_error_line
string ls_error_text
n_pbt_utils lnv_utils
// Was der Compiler gemeldet hat, und wo (Ihr Build-Schritt liefert es)
ll_error_line = 39
// Die Meldung laeuft durch of_escape_markup : ihre eckigen Klammern erscheinen unveraendert
ls_error_text = lnv_utils.of_escape_markup(/*text*/ "C0031 : Syntax error near ls_names[1]")
// Zu der Zeile gehen, die ein Compiler gemeldet hat, und sie in der Leiste markieren
uo_editor.of_add_marker(/*line*/ ll_error_line, /*kind*/ uo_editor.MARKER_ERROR, /*tooltip*/ ls_error_text)
uo_editor.il_caret_line = ll_error_line // die Einfuegemarke geht dorthin, die Zeile kommt auf den Bildschirm
uo_editor.of_focus_webview() // der Benutzer korrigiert sofort
Eine aus dem Explorer abgelegte Datei öffnen #
// Accept files dropped from the Explorer
uo_editor.ib_allow_drop = true
// ue_drop_files-Event von uo_editor : (string as_files[])
// Local variables
blob lblb_content
integer li_file
// as_files[1] traegt den VOLLSTAENDIGEN Pfad der ersten abgelegten Datei
li_file = FileOpen(as_files[1], StreamMode!, Read!)
if li_file > 0 then
FileReadEx(li_file, lblb_content)
FileClose(li_file)
// Nach der Dateiendung hervorheben, dann den Inhalt anzeigen
uo_editor.is_syntax = of_syntax_for_extension(as_files[1])
// Die Bytes der Datei, als UTF-8-Text gelesen (die Kodierung heutiger Quelldateien)
uo_editor.is_text = String(lblb_content, EncodingUTF8!)
end if
Auf Änderungen reagieren #
// ue_modified_changed-Event von uo_editor : (boolean ab_modified)
cb_save.enabled = ab_modified // Rueckgaengig bis zum gespeicherten Text setzt ihn auf false zurueck
// clicked-Event von cb_save
if of_save_script(uo_editor.is_text) = 1 then
uo_editor.ib_modified = false // der gespeicherte Text wird zur Referenz
cb_save.enabled = false
end if
ue_modified_changed wird sofort ausgelöst, beim ersten Tastendruck wie beim Rückgängig, das zum gespeicherten Text zurückführt. Das Schreiben von ib_modified oder ein neues is_text löst nichts aus: Ihr Code weiß es bereits. ue_changed wartet dagegen, bis die Eingabe zur Ruhe gekommen ist.
Schaltflächen Rückgängig und Wiederholen #
// ue_undo_state_changed-Event von uo_editor : (boolean ab_can_undo, boolean ab_can_redo)
// Die Schaltflaechen folgen dem, was der Verlauf kann
cb_undo.enabled = ab_can_undo
cb_redo.enabled = ab_can_redo
// clicked-Event von cb_undo
// Derselbe Schritt wie Strg+Z ; der Fokus geht zurueck zum Code
uo_editor.of_undo()
uo_editor.of_focus_webview()
Ein Editor, der nur ein Feld eines Formulars ist #
// Ein SQL-Filter, der in einem Formular eingegeben wird
uo_filter.is_syntax = uo_filter.SYNTAX_SQL
// Tab geht zum naechsten Feld, wie ueberall sonst
uo_filter.ib_tab_moves_focus = true
Ohne diese Eigenschaft lassen Esc und dann Tab oder Strg+M den Benutzer weiterhin über die Tastatur hinaus: der Editor hält die Tastatur nie fest.
Eine Variable im ganzen Skript umbenennen #
// Local variables
long ll_count
// Nur ganze Woerter: ll_total2 ist eine andere Variable
uo_editor.ib_find_whole_word = true
ll_count = uo_editor.of_replace_all(/*find*/ "ll_total", /*replace*/ "ll_amount") // ein einziges Strg+Z macht alles rueckgaengig
Best Practices #
- Setzen Sie
is_syntaximmer voris_text: Der Code ist schon beim ersten Zeichnen eingefärbt, ohne sichtbares Nachfärben. - Für eine reine Anzeige ergibt die Kombination
ib_readonly+ib_line_numbers = false+ib_wrapeinen schlichten Betrachter, der nicht mehr wie ein Editor aussieht. - Um eine Eingabe abzuholen, lesen Sie
is_text(oderof_get_text()), sobald die Eingabe sich gesetzt hat, — also in Ihremue_changed, das Ihnen sagt, wann. ib_foldinglohnt sich nur bei langen, strukturierten Dateien; lassen Sie es bei kurzen Auszügen ausgeschaltet. Schalten Sie es aus, bevor Sie Änderungen zulassen: eine gefaltete Gliederung wird gelesen, nicht bearbeitet, undof_get_text()liefert stets die ganze Quelle, geschlossene Regionen eingeschlossen.- Klammern Sie das Laden einer großen Datei mit
of_set_redraw(false)/of_set_redraw(true)ein. - Rufen Sie
of_reset()auf, bevor Sie ein Dokument anderer Art laden: Sonst bleiben die vorherige Sprache, die Tabulatorbreite oder der Schreibschutzmodus bestehen. - Setzen Sie
ib_modifiednach dem Speichern auffalsezurück: beim ersten Tastendruck wird es wiedertrue, undfalse, wenn der Benutzer bis zum gespeicherten Text rückgängig macht. - Um die Fehler einer Kompilierung zu zeigen:
of_clear_markers(), dann einof_add_markerpro Diagnose undil_caret_lineauf die erste. - In einem Formular, in dem der Editor nur ein Feld unter anderen ist, setzen Sie
ib_tab_moves_focus = true: Tab geht dann zum nächsten Feld, wie überall sonst. - Für Schaltflächen Rückgängig / Wiederholen folgen Sie
ue_undo_state_changedund rufenof_undo/of_redoauf: der Verlauf ist der von Strg+Z, und er zählt auch, was Ihr Code tut.
Vom gemeinsamen Sockel geerbt #
Diese Mitglieder gibt es bei jeder visuellen Komponente — sie sind nicht dieser eigen. Sie werden einmal in den übergreifenden Kapiteln beschrieben; diese Tabelle sagt nur, wo man sie liest.
| Mitglieder | Rolle | Beschrieben in |
|---|---|---|
of_reset | Die Komponente zurücksetzen | 3.6 Eine Komponente zurücksetzen: of_reset() |
of_register_shortcut · of_clear_shortcuts | Tastenkürzel der Komponente | 3.5 Tastenkombinationen |
of_is_created · of_is_ready · of_get_last_error | Ob sie entstanden ist, ob sie bereit ist, was fehlschlug | 3.7 Diagnose |
of_save_as_png · of_save_as_jpg | Die Darstellung als Bild exportieren | 3.8 Die Darstellung als Bild exportieren |
of_set_redraw | Änderungen zu einem einzigen Neuzeichnen bündeln | 3.10 Best Practices |
of_preload_icons | Symbole ohne Verzögerung | Sofortige Anzeige: of_icon |
of_set_translation | Eine Beschriftung der Komponente übersetzen | 5.2 Eine Beschriftung anpassen: of_set_translation |
of_focus_webview | Der Komponente den Fokus geben | 6.4 Tastatur und Fokus |
of_print · of_print_to_pdf | Drucken oder ein PDF schreiben | 6.9 Drucken |
of_set_property · of_get_property · of_component_name | Eine Eigenschaft über ihren Namen steuern | 3.1 Die Eigenschaften-Engine |
is_accessible_name · is_accessible_description | Name und Beschreibung, die ein Bildschirmleser sagt | 3.4 Optionale Eigenschaften und Events |
Zwei Helfer werden nicht geerbt: of_icon und of_escape_markup liegen auf n_pbt_utils. Deklarieren Sie eines — n_pbt_utils lnv_utils, nichts zu erzeugen — und rufen Sie sie darauf auf.