form — u_pbt_form #
← Komponentenreferenz · Inhalt des Handbuchs
form ist ein ganzer Erfassungsbildschirm in einem Steuerelement: typisierte Felder — Text, Zahl, Liste, Optionsfelder, Datum, Uhrzeit, Farbe, Kontrollkästchen, Kennwort, E-Mail, langer Text, Bild, Schlagwörter, Sterne — in Spalten und einklappbaren Abschnitten angeordnet, jedes mit seiner Beschriftung, die in seinen Rahmen aufsteigt. Die Regeln jedes Feldes (Pflichtfeld, Grenzen, Muster, Maske…) und Ihre fachlichen Fehler werden gemeinsam geprüft;
of_is_dirtysagt, was sich seit dem Laden geändert hat,of_load_row/of_save_rowlesen und schreiben eine Zeile eines DataWindow. Ihre eigene OK-Schaltfläche ruftof_validateauf.
▶ Live ansehen — Demoanwendung, Kachel Form: die Vorschau, der zugehörige Code und diese Seite, nebeneinander.
Auf einen Blick #
| Userobject | u_pbt_form |
| Item-Klassen | n_pbt_form_section (Abschnitt) → n_pbt_form_field (Feld) |
| Wofür | Einen Erfassungsbildschirm aus Dutzenden von Hand platzierter Steuerelemente durch ein thematisiertes Formular ersetzen, das sich selbst anordnet und prüft, was eingegeben wird: Kundendatensatz, Bestellung, Einstellungen, ein Schritt eines Assistenten |
| Werte | Immer Text, einzeln (of_field(adresse).is_value); alle auf einmal und typisiert über of_values; eine DataWindow-Zeile über of_load_row / of_save_row |
| Opt-in-Optionen | ib_veto_changes |
Schnellstart #
// Two columns ; a name at the top, then a section
uo_form.ii_columns = 2
uo_form.of_add_field(/*keys*/ "name", /*label*/ "Name", /*type*/ u_pbt_form.TYPE_STRING, /*value*/ "")
uo_form.of_field(/*keys*/ "name").ib_required = true
uo_form.of_add_section(/*key*/ "order", /*title*/ "Order")
uo_form.of_add_field(/*keys*/ "order/qty", /*label*/ "Quantity", /*type*/ u_pbt_form.TYPE_NUMBER, /*value*/ "1")
uo_form.of_add_field(/*keys*/ "order/due", /*label*/ "Due on", /*type*/ u_pbt_form.TYPE_DATE, /*value*/ "")
// event clicked of cb_ok
// Local variables
n_pbt_json lnv_json
// Every error shown at once, the keyboard on the first
if uo_form.of_validate() > 0 then return
// Valid : read the values, typed, along the same addresses
lnv_json.of_load(/*json*/ uo_form.of_values())
of_save_order(lnv_json.of_get_string(/*path*/ "name"), lnv_json.of_get_number(/*path*/ "order/qty"))
Eine Adresse pro Feld #
Ein Feld wird über seine Adresse benannt: oben sein Schlüssel allein ("name"), in einem Abschnitt der Abschnitt und dann das Feld, durch / verbunden ("order/qty") — eine Ebene, nie mehr. Ein Abschnitt wird über seinen Schlüssel allein benannt. Oben benennt ein Schlüssel nur eine Sache: ein Abschnitt und ein Feld der obersten Ebene können ihn nicht teilen. Die Events tragen dieselbe Adresse, die Sie geschrieben haben; der Schlüssel eines Feldes (seine letzte Ebene) ist auch der Name der Spalte, die of_load_row und of_save_row lesen.
// A section by its key, a field by its address
uo_form.of_section(/*key*/ "order").ib_collapsed = true
uo_form.of_field(/*keys*/ "order/qty").is_value = "3"
Feldtypen #
Der Typ wird einmal gewählt, in of_add_field, und bestimmt das Steuerelement. Der Wert selbst ist immer Text — übergeben, gelesen, von den Events geliefert — gleich geschrieben, unabhängig von der Sprache des Arbeitsplatzes. Eine Liste, ein Datum und eine Farbe öffnen sich in den nativen Fenstern, die die ganze Bibliothek teilt, in den Farben des Themas.
| Konstante | Steuerelement | Der Wert als Text |
|---|---|---|
TYPE_STRING | Textfeld; eine Maske (is_mask, Syntax einer EditMask) zeigt ihre Literale während der Eingabe; eine Schaltfläche „…“ (ib_ellipsis) öffnet Ihre Suche | Der Text, wie er ist; maskiert ohne seine Literale (5551234567) |
TYPE_TEXTAREA | Mehrzeiliger Text; Eingabe beginnt eine neue Zeile | Der Text samt Zeilenumbrüchen |
TYPE_NUMBER | Textfeld, das eine Zahl in der Anzeigesprache liest: ihr Dezimaltrennzeichen oder ein Punkt, ihre korrekt gebildete Tausendergruppierung (1,000 ist auf Englisch tausend, 1.500 auf Deutsch fünfzehnhundert, 1 234,5 auf Französisch). Eine mehrdeutige Eingabe (1,5 auf Englisch, 1 2) oder eine, die keine Zahl ist, bleibt mit der übersetzten Meldung Not a number stehen, und der vorhandene Wert ändert sich nicht; Auf / Ab erhöhen oder senken ihn um seine Schrittweite (id_step) | Mit Punkt: "12.5"; "" = leer. Ziffer für Ziffer erhalten; 12.50 statt 12.5 erneut getippt ist keine Änderung |
TYPE_BOOLEAN | Ein Schalter (Standard) oder ein Kontrollkästchen (is_boolean_style), die Beschriftung daneben | "true" · "false" |
TYPE_ENUM | Schaltfläche, die die gemeinsame Liste öffnet; ihre Optionen werden einzeln hinzugefügt (of_add_option) | Der Wert der gewählten Option, nie ihr Text; ein Wert, den keine Option anbietet, bleibt erhalten und wird so angezeigt, wie er ist, wie bei einem DataWindow ohne Codetabelle |
TYPE_RADIO | Ein Optionsfeld pro Option, nebeneinander; die Pfeiltasten wechseln zwischen ihnen | Der Wert der gewählten Option |
TYPE_DATE | Schaltfläche, die den gemeinsamen Kalender öffnet; das Datum erscheint im Format der Anzeigesprache | "yyyy-mm-dd" |
TYPE_TIME | Textfeld: 9:5 wird 09:05; was keine 24-Stunden-Uhrzeit ist, bleibt mit seiner Meldung stehen | "hh:mm" |
TYPE_COLOR | Schaltfläche mit dem Farbfeld, die die gemeinsame Farbauswahl öffnet | Der RGB-Long als Text: String(RGB(255, 0, 0)) = "255" |
TYPE_PASSWORD | Maskiertes Textfeld | Der Text, wie er ist |
TYPE_EMAIL | Textfeld, das die Form einer Adresse prüft | Der Text, wie er ist |
TYPE_IMAGE | Ein Bild, keine Eingabe: nie geprüft, nie in of_values; mit ii_rowspan deckt es mehrere Zeilen ab (das Foto eines Datensatzes) | Seine Quelle: eine Datei oder mono: / tint: gefolgt von einem Pfad (in den Farben des Themas); eine http://-Adresse wird abgelehnt |
TYPE_TAGS | Schlagwörter als Plaketten in einem Feld: man tippt ein Wort und dann Eingabe, ein Komma oder Tab; die Rücktaste in der leeren Eingabe entfernt das letzte, jede Plakette hat ihr Kreuz, Links / Rechts gehen sie durch. Die Optionen des Feldes (of_add_option) sind Vorschläge, die beim Tippen gefiltert werden; ib_options_only macht sie zur einzigen Wahl, ii_max_tags begrenzt ihre Zahl | Die Schlagwörter, durch Komma und Leerzeichen verbunden: "vip, b2b" (der Wert der Option bei einem gewählten Vorschlag). Das Komma ist das Trennzeichen: nie in einem Schlagwort; vom Code geschrieben trennt es, die Leerzeichen drumherum fallen weg, dasselbe Schlagwort zweimal (ohne Groß-/Kleinschreibung) bleibt einmal |
TYPE_RATING | Sterne zum Anklicken, ii_star_count Stück (standardmäßig 5), halbe Sterne mit ib_half_stars. Das Überfahren zeigt eine Vorschau, ohne etwas zu verschieben; ein Klick auf den aktuellen Wert löscht ihn. Per Tastatur: Pfeile, Pos1 / Ende, eine Ziffer, 0 oder Entf. Ein voller Stern nimmt die Akzentfarbe der Komponente an | Die Zahl der Sterne: "4", "3.5"; "" = keine Bewertung (auch 0). Vom Code geschrieben, auf den Schritt gerundet und innerhalb der Sterne gehalten; ein Text oder eine negative Zahl wird abgelehnt |
Die Prüfung #
Jedes Feld trägt seine Regeln: ib_required (ein Pflicht-Kontrollkästchen muss angehakt sein), is_min / is_max (eine Zahl, ein Datum, eine Uhrzeit), ii_max_length, is_pattern (ein regulärer Ausdruck, dem der ganze Wert folgen muss), is_mask (eine ausgefüllte Maske), is_match (gleich einem anderen Feld) und die Form einer E-Mail, einer Zahl oder einer Uhrzeit. Ihre Anwendung ergänzt ihre fachlichen Fehler (is_error: bereits vergeben), die bleiben, bis der Benutzer das Feld ändert. Nichts erscheint rot, solange der Benutzer kein Feld verlassen hat: ein neues Formular ist nicht rot. of_is_valid und of_invalid_keys antworten, ohne etwas zu zeigen; of_validate zeigt alles auf einmal und setzt die Tastatur auf das erste fehlerhafte Feld. Ein ausgeblendetes, deaktiviertes oder schreibgeschütztes Feld wird nicht nach seinen Regeln beurteilt: der Benutzer könnte es nicht korrigieren.
// A customer code : two capital letters, then four digits
uo_form.of_field(/*keys*/ "code").is_pattern = "[A-Z]{2}[0-9]{4}"
uo_form.of_field(/*keys*/ "code").is_pattern_message = "Two capital letters, then four digits"
// A rule only your database knows
if of_email_taken(uo_form.of_field(/*keys*/ "email").is_value) then
uo_form.of_field(/*keys*/ "email").is_error = "Already used by another customer"
end if
Eigenschaften #
| Eigenschaft | Typ | Standard | Zweck |
|---|---|---|---|
ii_columns | integer | 1 | Anzahl der Spalten, von 1 bis 12 (ein Wert außerhalb wird zurückgeholt). Jeder Abschnitt folgt. Ein Feld überspannt mehr mit ii_colspan, beginnt in einer bestimmten Spalte mit ii_col, deckt mehrere Zeilen mit ii_rowspan ab; die anderen Felder füllen die freien Zellen |
ib_readonly | boolean | false | Das ganze Formular schreibgeschützt: jeder Wert ist lesbar, keiner änderbar — ein Datensatz zum Ansehen. Ihr Code kann die Werte weiterhin schreiben |
ib_veto_changes | boolean | false | Opt-in: vor dem Schreiben eines Benutzerwerts nachfragen (löst ue_value_changing aus, das ablehnen kann: das Feld zeigt wieder den alten Wert). Ein von Ihrem Code geschriebener Wert fragt nie |
is_theme_style | string | "" | Visueller Stil der Komponente (Konstanten THEME_STYLE_*); leer = der der Anwendung, bei jeder Änderung übernommen |
is_theme_mode | string | "" | Helle oder dunkle Variante (Konstanten THEME_MODE_*); leer = die der Anwendung, bei jeder Änderung übernommen |
il_theme_accent | long | -1 | Akzentfarbe dieser Komponente (-1 = Akzent der Anwendung, sonst der des Designs) |
is_tooltip | string | "" | Einfacher Tooltip beim Überfahren der Komponente |
is_super_tooltip_title | string | "" | Titel des erweiterten Tooltips (hat Vorrang vor is_tooltip) |
is_super_tooltip_text | string | "" | Text des erweiterten Tooltips (Rich-Markup zulässig) |
is_super_tooltip_image | string | "" | Bild des erweiterten Tooltips |
Eigenschaften eines Abschnitts — n_pbt_form_section #
| Eigenschaft | Typ | Standard | Zweck |
|---|---|---|---|
is_title | string | "" | Titel der Kopfzeile. Akzeptiert die Rich-Text-Auszeichnung. Leer zeigt die Kopfzeile den Schlüssel |
ib_collapsed | boolean | false | true klappt den Abschnitt ein: seine Kopfzeile bleibt, seine Felder verschwinden — sie behalten ihre Werte und werden weiter beurteilt. ue_section_toggled folgt, wie bei einem Klick auf die Kopfzeile. Live gelesen |
ib_visible | boolean | true | false nimmt den Abschnitt samt Feldern aus dem Formular; sie behalten ihre Werte (of_values liefert sie weiterhin) und werden nicht beurteilt |
is_tooltip | string | "" | Einfacher Tooltip beim Überfahren des Items |
is_super_tooltip_title | string | "" | Titel des erweiterten Item-Tooltips (hat Vorrang vor is_tooltip) |
is_super_tooltip_text | string | "" | Text des erweiterten Item-Tooltips (Rich-Markup zulässig) |
is_super_tooltip_image | string | "" | Bild des erweiterten Item-Tooltips |
il_accent | long | -1 | Akzent der Kopfzeile des Abschnitts: die Linie unter ihrem Titel übernimmt ihn (-1 = der der Komponente). Seine Felder behalten ihren eigenen |
il_back_color | long | -1 | Hintergrund der Kopfzeile des Abschnitts, als RGB(r,g,b) (-1 = was das Design vorgibt) |
il_text_color | long | -1 | Textfarbe der Kopfzeile des Abschnitts (-1 = was das Design vorgibt) |
il_back_color_hover | long | -1 | Hintergrund der Kopfzeile des Abschnitts unter dem Mauszeiger (-1 = was das Design vorgibt) |
il_text_color_hover | long | -1 | Textfarbe der Kopfzeile des Abschnitts unter dem Mauszeiger (-1 = was das Design vorgibt) |
Eigenschaften eines Feldes — n_pbt_form_field #
| Eigenschaft | Typ | Standard | Zweck |
|---|---|---|---|
is_value | string | "" | Der Wert als Text (siehe die Typen). Ihn zu schreiben löst nichts aus, wie SetItem; ihn zu lesen liefert den aktuellen Wert, wer auch immer ihn geschrieben hat — was gerade eingegeben wird, zählt. Ein Wert, den der Typ nicht aufnehmen kann (ein nicht existierendes Datum, ein Text in einer Zahl), wird abgelehnt: der alte bleibt und of_get_last_error sagt warum |
is_label | string | "" | Die Beschriftung im Feld: sie steigt in den Rahmen auf, wenn das Feld einen Wert oder die Tastatur hat. Akzeptiert die Rich-Text-Auszeichnung. Ein Stern folgt der Beschriftung eines Pflichtfelds. Leer: der Schlüssel |
is_placeholder | string | "" | Ein Hinweis in einem leeren Textfeld, solange es die Tastatur hat |
is_help | string | "" | Eine Hilfezeile unter dem Feld (Rich-Text-Auszeichnung); sie verschwindet, solange ein Fehler ihren Platz einnimmt |
is_error | string | "" | Ein fachlicher Fehler Ihrer Anwendung (bereits vergeben): sofort angezeigt, das Formular ungültig, bis der Benutzer das Feld ändert oder of_clear_errors; "" entfernt ihn. Gelesen liefert er die Meldung, die das Feld zeigt — oder zeigen wird, sobald der Benutzer es verlässt: den fachlichen Fehler, sonst den seiner Regeln, "", wenn es gültig ist. Auf einem Feld, das der Benutzer nicht erreichen kann (ausgeblendet, deaktiviert), bleibt er erhalten und ist lesbar, zählt aber nicht: das Formular bleibt gültig, bis das Feld zurück ist |
is_min | string | "" | Der kleinste akzeptierte Wert einer Zahl (mit Punkt), eines Datums (yyyy-mm-dd) oder einer Uhrzeit (hh:mm); die Meldung nennt Minimum und die Grenze. Eine Grenze, die der Typ nicht lesen kann, wird ignoriert; "" = keine — bei einer Zahl das untere Ende der SpinRange ihrer DataWindow-Spalte (of_load_row). Gelesen liefert sie die geltende Grenze |
is_max | string | "" | Der größte akzeptierte Wert, gelesen wie is_min; die Meldung nennt Maximum und die Grenze |
is_pattern | string | "" | Ein regulärer Ausdruck (JavaScript-Syntax), dem der ganze Wert folgen muss: [A-Z]{2}[0-9]{4} akzeptiert AB1234, nicht xAB1234. Ein leerer Wert bleibt ib_required überlassen |
is_pattern_message | string | "" | Die Meldung, wenn is_pattern scheitert; leer: Invalid format, übersetzt |
is_mask | string | "" | Eine Eingabemaske. Bei einem TYPE_STRING die Syntax einer PowerBuilder-EditMask: # eine Ziffer, ! ein beliebiges Zeichen in Großbuchstaben, ^ ein beliebiges Zeichen in Kleinbuchstaben, a ein Buchstabe oder eine Ziffer, X ein beliebiges Zeichen, der Rest wird für den Benutzer beim Tippen geschrieben ((###) ###-####); der Cursor bleibt hinter dem Getippten. Der Wert behält nur das in die Plätze Getippte, wie eine EditMask (5551234567, bereit für eine Ziffernspalte); ein Wert des Codes ist der rohe Wert, ohne seine Literale (312345678 unter +33 # ## ## ## ##), die führenden Literale werden geschrieben, sobald das Feld die Tastatur erhält, ein Wert, der nicht alle Plätze füllt, ist Incomplete, und eine nach einem Wert gesetzte Maske ändert nichts an dem, was der Benutzer getan hat. Nach of_load_row übernimmt eine leere Maske die EditMask der Spalte. Bei einem TYPE_NUMBER: eine numerische Maske in der PowerBuilder-Syntax (EditMask, DataWindow-Format): # eine optionale Ziffer, 0 eine Pflichtziffer, , die Gruppierung, . das Dezimalzeichen, % die angezeigte Zahl mal 100, Literale ($, ein Text in Anführungszeichen, \x) und Abschnitte positiv;negativ ("$#,##0;($#,##0)"). Komma und Punkt stehen für die Trennzeichen der Anzeigesprache. Beim Tippen erscheint die Gruppierung mit den Ziffern, die Dezimalstellen sind auf die Maske begrenzt, Buchstaben werden abgelehnt, der Cursor behält seinen Platz zwischen den Ziffern, und eine eingefügte Zahl wird in der Anzeigesprache gelesen; beim Verlassen des Feldes ergänzt die Maske (12 wird 12,00). Der Wert behält die Zahl so, wie der Code sie schreibt ("1234.5"), ohne Gruppierung und ohne Symbol. Eine Untergrenze (is_min) von 0 oder mehr lehnt das Minuszeichen ab; die Grenzen gelten beim Verlassen des Feldes, und ihre Meldung zeigt sie durch die Maske; leer bei einem TYPE_NUMBER (Standard): das Feld tippt sein is_format ohne dessen Literale ($#,##0.00 wird als #,##0.00 getippt, #,##0 "px" als #,##0; ein % bleibt, es ist ein Maßstab) |
is_format | string | "" | Ein TYPE_NUMBER: sein Anzeigeformat, wie die Zahl angezeigt wird, solange das Feld nicht die Tastatur hat — dieselbe Syntax wie is_mask, mit ihren Literalen: #,##0 "px" zeigt 575 px, $#,##0.00;($#,##0.00) einen Preis, 0.0% einen Satz (0,125 zeigt 12,5%). Erhält das Feld die Tastatur, wird sein Text der von is_mask (575), der Cursor behält seinen Platz zwischen den Ziffern; beim Verlassen kehrt der Anzeigetext zurück. Der Wechsel ändert nie den Wert und löst nichts aus: ue_value_changed meldet nur, was der Benutzer getippt hat, die nackte Zahl. Leer: das Feld zeigt sein is_mask |
is_boolean_style | string | "switch" | Ein TYPE_BOOLEAN: seine Darstellung. BOOLEAN_SWITCH (Standard): ein Schalter, eine Spur und ein Knopf, der im eingeschalteten Zustand in der Akzentfarbe der Komponente ans Ende gleitet — eine Ein-/Aus-Einstellung. BOOLEAN_CHECKBOX: das klassische Kontrollkästchen — eine Zustimmung, eine Wahl unter Optionen. Beide reagieren auf die Leertaste und einen Klick auf ihre Beschriftung, liefern denselben Wert und dieselben Ereignisse; deaktiviert oder schreibgeschützt bleiben sie lesbar. Der Knopf gleitet in einer Viertelsekunde, gar nicht, wenn Windows weniger Animationen verlangt; in einer von rechts nach links geschriebenen Sprache gleitet er nach links |
ii_max_tags | integer | 0 | Ein TYPE_TAGS: die höchste Zahl an Schlagwörtern (0 = ohne Grenze). Ein weiteres, vom Benutzer getipptes wird abgelehnt: es bleibt mit der Meldung At most N in der Eingabe; eine längere, vom Code geschriebene Liste bleibt erhalten, und das Feld ist ungültig (of_is_valid, is_error) — gezeigt, sobald das Feld berührt wurde oder nach of_validate, nie sofort |
ib_options_only | boolean | false | Ein TYPE_TAGS: true beschränkt seine Schlagwörter auf die Optionen des Feldes (of_add_option) — ein Text, der keine benennt (über ihren Text oder Wert, ohne Groß-/Kleinschreibung und Akzente), wird mit Not in the list abgelehnt. false: jeder Text ist ein Schlagwort, die Optionen sind nur Vorschläge |
ii_star_count | integer | 5 | Ein TYPE_RATING: die Zahl der Sterne, von 1 bis 10 (eine Zahl außerhalb wird zurückgeholt). Der aktuelle Wert bleibt darin, ohne Event: die Zahl vor einem Wert über fünf setzen |
ib_half_stars | boolean | false | Ein TYPE_RATING: true erlaubt halbe Sterne — die erste Hälfte des Sterns unter dem Mauszeiger (in Leserichtung), Links / Rechts um einen halben Stern — und der Wert wird "3.5" geschrieben. Ausgeschaltet wird der aktuelle Wert ohne Event auf einen ganzen Stern gerundet: vor einem halben Wert einschalten |
is_match | string | "" | Die Adresse eines anderen Feldes, dem dieses gleichen muss — ein Kennwort, eine E-Mail wiederholen. Die Meldung folgt jeder Änderung des einen oder anderen |
is_prefix | string | "" | Ein kurzer Text im Feld vor dem Wert (ein Währungszeichen); er gehört nicht zum Wert |
is_suffix | string | "" | Ein kurzer Text im Feld nach dem Wert (eine Einheit); er gehört nicht zum Wert |
ii_max_length | integer | 0 | Der längste akzeptierte Text (0 = ohne Grenze) eines TYPE_STRING, TYPE_TEXTAREA, TYPE_PASSWORD oder TYPE_EMAIL — eine Zahl oder Uhrzeit hat keine Länge, ignoriert; 0 übernimmt das Limit ihrer DataWindow-Spalte (of_load_row), gelesen liefert es die geltende Länge: die Eingabe stoppt dort, unter einem Textfeld erscheint ein Zähler; ein längerer, vom Code geschriebener Wert ist Too long. Bei einem TYPE_TAGS: das längste Schlagwort — ein Einfügen mehrerer Schlagwörter wird nie abgeschnitten, jedes wird beurteilt |
ii_colspan | integer | 1 | Wie viele Spalten das Feld überspannt (höchstens ii_columns); -1 = die ganze Breite |
ii_rowspan | integer | 1 | Wie viele Zeilen das Feld abdeckt — ein Bild neben mehreren Feldern; die folgenden füllen die freien Zellen daneben |
ii_col | integer | 0 | Die Spalte, in der das Feld beginnt, ab 1; 0 = wo der Fluss es hinsetzt. Die Tabulatortaste folgt der Reihenfolge des Bildschirms — zuerst die Felder oben, dann jeder Abschnitt —, unabhängig von der Spalte |
ib_required | boolean | false | Das Feld muss ausgefüllt sein — ein Kontrollkästchen muss angehakt sein (ein Kästchen Ich akzeptiere), ein Schlagwortfeld eines enthalten, eine Bewertung einen Stern haben. Ein Stern folgt seiner Beschriftung; der Fehler Required erscheint, wenn der Benutzer das Feld verlässt, oder bei of_validate. Eine Spalte, deren Bearbeitungsstil Required sagt, macht es ebenfalls zum Pflichtfeld (of_load_row); gelesen liefert es den geltenden Zustand |
ib_readonly | boolean | false | Zeigt den Wert, ohne ihn ändern zu lassen: ein Text kann noch markiert und kopiert werden; eine Liste, ein Datum, eine Farbe, ein Schalter oder Optionsfelder behalten die Tastatur (Tab erreicht sie, ein Bildschirmleser sagt schreibgeschützt), öffnen und ändern sich aber nicht. Nicht nach seinen Regeln beurteilt; Ihr Code kann is_value weiterhin schreiben |
ib_enabled | boolean | true | false graut das Feld aus: keine Tastatur (es verlässt die Tabulatorreihenfolge), kein Klick, nicht nach seinen Regeln beurteilt |
ib_visible | boolean | true | false nimmt das Feld aus dem Formular; es behält seine Adresse und seinen Wert (of_values liefert ihn weiterhin) und wird nicht beurteilt |
is_column | string | "" | Die Spalte des DataWindow, die of_load_row und of_save_row für dieses Feld lesen und schreiben; "" (Standard) = sein Schlüssel, die letzte Ebene seiner Adresse. Zwei Abschnitte können so denselben Schlüssel (billing/town, shipping/town) an zwei Spalten binden, und ein Feld kann einen lesbaren Schlüssel für eine Spalte namens cust_nm behalten |
id_step | double | 0 | Ein TYPE_NUMBER: was Auf / Ab (und seine Schaltflächen, ib_spin) hinzufügen oder abziehen, innerhalb von is_min und is_max; 0 (Standard) = das SpinIncr seiner DataWindow-Spalte (of_load_row), sonst 1. Ein Schritt ist eine Geste des Benutzers: ue_value_changed wird ausgelöst (und mit ib_veto_changes zuerst ue_value_changing gefragt). Ein leeres Feld beginnt bei is_min, sonst bei 0; ein negativer Schritt wird abgelehnt |
ib_ellipsis | boolean | false | Ein Textfeld (TYPE_STRING, TYPE_NUMBER, TYPE_EMAIL…): true zeigt an seinem Ende eine Schaltfläche … — Ihre Suche, ein Kunde, ein Artikel. Ein Klick darauf oder Strg+Eingabe im Feld löst ue_ellipsis_clicked aus; sie bleibt außerhalb der Tab-Reihenfolge. Sie funktioniert auch bei einem schreibgeschützten Feld (ein nur über die Suche gewählter Wert), nie bei einem deaktivierten |
ib_spin | boolean | false | Ein TYPE_NUMBER: true zeigt an seinem Ende zwei kleine Schaltflächen, auf und ab, die id_step innerhalb von is_min und is_max hinzufügen oder abziehen — eine Geste des Benutzers (ue_value_changed). Das Mausrad tut es auch, solange das Feld die Tastatur hat; die Schaltflächen bleiben außerhalb der Tab-Reihenfolge (Auf / Ab im Feld tun dasselbe) und verschwinden bei einem schreibgeschützten Feld. Eine Spalte, deren EditMask Spin sagt, liefert sie über of_load_row, mit ihrem SpinIncr als Schritt und ihrer SpinRange als Grenzen. Von den anderen Typen ignoriert; gelesen liefert es den geltenden Zustand |
of_type ( ) → string | — | — | Der an of_add_field übergebene Typ (eine Konstante TYPE_*). Nur lesbar: ein Typ wird einmal gewählt |
of_is_dirty ( ) → boolean | — | — | TRUE, wenn dieses Feld von seiner Referenz abweicht (siehe of_is_dirty des Formulars) |
of_is_valid ( ) → boolean | — | — | TRUE, wenn dieses Feld keinen Fehler trägt; is_error sagt welchen |
is_tooltip | string | "" | Einfacher Tooltip beim Überfahren des Items |
is_super_tooltip_title | string | "" | Titel des erweiterten Item-Tooltips (hat Vorrang vor is_tooltip) |
is_super_tooltip_text | string | "" | Text des erweiterten Item-Tooltips (Rich-Markup zulässig) |
is_super_tooltip_image | string | "" | Bild des erweiterten Item-Tooltips |
il_accent | long | -1 | Akzent des Feldes: sein Rahmen übernimmt ihn, solange es die Tastatur hat, und seine Beschriftung, sobald sie aufgestiegen ist (-1 = der der Komponente) |
il_back_color | long | -1 | Hintergrund des Feldes, als RGB(r,g,b) (-1 = was das Design vorgibt) |
il_text_color | long | -1 | Textfarbe des Feldes (-1 = was das Design vorgibt) |
il_back_color_hover | long | -1 | Hintergrund des Feldes unter dem Mauszeiger (-1 = was das Design vorgibt) |
il_text_color_hover | long | -1 | Textfarbe des Feldes unter dem Mauszeiger (-1 = was das Design vorgibt) |
Methoden #
Auf der Komponente #
| Methode | Zweck | |
|---|---|---|
of_add_section (string as_key, string as_title) → long | Fügt am Ende einen Abschnitt hinzu: eine einklappbare, mit dem Akzent unterstrichene Kopfzeile, unter der danach die Felder "schlüssel/name" hinzugefügt werden. Ein leerer Titel zeigt den Schlüssel. Liefert 0 nach dem Hinzufügen, -5 für einen leeren Schlüssel, einen mit / oder ` | oder einen bereits von einem Abschnitt oder einem Feld der obersten Ebene belegten, -2`, wenn die Komponente nicht erstellt ist |
of_add_field (string as_keys, string as_label, string as_type, string as_value) → long | Fügt ein Feld an seiner Adresse hinzu, am Ende seines Behälters: sein Abschnitt oder der Anfang des Formulars. as_type ist eine Konstante TYPE_*, as_value sein Wert als Text (die Quelle eines Bildes). Liefert 0 nach dem Hinzufügen, -5 für eine bereits belegte Adresse (ein Feld oder ein Abschnitt der obersten Ebene), eine leere Ebene, mehr als zwei Ebenen, einen nie hinzugefügten Abschnitt, einen Schlüssel mit ` | , einen unbekannten Typ oder einen Wert, den der Typ nicht aufnehmen kann (of_get_last_error sagt warum), -2`, wenn die Komponente nicht erstellt ist |
of_add_option (string as_keys, string as_value, string as_text) → long | Fügt einer Liste TYPE_ENUM, Optionsfeldern TYPE_RADIO oder den Vorschlägen eines TYPE_TAGS am Ende eine Option hinzu: as_value ist, was das Feld enthält (und was ue_value_changed liefert), as_text, was der Benutzer liest, als schlichter Text ("" zeigt den Wert). Liefert 0 nach dem Hinzufügen, -5 für eine Adresse, die weder eine Liste noch Optionsfelder noch Schlagwörter ist, einen bereits angebotenen Wert, einen Wert mit ` | oder / (of_keys_at hängt ihn an die Adresse des Feldes) — und bei Schlagwörtern einen leeren Wert oder einen mit Komma —, -2`, wenn die Komponente nicht erstellt ist |
of_remove_option (string as_keys, string as_value) → long | Entfernt eine Option einer Liste, von Optionsfeldern oder Schlagwörtern, über ihren Wert; der Wert des Feldes bleibt, wie er ist. Liefert 0 nach dem Entfernen, -5 für eine Adresse, die weder eine Liste noch Optionsfelder noch Schlagwörter ist, oder einen Wert, den sie nicht anbietet, -2, wenn die Komponente nicht erstellt ist | |
of_clear_options (string as_keys) → long | Entfernt alle Optionen einer Liste, von Optionsfeldern oder Schlagwörtern, um eine andere Liste zu laden, ohne das Feld, sein Handle oder seinen Zustand zu verlieren; sein Wert bleibt, wie er ist. Liefert 0 nach dem Leeren, -5 für eine Adresse, die weder eine Liste noch Optionsfelder noch Schlagwörter ist, -2, wenn die Komponente nicht erstellt ist | |
of_remove_field (string as_keys) → long | Entfernt ein Feld über seine Adresse, samt Handle; der Rest des Formulars behält seinen Zustand. Liefert 0 nach dem Entfernen, -5 für eine nie hinzugefügte Adresse, -2, wenn die Komponente nicht erstellt ist | |
of_remove_section (string as_key) → long | Entfernt einen Abschnitt und alle seine Felder samt Handles. Liefert 0 nach dem Entfernen, -5 für einen nie hinzugefügten Abschnitt, -2, wenn die Komponente nicht erstellt ist | |
of_clear ( ) → long | Leert das Formular: Abschnitte, Felder und ihre Handles. Anders als of_reset bleiben die Spalten, der Schreibschutz und die Rückfrage. Liefert 0 nach dem Leeren, -2, wenn die Komponente nicht erstellt ist | |
of_section (string as_key) → n_pbt_form_section | Das Handle eines Abschnitts, über seinen Schlüssel: Titel, Einklappen, Sichtbarkeit, Farben und Tooltip. Beim ersten Zugriff erstellt | |
of_field (string as_keys) → n_pbt_form_field | Das Handle eines Feldes, über seine Adresse: of_field("order/qty").is_value = "3". Beim ersten Zugriff erstellt | |
of_values ( ) → string | Alle Werte auf einmal, live gelesen, als JSON-Objekt: die Felder der obersten Ebene, dann jeder Abschnitt als eigenes Objekt — ausgeblendete eingeschlossen, Bilder ausgenommen; was der Benutzer noch tippt, wird zuerst übernommen, wie es AcceptText tut: mit ib_veto_changes wird ue_value_changing gefragt, dann ue_value_changed ausgelöst — beides vor dem Lesen, nie mittendrin: Ihr OK liest, was auf dem Bildschirm steht. Typisiert: eine Zahl ist eine Zahl (Ziffer für Ziffer geschrieben, null, wenn leer), ein Boolean ein Boolean, eine Farbe ihr RGB-Long, der Rest Text. Lesen mit n_pbt_json, über dieselbe Adresse: lnv_json.of_get_number("order/qty") | |
of_load (string as_json) → long | Lädt einen Datensatz: ein JSON-Objekt mit Werten pro Adresse — die Felder der obersten Ebene, dann ein Objekt pro Abschnitt, oder Schlüssel "order/qty" —, die Form, die of_values liefert; Zahlen und Booleans dürfen typisiert sein — eine Zahl mit mehr als 15 Ziffern wird Ziffer für Ziffer gelesen, ein Boolean ist true, false, 1 oder 0 (alles andere wird abgelehnt). Die Werte werden still geschrieben und werden zur Referenz von of_is_dirty; angezeigte und fachliche Fehler werden gelöscht. Ein Feld, das das Objekt nicht nennt, behält seinen Wert. Liefert 0 nach dem Laden, -5 für einen Text, der kein JSON-Objekt ist, oder einen Wert, den sein Feld nicht aufnehmen kann (abc für eine Zahl) — dann wird nichts geschrieben, of_get_last_error nennt die Felder —, -2, wenn die Komponente nicht erstellt ist | |
of_load_row (powerobject apo_data, long al_row) → long | Lädt eine Zeile eines DataWindow, DataStore oder DataWindowChild: jedes Feld übernimmt den Wert seiner Spalte — der, die is_column nennt, sonst seines Schlüssels (der letzten Ebene seiner Adresse) —, typisiert — ein Datum yyyy-mm-dd, eine Uhrzeit hh:mm, eine Zahl mit Punkt, ein Boolean über den On-Wert einer Kontrollkästchen-Spalte gelesen (sonst 1, Y, true…). Was das DataWindow über die Spalte sagt, kommt mit und wird bei jedem Laden neu gelesen: ein Feld ohne Beschriftung zeigt den Kopftext seiner Spalte, ein Feld ohne Maske und Format übernimmt ihre EditMask und ihr Format (eine Zahl $#,##0), eine Liste oder Optionsfelder ohne eigene Option bieten ihre Codetabelle oder die Zeilen ihres DropDownDataWindow an; ein Feld ohne eigene Regel wird zum Pflichtfeld, wenn der Bearbeitungsstil Required sagt, und auf sein Limit begrenzt, und eine Zahl, deren EditMask Spin sagt, erhält ihre Schaltflächen (ib_spin), ihren Schritt (SpinIncr) und ihre Grenzen (SpinRange). Die nächste Zeile desselben DataWindow zeichnet kein Feld neu: das Feld mit der Tastatur behält sie. Wie bei of_load werden die Werte zur Referenz. Liefert 0 nach dem Laden, -5 für ein Objekt, das weder DataWindow noch DataStore noch DataWindowChild ist, eine Zeile, die nicht existiert, oder einen Wert, den sein Feld nicht aufnehmen kann (dann ändert sich nichts: weder ein Wert noch das, was das DataWindow sagt), -2, wenn die Komponente nicht erstellt ist | |
of_save_row (powerobject apo_data, long al_row) → long | Schreibt die vom Benutzer geänderten Werte (seit der Referenz: of_load_row, of_reset_update) in eine Zeile eines DataWindow, DataStore oder DataWindowChild: jedes geänderte Feld in seine Spalte (is_column, sonst sein Schlüssel), per SetItem, für die Spalte typisiert (Datum, Datetime, Uhrzeit, Zahl, Text; ein Boolean als On / Off-Wert einer Kontrollkästchen-Spalte, 1 / 0 in einer Zahlenspalte, true / false in einer Textspalte; ein leeres Feld schreibt NULL — ein leerer Text NULL, wo seine Spalte NilIsNull sagt, sonst eine leere Zeichenkette, wie das DataWindow). Ein vom Benutzer nicht geändertes Feld wird nicht geschrieben: die Zeile behält ihren Status, Ihr Update sendet nur das Geänderte. Ein TYPE_DATE behält die Uhrzeit einer Datetime-Spalte, ein TYPE_TIME ihr Datum. Was der Benutzer noch tippt, wird zuerst übernommen und ue_value_changed ausgelöst, bevor etwas gelesen wird; das Update bleibt Ihres. Liefert 0 nach dem Schreiben, -5 für ein Objekt, das weder DataWindow noch DataStore noch DataWindowChild ist, oder eine Zeile, die nicht existiert, -4, wenn eine Spalte unverändert blieb — ein abgelehntes SetItem, ein Feld, dessen Typ die Spalte nicht aufnehmen kann (ein TYPE_STRING in einer Datumsspalte), oder ein Wert mit Dezimalstellen für eine Ganzzahlspalte (3.5 Sterne in einem long: SetItem würde runden): of_get_last_error nennt die erste, die übrigen geänderten Felder werden trotzdem geschrieben —, -2, wenn die Komponente nicht erstellt ist | |
of_is_valid ( ) → boolean | TRUE, wenn kein angezeigtes Feld einen Fehler trägt: jedes Pflichtfeld ausgefüllt (ein Pflicht-Kontrollkästchen angehakt), jede Regel befolgt, kein fachlicher Fehler. Live gelesen, ohne etwas zu zeigen; ein fachlicher Fehler zählt nur auf einem Feld, das der Benutzer erreichen kann (angezeigt und aktiv) | |
of_invalid_keys (ref string as_keys[]) → long | Füllt as_keys[] mit den Adressen der fehlerhaften Felder, in Bildschirmreihenfolge, ohne etwas zu zeigen, und liefert ihre Anzahl (0 = das Formular ist gültig) | |
of_validate ( ) → long | Zeigt alle Fehler auf einmal und setzt die Tastatur auf das erste fehlerhafte Feld (ue_focus_changed) — was Ihre OK-Schaltfläche vor dem Speichern aufruft. Die Tastatur verlässt die Schaltfläche für das Formular: die nächste Taste geht an das Feld; was der Benutzer noch tippt, wird zuerst übernommen, und ein Bildschirmleser liest die Meldungen sofort. Liefert die Anzahl der fehlerhaften Felder (0 = das Formular ist gültig, nichts bewegt sich), -2, wenn die Komponente nicht erstellt ist | |
of_clear_errors ( ) → long | Löscht alle fachlichen Fehler (is_error, von Ihrem Code geschrieben); die Fehler der Regeln bleiben. Liefert 0 nach der Anwendung, -2, wenn die Komponente nicht erstellt ist | |
of_is_dirty ( ) → boolean | TRUE, wenn mindestens ein Feld von seiner Referenz abweicht: dem Wert beim Hinzufügen oder dem, was of_load, of_load_row oder of_reset_update daraus gemacht haben; was der Benutzer noch tippt, wird zuerst übernommen. Eine anders geschriebene Zahl (12.50 für 12.5) ist derselbe Wert | |
of_dirty_keys (ref string as_keys[]) → long | Füllt as_keys[] mit den Adressen der seit der Referenz geänderten Felder, in Bildschirmreihenfolge, und liefert ihre Anzahl | |
of_reset_update ( ) → long | Die Werte auf dem Bildschirm werden zur Referenz: of_is_dirty antwortet wieder FALSE. Aufzurufen, sobald Ihr Update gelungen ist, wie ResetUpdate eines DataWindow. Liefert 0 nach der Anwendung, -2, wenn die Komponente nicht erstellt ist | |
of_revert ( ) → long | Setzt jedes Feld still auf seinen Referenzwert zurück und blendet die Fehler aus — das Abbrechen des Benutzers. Liefert 0 nach der Anwendung, -2, wenn die Komponente nicht erstellt ist | |
of_focus_field (string as_keys) → long | Setzt die Tastatur auf ein Feld, wie ein Klick: sein eingeklappter Abschnitt öffnet sich zuerst (ue_section_toggled), ue_focus_changed folgt. Liefert 0, wenn erledigt, -5 für eine nie hinzugefügte Adresse oder ein Feld, das der Benutzer nicht erreichen kann (ausgeblendet, deaktiviert — auch das, das die Tastatur hatte —, ein Bild, jenseits der Demo-Grenze), -2, wenn die Komponente nicht erstellt ist | |
of_current_key ( ) → string | Adresse des Feldes, das die Tastatur hat — oder zuletzt hatte, solange die Tastatur woanders im Fenster ist: "order/qty", "", wenn noch keines. Immer die aktuelle, von der Komponente gelesen; auch das, was ue_focus_changed liefert | |
of_get_last_error ( ) → string | Warum das letzte Schreiben abgelehnt wurde: ein Wert, den der Typ nicht aufnehmen kann (is_value hat keinen Rückgabecode; ein http://-Bild, eine unendliche Zahl wie 1e400), ein is_pattern, das das Formular nicht lesen kann, ein von of_load abgelehnter Wert, eine von of_save_row unverändert gelassene Spalte. Leer, wenn es durchging; sonst der letzte Fehler der Bibliothek, wie bei jeder Komponente | |
of_reset ( ) → long | Leert das Formular und setzt dann jede Eigenschaft der Komponente auf ihren Standard zurück: eine Spalte, weder Schreibschutz noch Rückfrage. Liefert 0 nach der Anwendung, -2, wenn die Komponente nicht erstellt ist |
Auf einem Abschnitt und auf einem Feld #
Ein Abschnitt enthält Felder; eine Liste oder Optionsfelder enthalten ihre Optionen, über ihren Wert benannt. Die drei Methoden durchlaufen sie.
| Methode | Zweck |
|---|---|
of_count ( ) → long | Anzahl der Felder des Abschnitts, ausgeblendete eingeschlossen; Anzahl der Optionen einer Liste, von Optionsfeldern oder Schlagwörtern (0 für die anderen Typen) |
of_keys_at (long al_index) → string | Adresse des Feldes an Position al_index (ab 1) — "order/qty", unverändert in of_field verwendbar; bei einer Liste die Adresse, gefolgt vom Wert der Option. "" außerhalb des Bereichs |
of_has (string as_key) → boolean | Enthält der Abschnitt dieses Feld? Bietet die Liste diesen Wert an? |
Ereignisse #
| Event | Ausgelöst wenn |
|---|---|
ue_value_changed (string as_keys, string as_value) | Der Benutzer hat einen Wert geändert: eine durch Verlassen des Feldes oder Eingabe bestätigte Eingabe, ein angehaktes Kontrollkästchen, ein Optionsfeld, eine gewählte Option, ein Datum oder eine Farbe (Auf / Ab durchlaufen eine Liste, Entf leert eine Liste, ein Datum oder eine Farbe). as_keys ist die Adresse des Feldes, as_value sein neuer Wert als Text; er ist bereits geschrieben. Ein von Ihrem Code geschriebener Wert löst nichts aus, wie SetItem. Was der Benutzer noch tippt, wenn Ihr Code das Formular liest (of_values, of_save_row, is_value…), wird in diesem Moment übernommen, wie bei AcceptText: das Event wird dort ausgelöst, vor dem Lesen |
ue_value_changing (string as_keys, string as_value) → boolean | Abbrechbar, wird vor dem Schreiben eines Benutzerwerts gestellt, und nur bei ib_veto_changes = true (standardmäßig aus). FALSE zurückgeben lehnt ab: das Feld zeigt wieder den alten Wert, den of_field(as_keys).is_value während des Events noch liefert. Geben Sie TRUE zurück, um anzunehmen. Wenn Ihr Code das Formular liest (of_values, of_validate, is_value…), während der Benutzer noch in einem Feld tippt, wird die Frage sofort gestellt, vor dem Lesen: das Lesen liefert den Wert, den Sie zugelassen haben |
ue_focus_changed (string as_from_keys, string as_keys) | Das Feld, das die Tastatur hat, hat gewechselt: ein Klick, die Tabulatortaste, Ihr Code (of_focus_field, of_validate — auch ein Befehl löst es aus, wie SetColumn), oder das Feld ist weg: entfernt, ausgeblendet, geleert (as_keys ist dann ""). Die Tastatur, die das Formular für ein anderes Steuerelement des Fensters verlässt, löst nichts aus |
ue_section_toggled (string as_key, boolean ab_collapsed) | Ein Abschnitt wurde eingeklappt (ab_collapsed = TRUE) oder aufgeklappt: ein Klick auf seine Kopfzeile (Eingabe oder Leertaste, wenn sie die Tastatur hat), sein von Ihrem Code gesetztes ib_collapsed oder of_focus_field auf ein Feld eines eingeklappten Abschnitts |
ue_ellipsis_clicked (string as_keys) | Die Schaltfläche … eines Feldes (ib_ellipsis) wurde angeklickt oder Strg+Eingabe im Feld gedrückt: öffnen Sie Ihre Suche (einen Kunden, einen Artikel) und schreiben Sie die Wahl des Benutzers in of_field(as_keys).is_value. Das Getippte ist bereits übernommen (mit ib_veto_changes zuerst ue_value_changing gefragt, ue_value_changed ausgelöst). Nie für ein deaktiviertes Feld ausgelöst |
ue_ready ( ) | Die Komponente ist fertig geladen; alles zuvor Gesendete wurde nachgespielt |
ue_runtime_missing ( ) | Die WebView2-Runtime fehlt: die Komponente bleibt leer |
ue_bg_color (long al_color) | Die Komponente hat ihre Design-Hintergrundfarbe berechnet; das Userobject hat sie bereits übernommen (backcolor) |
Tastatur und Maus #
| Geste | Wirkung |
|---|---|
| Tab, Umschalt+Tab | Wechseln von Feld zu Feld, in Bildschirmreihenfolge: die Felder oben, dann jeder Abschnitt, zuerst seine Kopfzeile; ein deaktiviertes Feld wird übersprungen; Optionsfelder sind ein Stopp, die Pfeiltasten wählen |
| Eingabe in einem einzeiligen Feld | Bestätigt die Eingabe und geht dann an das Fenster: seine Standardschaltfläche (Ihr OK) liest ein aktuelles Formular. Mit ib_veto_changes fragt die Seite nichts: die Eingabe bleibt ausstehend, und das Lesen der Standardschaltfläche übernimmt sie (ue_value_changing wird dann gefragt) — ohne Standardschaltfläche übernimmt sie das Verlassen des Feldes |
| Esc | In einem vom Benutzer geänderten Feld stellt es den Wert wieder her; sonst geht es an das Fenster: seine Abbrechen-Schaltfläche |
| Liste, Datum, Farbe: Eingabe, Leertaste, F4, Alt+Ab | Öffnen das gemeinsame Fenster (Liste, Kalender, Farbauswahl); Eingabe endet dort und geht nicht an die Standardschaltfläche des Fensters — auch nicht auf einer Abschnittskopfzeile, die sie ein- oder aufklappt |
| Liste: Auf / Ab | Vorherige / nächste Option, ohne die Liste zu öffnen |
| Liste, Datum, Farbe: Entf, Rücktaste | Leeren den Wert |
| Schlagwörter: Eingabe, Komma, Tab | Fügen das Getippte hinzu (Tab behält die Tastatur im Feld); die Rücktaste in der leeren Eingabe entfernt das letzte Schlagwort; Links / Rechts gehen die Schlagwörter durch, Entf entfernt das markierte; Ab öffnet die Vorschläge, Esc schließt sie |
| Sterne: Pfeile, Pos1 / Ende, Ziffern, Entf | Rechts / Auf ein Stern mehr (ein halber mit ib_half_stars), Links / Ab einer weniger — vertauscht in einer von rechts nach links geschriebenen Sprache; Pos1 ein Stern, Ende alle; eine Ziffer so viele Sterne; 0, Entf oder Rücktaste löschen die Bewertung |
| Zahl: Auf / Ab | Fügen die Schrittweite des Feldes hinzu oder ziehen sie ab (id_step, standardmäßig 1), innerhalb von is_min und is_max: ue_value_changed folgt. Mit ib_spin tun seine zwei Schaltflächen dasselbe, und das Mausrad, solange es die Tastatur hat |
| Strg+Eingabe, Klick auf … | Ein Feld mit ib_ellipsis: übernimmt das Getippte und löst dann ue_ellipsis_clicked aus — Ihre Suche |
| Klick auf eine Abschnittskopfzeile | Klappt den Abschnitt ein oder auf (ue_section_toggled) |
Beispiele #
Ein Kundendatensatz #
// The whole form in one paint, two columns
uo_form.of_set_redraw(/*on*/ false)
uo_form.ii_columns = 2
// Identity : two required names, an e-mail, a phone with its mask
uo_form.of_add_section(/*key*/ "identity", /*title*/ "Identity")
uo_form.of_add_field(/*keys*/ "identity/first_name", /*label*/ "First name", /*type*/ u_pbt_form.TYPE_STRING, /*value*/ "")
uo_form.of_field(/*keys*/ "identity/first_name").ib_required = true
uo_form.of_add_field(/*keys*/ "identity/last_name", /*label*/ "Last name", /*type*/ u_pbt_form.TYPE_STRING, /*value*/ "")
uo_form.of_field(/*keys*/ "identity/last_name").ib_required = true
uo_form.of_add_field(/*keys*/ "identity/email", /*label*/ "E-mail", /*type*/ u_pbt_form.TYPE_EMAIL, /*value*/ "")
uo_form.of_add_field(/*keys*/ "identity/phone", /*label*/ "Phone", /*type*/ u_pbt_form.TYPE_STRING, /*value*/ "")
uo_form.of_field(/*keys*/ "identity/phone").is_mask = "(###) ###-####"
// Account : a credit limit with a bound, shown as a price and typed without the
// dollar sign ; a list ; a switch
uo_form.of_add_section(/*key*/ "account", /*title*/ "Account")
uo_form.of_add_field(/*keys*/ "account/credit_limit", /*label*/ "Credit limit", /*type*/ u_pbt_form.TYPE_NUMBER, /*value*/ "2500")
uo_form.of_field(/*keys*/ "account/credit_limit").is_format = "$#,##0.00"
uo_form.of_field(/*keys*/ "account/credit_limit").is_max = "50000"
uo_form.of_add_field(/*keys*/ "account/country", /*label*/ "Country", /*type*/ u_pbt_form.TYPE_ENUM, /*value*/ "gb")
uo_form.of_add_option(/*keys*/ "account/country", /*value*/ "gb", /*text*/ "United Kingdom")
uo_form.of_add_option(/*keys*/ "account/country", /*value*/ "fr", /*text*/ "France")
uo_form.of_add_field(/*keys*/ "account/vip", /*label*/ "VIP customer", /*type*/ u_pbt_form.TYPE_BOOLEAN, /*value*/ "false")
// Shown at once, the keyboard on the first field
uo_form.of_set_redraw(/*on*/ true)
uo_form.of_focus_field(/*keys*/ "identity/first_name")
Eine DataWindow-Zeile bearbeiten #
Der Schlüssel jedes Feldes ist der Name seiner Spalte: das Formular liest die Zeile, der Benutzer bearbeitet sie, das Formular schreibt sie.
// The current row of dw_customers fills the form ; nothing is dirty yet
uo_form.of_load_row(/*data*/ dw_customers, /*row*/ dw_customers.GetRow())
// event clicked of cb_save
if uo_form.of_validate() > 0 then return
// Write the values back into the row, then save it
if uo_form.of_save_row(/*data*/ dw_customers, /*row*/ dw_customers.GetRow()) < 0 then
MessageBox("Save", uo_form.of_get_last_error())
return
end if
// Saved : what is on screen is the new reference
if dw_customers.Update() = 1 then
COMMIT USING SQLCA;
uo_form.of_reset_update()
end if
Schlagwörter und Sterne #
Eine Produktbewertung: eine Note von fünf mit halben Sternen und freie Schlagwörter mit Vorschlägen. Beide Werte bleiben Text, den of_save_row in eine Zahlen- und eine Textspalte schreibt.
// Local variables
string ls_score, ls_tags
// The score : five stars, half stars set BEFORE a half value
uo_form.of_add_field(/*keys*/ "score", /*label*/ "Overall", /*type*/ u_pbt_form.TYPE_RATING, /*value*/ "")
uo_form.of_field(/*keys*/ "score").ib_half_stars = true
uo_form.of_field(/*keys*/ "score").is_value = "3.5"
// Tags : free text, the options are suggestions, five at most
uo_form.of_add_field(/*keys*/ "tags", /*label*/ "Tags", /*type*/ u_pbt_form.TYPE_TAGS, /*value*/ "office, led")
uo_form.of_add_option(/*keys*/ "tags", /*value*/ "eco", /*text*/ "Eco-friendly")
uo_form.of_add_option(/*keys*/ "tags", /*value*/ "usb", /*text*/ "USB powered")
uo_form.of_field(/*keys*/ "tags").ii_max_tags = 5
// Read back : "3.5" and "office, led"
ls_score = uo_form.of_field(/*keys*/ "score").is_value
ls_tags = uo_form.of_field(/*keys*/ "tags").is_value
Vor dem Verlust von Änderungen warnen #
// event closequery of the window
if not uo_form.of_is_dirty() then return 0
// Changes since the load : ask, and put them back if the user gives up
if MessageBox("Customer", "Discard your changes ?", Question!, YesNo!) = 2 then return 1
uo_form.of_revert()
return 0
Bewährte Praxis #
- Ein Wert ist Text: eine Zahl wird mit Punkt geschrieben (
"12.5"), ein Boolean"true"/"false", eine FarbeString(RGB(…)), ein Datum"yyyy-mm-dd", eine Uhrzeit"hh:mm"— unabhängig von der Sprache des Arbeitsplatzes. Für typisierte Werteof_valuesundn_pbt_json. - Ihre OK-Schaltfläche entscheidet:
of_validatezeigt die Fehler und liefert ihre Anzahl; das Formular speichert selbst nichts. - Benennen Sie die Felder wie die Spalten:
of_load_rowundof_save_rowerledigen dann die ganze Arbeit; sonst nenntis_columndie Spalte eines Feldes. ib_readonlystattib_enabled = falsefür einen Wert, den der Benutzer lesen soll: ein schreibgeschützter Text lässt sich markieren und kopieren.- Demomodus: ohne Schlüssel zeichnet das Formular 6 Felder, die ersten in Bildschirmreihenfolge — ein Feld eines eingeklappten Abschnitts zählt mit, das Aufklappen zeichnet nichts neu; die anderen bleiben im Speicher und in
of_values, werden aber weder gezeichnet noch beurteilt (siehe Lizenz).
Vom gemeinsamen Sockel geerbt #
Diese Mitglieder gibt es bei jeder visuellen Komponente — sie sind nicht dieser eigen. Sie werden einmal in den übergreifenden Kapiteln beschrieben; diese Tabelle sagt nur, wo man sie liest.
| Mitglieder | Rolle | Beschrieben in |
|---|---|---|
of_count · of_keys_at · of_has | Durchlaufen, was die Komponente enthält | 3.2 Die Items |
of_reset | Die Komponente zurücksetzen | 3.6 Eine Komponente zurücksetzen: of_reset() |
of_register_shortcut · of_clear_shortcuts | Tastenkürzel der Komponente | 3.5 Tastenkombinationen |
of_is_created · of_is_ready · of_get_last_error | Ob sie entstanden ist, ob sie bereit ist, was fehlschlug | 3.7 Diagnose |
of_save_as_png · of_save_as_jpg | Die Darstellung als Bild exportieren | 3.8 Die Darstellung als Bild exportieren |
of_set_redraw | Änderungen zu einem einzigen Neuzeichnen bündeln | 3.10 Best Practices |
of_preload_icons | Symbole ohne Verzögerung | Sofortige Anzeige: of_icon |
of_set_translation | Eine Beschriftung der Komponente übersetzen | 5.2 Eine Beschriftung anpassen: of_set_translation |
of_focus_webview | Der Komponente den Fokus geben | 6.4 Tastatur und Fokus |
of_print · of_print_to_pdf | Drucken oder ein PDF schreiben | 6.9 Drucken |
of_set_property · of_get_property · of_component_name | Eine Eigenschaft über ihren Namen steuern | 3.1 Die Eigenschaften-Engine |
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.