propertygrid — u_pbt_propertygrid #
← Komponentenreferenz · Inhalt des Handbuchs
propertygrid ist das Eigenschaftenfenster einer IDE, für Ihre eigenen Daten: benannte Werte, in einklappbare Kategorien geordnet, jeder mit dem Editor seines Typs — Text, Zahl, Kontrollkästchen, Auswahlliste, Farbe, Datum, Kennwort. Zwei Ansichten (nach Kategorie, alphabetisch), ein Suchfeld, ein Hilfebereich, der die ausgewählte Eigenschaft beschreibt, und eine Schaltfläche …, die einen eigenen Dialog öffnet. Der Benutzer ändert,
ue_value_changedteilt es Ihnen mit.
▶ Live ansehen — Demoanwendung, Kachel Property grid: die Vorschau, der zugehörige Code und diese Seite, nebeneinander.
Auf einen Blick #
| Userobject | u_pbt_propertygrid |
| Item-Klassen | n_pbt_propertygrid_category (Kategorie) → n_pbt_propertygrid_property (Eigenschaft) |
| Wofür | Einen aus Feldern und Kästchen zusammengebastelten Einstellungsbildschirm durch einen thematisierten, typisierten, durchsuchbaren Inspektor ersetzen: Einstellungen eines Dokuments, eines Berichts, eines Datensatzes, eines Objekts der Anwendung |
| Werte | Immer Text, einzeln (of_property(adresse).is_value); alle auf einmal und typisiert über of_values |
| Opt-in-Optionen | ib_veto_changes |
Schnellstart #
// The settings of a report : one value at the top, then a category
uo_grid.of_add_property(/*keys*/ "title", /*label*/ "Title", /*type*/ u_pbt_propertygrid.TYPE_STRING, /*value*/ "Monthly sales")
uo_grid.of_add_category(/*key*/ "page", /*title*/ "Page")
uo_grid.of_add_property(/*keys*/ "page/landscape", /*label*/ "Landscape", /*type*/ u_pbt_propertygrid.TYPE_BOOLEAN, /*value*/ "true")
uo_grid.of_add_property(/*keys*/ "page/margin", /*label*/ "Margin (mm)", /*type*/ u_pbt_propertygrid.TYPE_NUMBER, /*value*/ "12.5")
// The help pane describes the selected property
uo_grid.of_property(/*keys*/ "page/margin").is_description = "Around the printed area, in [b]millimetres[/b]."
// event ue_value_changed of uo_grid : (string as_keys, string as_value)
// The value is already written ; the address says which one
choose case as_keys
case "title"
of_set_report_title(as_value)
case "page/landscape"
of_set_landscape(as_value = "true")
end choose
Eine Adresse pro Eigenschaft #
Eine Eigenschaft wird über ihre Adresse benannt: oben ihr Schlüssel allein ("title"), unter einer Kategorie die Kategorie und dann die Eigenschaft, durch / verbunden ("page/margin"). Eine aufklappbare Eigenschaft (TYPE_GROUP) enthält ihrerseits Eigenschaften, die an ihrer Adresse hinzugefügt werden: "appearance/font/size" in der Gruppe font der Kategorie appearance, "margin/left" in einer Gruppe der obersten Ebene — und eine Gruppe kann eine weitere enthalten. Worin eine Eigenschaft liegt, ist also eine Kategorie (nur eine Ebene) oder eine Gruppe. Eine Kategorie wird über ihren Schlüssel allein benannt. Oben benennt ein Schlüssel nur eine Sache: eine Kategorie und eine Eigenschaft der obersten Ebene können ihn nicht teilen. Die Events tragen dieselbe Adresse, die Sie geschrieben haben.
// A category by its key, a property by its address
uo_grid.of_category(/*key*/ "page").ib_collapsed = true
uo_grid.of_property(/*keys*/ "page/margin").is_value = "15"
// A property held by a group : the address goes through the group
uo_grid.of_property(/*keys*/ "appearance/font/size").is_value = "11"
Werttypen #
Der Typ wird einmal gewählt, in of_add_property, und bestimmt den Editor der Zeile. Der Wert selbst ist immer Text — übergeben, gelesen, von den Events geliefert — gleich geschrieben, unabhängig von der Sprache des Arbeitsplatzes.
| Konstante | Editor | Der Wert als Text |
|---|---|---|
TYPE_STRING | Textfeld | Der Text, wie er ist |
TYPE_NUMBER | Textfeld, das nur eine Zahl annimmt, gelesen in der Anzeigesprache: ihr Dezimaltrennzeichen oder ein Punkt, ihre Tausendergruppierung, wenn sie korrekt gebildet ist (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, wird abgelehnt: der eingetippte Text bleibt, rot umrahmt, und der Hilfebereich sagt warum (Esc verwirft ihn). is_min, is_max und id_step begrenzen die Eingabe und steuern Pfeil auf / ab | Mit Punkt: "12.5"; "" = leer. Ziffer für Ziffer erhalten ("1.50" bleibt "1.50"); ein Text, der keine Zahl ist, wird abgelehnt |
TYPE_BOOLEAN | Kontrollkästchen | "true" · "false" |
TYPE_ENUM | Auswahlliste in den Farben des Themas; ihre Optionen werden einzeln hinzugefügt (of_add_option), ihr Text schlicht, ohne Auszeichnung | Der Wert der gewählten Option, nie ihr Text |
TYPE_COLOR | Farbfeld und Farbauswahl; die Zelle zeigt r, g, b. Über 16777215 wird eine Systemfarbe von PowerBuilder (67108864 Button Face, 553648127 Transparent, 1073741824 Window Background…) mit ihrem Namen und einem neutralen Farbfeld angezeigt, und die Farbauswahl öffnet sich ohne aktuelle Farbe | Der RGB-Long als Text: String(RGB(255, 0, 0)) = "255" |
TYPE_DATE | Kalender; die Zelle zeigt das Datum im Format der Anzeigesprache | "yyyy-mm-dd" : String(Today(), "yyyy-mm-dd") |
TYPE_PASSWORD | Maskiertes Textfeld | Der Klartext, nie angezeigt und nie von der Suche gefunden (auch {x:raw} einer Zusammenfassung bleibt maskiert) |
TYPE_GROUP | Keiner: eine aufklappbare Eigenschaft (eine Schrift, ein Rand), mit einem Chevron am Anfang ihrer Beschriftung; sie enthält die an ihrer Adresse hinzugefügten Eigenschaften und klappt über ib_expanded, ihren Chevron, einen Doppelklick auf ihre Beschriftung oder die Tastatur auf. Beim Hinzufügen geschlossen | Keiner zu übergeben ("", jeder andere wird abgelehnt); gelesen ihre Zusammenfassung: die von is_summary geschriebene, sonst die angezeigten Werte ihres Inhalts, ausgeblendete übersprungen, durch ; verbunden ("Segoe UI; 9; True"); geschrieben ignoriert |
Ein Wert, den sein Typ nicht fassen kann, wird abgelehnt — von of_add_property (-5) wie über is_value oder is_default (der alte bleibt) — und of_get_last_error sagt warum: eine Zahl, die keine ist, ein Boolean außer true / false / 1 / 0, ein Datum, das kein echtes yyyy-mm-dd ist, eine Farbe, die keine ganze Zahl ab -1 ist, ein TYPE_STRING oder TYPE_PASSWORD über mehrere Zeilen (das Feld des Rasters fasst eine Zeile). "" (kein Wert) wird immer angenommen. Ein Listenwert, den keine Option anbietet, wird angenommen und so angezeigt, wie er ist: eine Liste kann nach ihrem Wert geladen werden. Die Farbe -1 — die des Themas, die Konvention der ganzen Bibliothek — wird „(Standard)“ angezeigt; eine Systemfarbe und die true / false einer Zusammenfassung erscheinen in der Anzeigesprache.
Eigenschaften #
| Eigenschaft | Typ | Standard | Zweck |
|---|---|---|---|
is_sort | string | "categorized" | Die Ansicht: SORT_CATEGORIZED (die Eigenschaften der obersten Ebene, dann jede Kategorie unter einer einklappbaren Kopfzeile) oder SORT_ALPHABETICAL (eine einzige, nach der angezeigten Beschriftung (ohne Auszeichnung) sortierte Liste ohne Kopfzeilen; eine Gruppe behält ihren Inhalt unter sich). Die beiden Schaltflächen der Werkzeugleiste ändern sie ebenfalls: live gelesen. Der Wechsel zu alphabetisch, während eine Kopfzeile ausgewählt ist, hebt die Auswahl auf |
ib_toolbar | boolean | true | Die Werkzeugleiste: die beiden Ansichten und das Suchfeld. false blendet sie aus; is_sort und is_filter bleiben per Code steuerbar |
ib_help | boolean | true | Der Hilfebereich unten: Beschriftung und Beschreibung (is_description) der ausgewählten Eigenschaft, der Titel einer ausgewählten Kategorie |
ii_label_width | integer | 40 | Anteil der Breite für die Beschriftungen, in Prozent, von 15 bis 85. Der Benutzer zieht die Linie zwischen Beschriftungen und Werten: live gelesen |
is_filter | string | "" | Die Suche: nur die Eigenschaften, deren Beschriftung, Schlüssel oder angezeigter Wert diesen Text enthält, ohne Rücksicht auf Groß-/Kleinschreibung, bleiben; während einer Suche erscheinen jede Kategorie und jede Gruppe mit Treffer geöffnet, ohne ihren Einklappzustand zu verlieren. Die Beschriftung wird so gelesen, wie sie angezeigt wird, ohne ihre Auszeichnung; weder der Titel einer Kategorie noch die vollständige Adresse wird durchsucht. Während einer Suche bewirkt ein Ein- oder Ausklappen des Benutzers nichts; eines Ihres Codes (ib_collapsed, ib_expanded, of_expand_all, of_collapse_all) wird gespeichert, löst sein Ereignis aus und wird sichtbar, sobald die Suche leer ist; eine ausgewählte Zeile, die die Suche verbirgt, verlässt die Auswahl (ue_selection_changed mit leerer Adresse). Das Suchfeld schreibt sie ebenfalls (Esc leert es): live gelesen. "" zeigt alles |
ib_veto_changes | boolean | false | Opt-in: vor dem Schreiben eines Benutzerwerts nachfragen (löst ue_value_changing aus, das ablehnen kann: die Zelle 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 einer Kategorie — n_pbt_propertygrid_category #
| 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 die Kategorie ein: ihre Kopfzeile bleibt, ihre Eigenschaften verschwinden (eine Auswahl darin wandert auf die Kopfzeile). ue_category_toggled folgt, wie bei einem Klick auf die Kopfzeile. Während einer Suche erscheint jede Kategorie geöffnet: ein Klick auf die Kopfzeile bewirkt nichts, und ein vom Code gesetztes true wird gespeichert (das Ereignis folgt, das Lesen liefert es) und wird sichtbar, sobald die Suche leer ist. Live gelesen |
ib_visible | boolean | true | false nimmt die Kategorie samt Inhalt aus dem Raster; sie behält ihren Schlüssel und ihre Werte, die of_values weiterhin liefert |
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 der Kategorie: ihre Auswahl übernimmt ihn (-1 = der der Komponente). Um sie ganz einzufärben, il_back_color / il_text_color |
il_back_color | long | -1 | Hintergrund der Kopfzeile der Kategorie, als RGB(r,g,b) (-1 = was das Design vorgibt) |
il_text_color | long | -1 | Textfarbe der Kopfzeile der Kategorie (-1 = was das Design vorgibt) |
il_back_color_hover | long | -1 | Hintergrund der Kopfzeile der Kategorie unter dem Mauszeiger (-1 = was das Design vorgibt) |
il_text_color_hover | long | -1 | Textfarbe der Kopfzeile der Kategorie unter dem Mauszeiger (-1 = was das Design vorgibt) |
Eigenschaften einer Eigenschaft — n_pbt_propertygrid_property #
| Eigenschaft | Typ | Standard | Zweck |
|---|---|---|---|
is_value | string | der von of_add_property | Der Wert, als Text (siehe Werttypen); bei einer Liste der Wert der Option. Das Schreiben löst nichts aus, wie SetItem; das Lesen liefert den aktuellen Wert, egal wer ihn geschrieben hat. Ein Wert, den ihr Typ nicht aufnehmen kann (ein TYPE_NUMBER, der einen Text erhält, der keine Zahl ist), wird abgelehnt: der alte Wert bleibt, und of_get_last_error des Rasters sagt, warum. Bei einer Gruppe (TYPE_GROUP) liefert das Lesen ihre Zusammenfassung (siehe is_summary), und das Schreiben wird ignoriert |
is_label | string | der von of_add_property | Der Name in der linken Spalte; akzeptiert die Rich-Text-Auszeichnung. Leer zeigt die Zeile den Schlüssel, so wie er ist (nie als Auszeichnung gelesen). Die alphabetische Ansicht sortiert danach und die Suche liest sie so, wie sie angezeigt wird: ohne ihre Auszeichnung |
is_description | string | "" | Der Text des Hilfebereichs, solange die Eigenschaft ausgewählt ist; akzeptiert die Rich-Text-Auszeichnung |
ib_readonly | boolean | false | Angezeigt, nicht änderbar: der Wert erscheint grau und kein Editor öffnet sich, weder per Klick noch per Tastatur noch per Doppelklick. Eine schreibgeschützte Gruppe macht ihren gesamten Inhalt schreibgeschützt. Die Schaltfläche … (ib_ellipsis) bleibt aktiv: lesen Sie ib_readonly in ue_ellipsis_clicked, um Ihren Dialog schreibgeschützt zu öffnen |
ib_visible | boolean | true | false nimmt die Zeile aus dem Raster; die Eigenschaft behält Adresse und Wert (of_values liefert ihn weiterhin). Das Ausblenden einer Gruppe blendet ihren Inhalt aus; das Ausblenden der ausgewählten Eigenschaft hebt die Auswahl auf |
ib_ellipsis | boolean | false | Eine Schaltfläche … am Zeilenende: ein Klick — oder Strg+Eingabe auf der ausgewählten Zeile — wählt die Zeile aus und löst ue_ellipsis_clicked aus, auch bei einer schreibgeschützten Eigenschaft, für einen eigenen Dialog (eine Datei, eine Schrift, eine Liste aus der Datenbank) |
ib_expanded | boolean | false | Für eine aufklappbare Eigenschaft (TYPE_GROUP): true zeigt ihren Inhalt eingerückt darunter; false blendet ihn aus (eine Auswahl darin wandert auf die Gruppe). ue_property_toggled folgt, wie bei einem Klick auf ihren Chevron. Während einer Suche erscheint eine Gruppe mit Treffer geöffnet: ihr Chevron bewirkt nichts, und ein vom Code gesetzter Wert wird gespeichert (das Ereignis folgt) und wird sichtbar, sobald die Suche leer ist. Live gelesen; ohne Wirkung auf die anderen Typen |
is_summary | string | "" | Für eine aufklappbare Eigenschaft (TYPE_GROUP): wie ihre Zusammenfassung geschrieben wird, eine Vorlage. {size} ist der angezeigte Wert ihrer Untereigenschaft size, {size:raw} ihr gespeicherter Wert (ein Kennwort bleibt maskiert), {?bold}…{/bold} ein Stück, das nur bleibt, wenn bold aktiv ist (ein wahrer Boolean, ein Wert, der weder leer noch false noch 0 ist), {!bold}…{/bold} nur, wenn nicht, {{ }} wörtliche Klammern; ein unbekannter Schlüssel ergibt nichts. "{name}, {size} pt{?bold}, bold{/bold}" zeigt Segoe UI, 10 pt, bold. Leer (Standard): die angezeigten Werte, ausgeblendete übersprungen, durch ; verbunden. Die Zusammenfassung ist schlichter Text; sie folgt jeder Änderung des Inhalts der Gruppe; is_value der Gruppe liefert sie |
is_mask | string | "" | Für einen TYPE_NUMBER: seine Eingabemaske, 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. Leer (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), sonst die Zahl, wie sie ist; ohne Wirkung bei den anderen Typen |
is_format | string | "" | Für einen TYPE_NUMBER: sein Anzeigeformat, wie die Zelle die Zahl anzeigt, solange ihr Feld nicht die Tastatur hat — dieselbe Syntax wie is_mask, mit ihren Literalen: #,##0 "px" zeigt 575 px, $#,##0.00 einen Preis, 0.0% einen Satz (0,125 zeigt 12,5%). Die Zusammenfassung einer Gruppe und die Suche lesen es ebenfalls. 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 (Standard): die Zelle zeigt ihr is_mask; ohne Wirkung bei den anderen Typen |
is_default | string | "" | Der Standardwert, als Text wie is_value. Solange der Wert davon abweicht, wird er fett geschrieben und der Hilfebereich zeigt den Standard; der Benutzer stellt ihn mit Entf auf der ausgewählten Zeile oder mit der Schaltfläche Zurücksetzen (↺) der Werkzeugleiste wieder her, die nur erscheint, wenn mindestens eine Eigenschaft einen Standard hat — eine Geste des Benutzers: ue_value_changing, wenn das Veto aktiv ist, dann ue_value_changed. Ein Wert, den sein Typ nicht fassen kann, wird abgelehnt. "" zu schreiben entfernt den Standard: kein Fettdruck mehr, kein Standard im Hilfebereich, "" gelesen. Ohne Standard leert Entf den Wert (ein Boolean bleibt, wie er ist) |
is_error | string | "" | Ein Fehler Ihrer Anwendung ("Dieser Name existiert bereits"): der Wert wird rot umrahmt, der Hilfebereich nennt ihn in Worten, ebenso eine QuickInfo, und ein Bildschirmleser kündigt ihn an. Er verschwindet, wenn der Benutzer die Eigenschaft ändert oder Sie "" schreiben. In ue_value_changing vor dem Ablehnen gesetzt, erklärt er die Ablehnung. Gelesen: der Fehler, den die Eigenschaft zeigt — Ihrer, sonst der des Rasters, wenn eine eingetippte Zahl abgelehnt wird (keine Zahl, außerhalb von is_min / is_max); der eingetippte Text bleibt dann zur Korrektur stehen, Esc verwirft ihn |
is_min | string | "" | Für einen TYPE_NUMBER: der kleinste Wert, den der Benutzer angeben darf, als Zahl, wie der Code sie schreibt ("0", "12.5"); "" = keine Grenze. Eine darunter eingetippte Zahl wird abgelehnt, bleibt stehen, und der Hilfebereich sagt warum; Pfeil ab hält dort an. Ihr Code darf weiterhin jeden Wert schreiben. Ein Text, der keine Zahl ist, wird abgelehnt (of_get_last_error), ebenso eine Grenze, die die andere kreuzt (is_min über is_max). Von den anderen Typen ignoriert |
is_max | string | "" | Für einen TYPE_NUMBER: der größte Wert, den der Benutzer angeben darf; "" = keine Grenze. Dieselben Regeln wie is_min; Pfeil auf hält dort an |
id_step | double | 1 | Für einen TYPE_NUMBER: was Pfeil auf und Pfeil ab hinzufügen oder abziehen, solange sein Feld die Tastatur hat, innerhalb von is_min / is_max. Jeder Schritt ist ein Wert des Benutzers (ue_value_changed, zuerst gefragt, wenn das Veto aktiv ist). 0 oder weniger zählt als 1. Von den anderen Typen ignoriert |
of_is_dirty ( ) → boolean | — | — | TRUE, wenn der Wert von seiner Referenz abweicht (siehe of_is_dirty des Rasters) |
of_type ( ) → string | — | — | Der an of_add_property übergebene Typ (eine Konstante TYPE_*). Nur lesbar: ein Typ wird einmal gewählt |
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 Zeile der Eigenschaft: ihre Auswahl und der Rahmen ihres Editors übernehmen ihn (-1 = der der Komponente). Um sie ganz einzufärben, il_back_color / il_text_color |
il_back_color | long | -1 | Hintergrund der Zeile der Eigenschaft, als RGB(r,g,b) (-1 = was das Design vorgibt) |
il_text_color | long | -1 | Textfarbe der Zeile der Eigenschaft (-1 = was das Design vorgibt) |
il_back_color_hover | long | -1 | Hintergrund der Beschriftung der Eigenschaft, solange der Mauszeiger auf ihrer Zeile ist (-1 = was das Design vorgibt) |
il_text_color_hover | long | -1 | Textfarbe der Beschriftung der Eigenschaft, solange der Mauszeiger auf ihrer Zeile ist (-1 = was das Design vorgibt) |
Methoden #
Auf der Komponente #
| Methode | Zweck | |
|---|---|---|
of_add_category (string as_key, string as_title) → long | Fügt am Ende eine Kategorie hinzu: eine einklappbare Kopfzeile, unter der danach die Eigenschaften "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 einer Kategorie oder einer Eigenschaft der obersten Ebene belegten, -2`, wenn die Komponente nicht erstellt ist |
of_add_property (string as_keys, string as_label, string as_type, string as_value) → long | Fügt eine Eigenschaft an ihrer Adresse hinzu, am Ende ihres Behälters: ihre Kategorie, ihre Gruppe ("appearance/font/size", "margin/left") oder die Eigenschaften der obersten Ebene. as_type ist eine Konstante TYPE_*, as_value ihr Wert als Text ("" für einen TYPE_GROUP, der keinen hat). Liefert 0 nach dem Hinzufügen, -5 für eine bereits belegte Adresse, ein übergeordnetes Element, das weder Kategorie noch Gruppe ist (oder noch nicht hinzugefügt), eine leere Ebene ("layout/", "a//b"), einen Schlüssel mit ` | , einen unbekannten Typ, einen TYPE_NUMBER-Wert, der keine Zahl ist, wie der Code sie schreibt (ein Punkt für die Dezimalstellen, Vorzeichen und Exponent optional, "" erlaubt), einen Boolean, ein Datum oder eine Farbe, die keine sind, einen Text oder ein Kennwort über mehrere Zeilen (of_get_last_error sagt warum) oder einen Wert für einen TYPE_GROUP, -2`, wenn die Komponente nicht erstellt ist |
of_add_option (string as_keys, string as_value, string as_text) → long | Fügt der Liste einer Eigenschaft TYPE_ENUM am Ende eine Option hinzu: as_value ist, was die Eigenschaft enthält (und was ue_value_changed liefert), as_text, was die Liste zeigt, als schlichter Text ohne Auszeichnung ("" zeigt den Wert). Liefert 0 nach dem Hinzufügen, -5 für eine Adresse, die keine Listeneigenschaft ist, einen Wert, den diese Eigenschaft schon anbietet, oder einen Wert mit ` | oder / (of_keys_at benennt eine Option mit der Adresse der Eigenschaft, gefolgt von ihrem Wert: eine Ebene), -2`, wenn die Komponente nicht erstellt ist |
of_remove_option (string as_keys, string as_value) → long | Entfernt eine Option aus der Liste einer Eigenschaft TYPE_ENUM, über ihren Wert. Der Wert, den die Eigenschaft enthält, bleibt, wie er ist, auch wenn es diese Option war. Liefert 0 nach dem Entfernen, -5 für eine Adresse, die keine Listeneigenschaft ist, oder einen Wert, den ihre Liste nicht anbietet, -2, wenn die Komponente nicht erstellt ist | |
of_clear_options (string as_keys) → long | Entfernt alle Optionen einer Eigenschaft TYPE_ENUM, um eine andere Liste zu laden, ohne die Eigenschaft, ihr Handle, ihre Auswahl oder ihre Schalter zu verlieren. Der Wert, den sie enthält, bleibt, wie er ist: schreiben Sie den neuen in is_value. Liefert 0 nach dem Leeren, -5 für eine Adresse, die keine Listeneigenschaft ist, -2, wenn die Komponente nicht erstellt ist | |
of_category (string as_key) → n_pbt_propertygrid_category | Handle einer Kategorie, über ihren Schlüssel (beim ersten Zugriff erzeugt): Titel, Einklappzustand, Sichtbarkeit und Farben werden darüber gesetzt | |
of_property (string as_keys) → n_pbt_propertygrid_property | Handle einer Eigenschaft, über ihre Adresse (beim ersten Zugriff erzeugt): Wert, Beschriftung, Beschreibung, Schalter und Farben werden darüber gesetzt und gelesen. Eine Adresse, die dieses Raster nie hinzugefügt hat (ein Tippfehler), liefert ein Handle, das nicht aufbewahrt wird: darüber zu schreiben bewirkt nichts, und of_get_last_error sagt warum | |
of_remove_property (string as_keys) → long | Entfernt eine Eigenschaft und mit ihr ihr Handle; eine Gruppe geht mit ihrem gesamten Inhalt. War sie ausgewählt, meldet ue_selection_changed, dass keine Auswahl mehr besteht. Liefert 0 nach dem Entfernen, -5 für eine Adresse, die dieses Raster nie hinzugefügt hat, -2, wenn die Komponente nicht erstellt ist | |
of_remove_category (string as_key) → long | Entfernt eine Kategorie und alle ihre Eigenschaften samt Handles. Lag die Auswahl darin, meldet ue_selection_changed, dass keine mehr besteht. Liefert 0 nach dem Entfernen, -5 für einen Schlüssel, den dieses Raster nie als Kategorie hinzugefügt hat, -2, wenn die Komponente nicht erstellt ist | |
of_clear ( ) → long | Leert das Raster: Kategorien, Eigenschaften, Optionen und Handles. Ansicht, Werkzeugleiste, Hilfebereich und Suche bleiben, wie sie sind (erst of_reset setzt jede Eigenschaft der Komponente zurück). War eine Zeile ausgewählt, folgt ue_selection_changed mit einer leeren Adresse. Liefert 0 nach dem Leeren, -2, wenn die Komponente nicht erstellt ist | |
of_select_property (string as_keys) → long | Wählt eine Zeile aus, wie ein Klick: eine Eigenschaft ("page/margin") oder die Kopfzeile einer Kategorie ("page"). Worin die Eigenschaft liegt, öffnet sich zuerst: ihre eingeklappte Kategorie, ihre geschlossenen Gruppen (ue_category_toggled, ue_property_toggled) — nur wenn die Zeile dann angezeigt wird: ein abgelehnter Aufruf öffnet nichts. ue_selection_changed folgt, wie bei einem Klick. Liefert 0 nach der Auswahl (oder wenn sie schon ausgewählt war), -5 für eine Adresse, die dieses Raster nie hinzugefügt hat, oder eine nicht angezeigte Zeile (ausgeblendet, außerhalb der Suche, jenseits der Demo-Grenze, eine Kopfzeile in der alphabetischen Ansicht), -2, wenn die Komponente nicht erstellt ist | |
of_clear_selection ( ) → long | Lässt keine Zeile ausgewählt; ue_selection_changed folgt mit einer leeren Adresse. Ist schon nichts ausgewählt, wird nichts ausgelöst. Liefert 0 nach der Anwendung, -2, wenn die Komponente nicht erstellt ist | |
of_selected_key ( ) → string | Adresse der ausgewählten Zeile, live gelesen, egal wer sie gesetzt hat: "page/margin", "page" für eine Kopfzeile, "", wenn keine. Genau das, was ue_selection_changed Ihnen übergibt | |
of_expand_all ( ) → long | Klappt alle Kategorien und alle Gruppen auf; ue_category_toggled folgt für jede eingeklappte Kategorie, ue_property_toggled für jede geschlossene Gruppe. Liefert 0 nach der Anwendung, -2, wenn die Komponente nicht erstellt ist | |
of_collapse_all ( ) → long | Klappt alle Kategorien ein und schließt alle Gruppen; ue_category_toggled und ue_property_toggled folgen für jedes Element, das sich ändert. Liefert 0 nach der Anwendung, -2, wenn die Komponente nicht erstellt ist | |
of_dirty_keys (ref string as_keys[]) → long | Füllt as_keys[] mit den Adressen der Eigenschaften, die von ihrer Referenz abweichen, in der Reihenfolge der Ansicht nach Kategorie, und liefert ihre Anzahl (0 = nichts zu speichern); was der Benutzer noch tippt, wird zuerst übernommen | |
of_is_dirty ( ) → boolean | TRUE, wenn mindestens eine Eigenschaft von ihrer Referenz abweicht: dem Wert, mit dem sie hinzugefügt wurde, oder dem, was of_load oder of_reset_update daraus gemacht haben — ob der Benutzer oder Ihr Code ihn geändert hat. Derselbe Name wie beim Formular. Nicht zu verwechseln mit is_default, dem fett angezeigten Wert: dieser sagt, was zu speichern ist. Was der Benutzer noch tippt, wird zuerst übernommen, wie bei of_values | |
of_load (string as_json) → long | Lädt Werte auf einmal: ein JSON-Objekt nach Adresse, die Form, die of_values liefert — die Eigenschaften der obersten Ebene, ein Objekt pro Kategorie und pro Gruppe ({"name":"Orders","layout":{"width":800}}) — oder Schlüssel "layout/width". Die Werte werden still geschrieben (kein ue_value_changed) und werden zur Referenz von of_is_dirty; die angezeigten Fehler verschwinden. Eine Eigenschaft, die das Objekt nicht nennt, behält ihren Wert, eine Zahl wird Ziffer für Ziffer gelesen. Ein Wert, den das Raster nicht aufnehmen kann (keine Eigenschaft an dieser Adresse, ein Wert, den ihr Typ nicht fassen kann), wird übersprungen: der Rest wird geschrieben, und of_get_last_error nennt die übersprungenen Adressen. Was der Benutzer tippte, wird verworfen. Liefert 0 nach der Anwendung (auch mit übersprungenen Werten), -5 für einen Text, der kein JSON-Objekt ist, -2, wenn die Komponente nicht erstellt ist | |
of_reset_update ( ) → long | Die vorhandenen Werte werden zur Referenz: of_is_dirty antwortet wieder FALSE. Rufen Sie es auf, sobald Ihre Einstellungen gespeichert sind, wie ResetUpdate eines DataWindows. Liefert 0 nach der Anwendung, -2, wenn die Komponente nicht erstellt ist | |
of_revert ( ) → long | Setzt jede Eigenschaft auf ihren Referenzwert zurück, still (kein Event, wie ein vom Code geschriebener Wert), und entfernt die angezeigten Fehler; was der Benutzer tippte, wird verworfen (danach wird nichts ausgelöst): die Schaltfläche Abbrechen Ihres Einstellungsfensters. Liefert 0 nach der Anwendung, -2, wenn die Komponente nicht erstellt ist | |
of_clear_errors ( ) → long | Entfernt alle Fehler Ihrer Anwendung (is_error jeder Eigenschaft). Eine eingetippte Zahl, die das Raster abgelehnt hat, bleibt: der Benutzer muss sie korrigieren. Liefert 0 nach der Anwendung, -2, wenn die Komponente nicht erstellt ist | |
of_focus_property (string as_keys) → long | Setzt die Tastatur auf eine Eigenschaft, wie ein Klick auf ihren Wert: was sie enthält, öffnet sich zuerst (ue_category_toggled, ue_property_toggled), sie wird ausgewählt (ue_selection_changed) und ihr Editor erhält die Tastatur; eine Gruppe oder eine schreibgeschützte Eigenschaft: das Raster. Liefert 0, -5 für eine Adresse, die dieses Raster nie hinzugefügt hat, oder eine Zeile, die nicht angezeigt werden kann (ausgeblendet, außerhalb der Suche, jenseits der Demo-Grenze), -2, wenn die Komponente nicht erstellt ist | |
of_invalid_keys (ref string as_keys[]) → long | Füllt as_keys[] mit den Adressen der fehlerhaften Eigenschaften, in der Reihenfolge der Ansicht nach Kategorie, und liefert ihre Anzahl (0 = das Raster ist gültig); was der Benutzer noch tippt, wird zuerst übernommen | |
of_is_valid ( ) → boolean | TRUE, wenn keine angezeigte Eigenschaft einen Fehler trägt: weder Ihren (is_error) noch den des Rasters (eine abgelehnte eingetippte Zahl: keine Zahl, außerhalb von is_min / is_max). Was der Benutzer noch tippt, wird zuerst übernommen: ein abgelehnter Text zählt. Derselbe Name wie beim Formular | |
of_validate ( ) → long | Setzt die Tastatur auf die erste fehlerhafte Eigenschaft — ihre Kategorie und ihre Gruppen öffnen sich, sie wird ausgewählt und ihr Editor erhält die Tastatur: was Ihre OK-Schaltfläche vor dem Speichern aufruft. Was der Benutzer noch tippt, wird zuerst übernommen. Liefert die Anzahl fehlerhafter Eigenschaften (0 = das Raster ist gültig, nichts bewegt sich), -2, wenn die Komponente nicht erstellt ist | |
of_values ( ) → string | Alle Werte auf einmal, live gelesen — was der Benutzer noch tippt, wird zuerst übernommen, wie bei AcceptText (ue_value_changing, wenn das Veto aktiv ist, dann ue_value_changed) —, als JSON-Objekt: die Eigenschaften der obersten Ebene, dann jede Kategorie als eigenes Objekt, jede Gruppe als Objekt in ihrem Behälter — ausgeblendete eingeschlossen. Typisiert: eine Zahl ist eine Zahl, Ziffer für Ziffer geschrieben (eine Dezimalzahl mit 21 Stellen bleibt exakt), 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("page/margin"), lnv_json.of_get_number("appearance/font/size") | |
of_reset ( ) → long | Leert das Raster (of_clear) und setzt dann jede Eigenschaft der Komponente auf ihren Standard zurück: Ansicht nach Kategorie, Werkzeugleiste und Hilfebereich sichtbar, Beschriftungen bei 40 %, leere Suche, Rückfrage aus. Liefert 0 nach der Anwendung, -2, wenn die Komponente nicht erstellt ist |
Auf einer Kategorie und auf einer Eigenschaft #
Eine Kategorie enthält Eigenschaften; eine Gruppe (TYPE_GROUP) enthält ihre Untereigenschaften; eine Listeneigenschaft (TYPE_ENUM) enthält ihre Optionen, über ihren Wert benannt. Die drei Methoden durchlaufen sie.
| Methode | Zweck |
|---|---|
of_count ( ) → long | Anzahl der Eigenschaften der Kategorie, ausgeblendete eingeschlossen; Anzahl der Untereigenschaften einer Gruppe; Anzahl der Optionen einer Listeneigenschaft (0 für die anderen Typen) |
of_keys_at (long al_index) → string | Adresse der Eigenschaft an Position al_index (ab 1) — "page/margin", "appearance/font/size" bei einer Gruppe, unverändert in of_property verwendbar; bei einer Listeneigenschaft die Adresse, gefolgt vom Wert der Option. "" außerhalb des Bereichs |
of_has (string as_key) → boolean | Enthält die Kategorie oder die Gruppe diese Eigenschaft? Bietet die Listeneigenschaft 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 mit Eingabe oder durch Verlassen der Zelle bestätigte Eingabe, ein per Klick, Leertaste oder Eingabe / F2 angehaktes Kontrollkästchen, eine Wahl in einer Liste, eine Farbe, ein Datum, ein Doppelklick auf eine Beschriftung). as_keys ist die Adresse der Eigenschaft, as_value ihr neuer Wert als Text; er ist bereits geschrieben. Ein von Ihrem Code geschriebener Wert (is_value) löst nichts aus, wie SetItem: Ihr Code weiß, was er geschrieben hat. Entf oder die Schaltfläche Zurücksetzen (zurück zum Standard) und Pfeil auf / ab in einer Zahl sind Gesten des Benutzers: sie lösen es ebenfalls aus |
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: die Zelle zeigt wieder den alten Wert, den of_property(as_keys).is_value während des Events noch liefert. Geben Sie TRUE zurück, um anzunehmen. Setzen Sie of_property(as_keys).is_error vor dem Ablehnen: der Benutzer liest, warum |
ue_selection_changed (string as_from_keys, string as_keys) | Die Auswahl hat sich bewegt: ein Klick, die Tastatur oder Ihr Code (of_select_property, of_clear_selection — auch ein Befehl löst es aus, wie SelectItem), oder die ausgewählte Zeile ist weg: in ihre Kategorie oder Gruppe eingeklappt (as_keys ist dann diese Kopfzeile oder diese Gruppe), entfernt oder nicht mehr gezeichnet — ausgeblendet, von der Suche verborgen (auch durch ein Einklappen während der Suche), jenseits der Demo-Grenze (as_keys ist dann ""). Eine Zeile ist eine Eigenschaft ("page/margin") oder die Kopfzeile einer Kategorie ("page"); as_from_keys ist die verlassene |
ue_category_toggled (string as_key, boolean ab_collapsed) | Eine Kategorie wurde eingeklappt (ab_collapsed = TRUE) oder aufgeklappt: ein Klick auf ihre Kopfzeile, die Tastatur, ihr von Ihrem Code gesetztes ib_collapsed, of_expand_all, of_collapse_all oder of_select_property auf eine Eigenschaft in ihr |
ue_property_toggled (string as_keys, boolean ab_expanded) | Eine aufklappbare Eigenschaft (TYPE_GROUP) wurde geöffnet (ab_expanded = TRUE) oder geschlossen: ein Klick auf ihren Chevron, ein Doppelklick auf ihre Beschriftung, die Tastatur, ihr von Ihrem Code gesetztes ib_expanded, of_expand_all, of_collapse_all oder of_select_property auf ihren Inhalt. as_keys ist die Adresse der Gruppe |
ue_ellipsis_clicked (string as_keys) | Die Schaltfläche … einer Eigenschaft (ib_ellipsis) wurde geklickt, oder auf ihrer Zeile wurde Strg+Eingabe gedrückt: öffnen Sie Ihren Dialog und schreiben Sie das Ergebnis dann in of_property(as_keys).is_value. Die Schaltfläche bleibt bei einer schreibgeschützten Eigenschaft aktiv: of_property(as_keys).ib_readonly sagt, ob Ihr Dialog schreibgeschützt zu öffnen ist |
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 |
|---|---|
| Pfeil auf / ab, Pos1 / Ende, Bild auf / Bild ab | Bewegen die Auswahl von Zeile zu Zeile; Bild auf / Bild ab springen um die Höhe der Liste |
| Pfeil links / rechts | Auf einer Kopfzeile klappen sie die Kategorie ein oder auf; auf einer Gruppe öffnet Rechts sie und Links schließt sie; Rechts auf einer bereits geöffneten Kopfzeile oder Gruppe springt zu ihrer ersten Zeile; auf einer Eigenschaft springt Links zu ihrem Behälter, ihrer Gruppe oder ihrer Kopfzeile (von rechts nach links vertauscht). Während einer Suche bewirkt Ein- und Ausklappen nichts, weder per Tastatur noch per Maus |
| Eingabe, F2 | Öffnen den Editor der Eigenschaft (die Liste, die Farbauswahl oder den Kalender); ein Boolean wechselt; auf einer Kopfzeile oder einer Gruppe klappen sie ein oder auf. Ist nichts zu tun (keine Zeile, eine schreibgeschützte Eigenschaft), bleibt die Taste dem Fenster: seiner Standardschaltfläche |
| Leertaste | Setzt oder entfernt das Häkchen eines Booleans; auf einer Kopfzeile oder einer Gruppe klappt es ein oder auf |
| Eingabe / Esc in einem Editor | Bestätigt die Eingabe / stellt den alten Wert wieder her; die Tastatur kehrt zur Liste zurück. Esc in einem unveränderten Feld bleibt dem Fenster: seiner Abbrechen-Schaltfläche |
| Strg+Eingabe | Die Schaltfläche … der ausgewählten Zeile (ue_ellipsis_clicked) |
| Tab | Die Liste der Eigenschaften ist ein einziger Tabulatorstopp, egal wie groß: von den Editoren nehmen nur die der ausgewählten Zeile Tab an; die Liste, die die Tastatur ohne ausgewählte Zeile hat, zeigt einen Umriss |
| Doppelklick auf eine Beschriftung | Ein Boolean wechselt, eine Liste springt zur nächsten Wahl, eine Gruppe öffnet oder schließt sich |
| Entf | Auf der ausgewählten Zeile: stellt den Standardwert wieder her (is_default) oder leert ohne Standard den Wert — einen Text, eine Zahl, ein Datum, eine Farbe, eine Liste; ein Boolean ohne Standard bleibt. Die Schaltfläche Zurücksetzen (↺) der Werkzeugleiste stellt den Standard ebenfalls wieder her. Eine Geste des Benutzers: ue_value_changed |
| Rücktaste, eine Zeichentaste | Auf der ausgewählten Zeile eines Textes, einer Zahl oder eines Kennworts: beginnen die Eingabe — die Rücktaste öffnet den Editor, der Text bleibt und der Cursor steht am Ende (sie leert den Wert nicht mehr); eine Zeichentaste öffnet den Editor mit diesem Zeichen, wie im Eigenschaftenfenster von Visual Studio. Auf einer Liste, einer Farbe, einem Datum oder einem Kontrollkästchen: nichts |
| F4, Alt+Pfeil ab | Öffnen die Liste, die Farbauswahl oder den Kalender der ausgewählten Zeile, von der Liste aus wie von ihrer Schaltfläche, wie eine Dropdownliste von Windows |
| Pfeil auf / ab in einer Zahl | Addieren / subtrahieren id_step, innerhalb von is_min / is_max; jeder Schritt löst ue_value_changed aus |
| Trennlinie: links / rechts, Pos1 / Ende | Die Linie zwischen Beschriftungen und Werten nimmt die Tastatur an (Tab): links / rechts verschieben sie um 5 % (von rechts nach links umgekehrt), Pos1 / Ende bringen sie an die Enden (ii_label_width) |
| Ziehen der Linie zwischen Beschriftungen und Werten | Ändert ii_label_width |
| Suchfeld: Esc / Pfeil ab oder Eingabe | Leert die Suche / wechselt in die Liste, auf die erste Zeile, wenn keine ausgewählt ist |
Beispiele #
Die Einstellungen eines Fensters #
// The whole grid in one paint
uo_grid.of_set_redraw(/*on*/ false)
// At the top, without a category : the name of the window
uo_grid.of_add_property(/*keys*/ "name", /*label*/ "Name", /*type*/ u_pbt_propertygrid.TYPE_STRING, /*value*/ "Customers")
// A value given by the application : shown, not editable
uo_grid.of_add_category(/*key*/ "identity", /*title*/ "Identity")
uo_grid.of_add_property(/*keys*/ "identity/id", /*label*/ "Id", /*type*/ u_pbt_propertygrid.TYPE_STRING, /*value*/ "W-0042")
uo_grid.of_property(/*keys*/ "identity/id").ib_readonly = true
uo_grid.of_add_property(/*keys*/ "identity/created", /*label*/ "Created on", /*type*/ u_pbt_propertygrid.TYPE_DATE, /*value*/ String(Today(), "yyyy-mm-dd"))
// A number, a check box and a list of choices
uo_grid.of_add_category(/*key*/ "layout", /*title*/ "Layout")
uo_grid.of_add_property(/*keys*/ "layout/width", /*label*/ "Width", /*type*/ u_pbt_propertygrid.TYPE_NUMBER, /*value*/ "1200")
uo_grid.of_add_property(/*keys*/ "layout/resizable", /*label*/ "Resizable", /*type*/ u_pbt_propertygrid.TYPE_BOOLEAN, /*value*/ "true")
uo_grid.of_add_property(/*keys*/ "layout/state", /*label*/ "Window state", /*type*/ u_pbt_propertygrid.TYPE_ENUM, /*value*/ "normal")
uo_grid.of_add_option(/*keys*/ "layout/state", /*value*/ "normal", /*text*/ "Normal")
uo_grid.of_add_option(/*keys*/ "layout/state", /*value*/ "maximized", /*text*/ "Maximized")
// A colour, as its RGB long written out
uo_grid.of_add_category(/*key*/ "appearance", /*title*/ "Appearance")
uo_grid.of_add_property(/*keys*/ "appearance/back_color", /*label*/ "Back colour", /*type*/ u_pbt_propertygrid.TYPE_COLOR, /*value*/ String(RGB(/*red*/ 240, /*green*/ 244, /*blue*/ 250)))
// One single paint, then the first value to edit
uo_grid.of_set_redraw(/*on*/ true)
uo_grid.of_select_property(/*keys*/ "layout/width")
Ein Inspektor, der jede Änderung anwendet #
// event ue_value_changed of uo_grid : (string as_keys, string as_value)
// The address says which setting of the window the user changed
choose case as_keys
case "name"
w_customers.title = as_value
case "layout/width"
w_customers.width = Long(as_value)
case "layout/resizable"
w_customers.resizable = (as_value = "true")
case "appearance/back_color"
w_customers.backcolor = Long(as_value)
end choose
Die Schaltfläche …: ein eigener Dialog #
// The icon : typed by hand, or chosen through the "..." button
uo_grid.of_add_property(/*keys*/ "appearance/icon", /*label*/ "Icon", /*type*/ u_pbt_propertygrid.TYPE_STRING, /*value*/ "img\customers.png")
uo_grid.of_property(/*keys*/ "appearance/icon").ib_ellipsis = true
// event ue_ellipsis_clicked of uo_grid : (string as_keys)
// Local variables
string ls_path, ls_file
constant unsignedlong OFN_EXPLORER = 2
constant unsignedlong OFN_NOCHANGEDIR = 64
// The application opens its own dialog - in the Explorer style, without moving the current folder of the application - then writes the result (this raises nothing)
if GetFileOpenName("Icon", ls_path, ls_file, "png", "Pictures (*.png),*.png", /*initdir*/ "", OFN_EXPLORER + OFN_NOCHANGEDIR) = 1 then
uo_grid.of_property(/*keys*/ as_keys).is_value = ls_path
end if
Vor dem Schreiben prüfen #
// The question is OFF by default : turn it on to be able to refuse a value
uo_grid.ib_veto_changes = true
// event ue_value_changing of uo_grid : (string as_keys, string as_value)
// FALSE refuses : the cell shows the old value again. is_error, set before, tells
// the user why : the help pane shows it until the value is edited again
choose case as_keys
case "layout/width"
if Long(as_value) < 200 or Long(as_value) > 4000 then
uo_grid.of_property(/*keys*/ as_keys).is_error = "Between 200 and 4000 pixels."
return false
end if
case "name"
if Trim(as_value) = "" then
uo_grid.of_property(/*keys*/ as_keys).is_error = "A window needs a name."
return false
end if
end choose
// Any other value is accepted
return true
Standardwerte, Änderungen und Abbrechen #
Zwei getrennte Begriffe, wie im Eigenschaftenfenster von Visual Studio und in einem DataWindow: der Standardwert (is_default) sagt, was fett geschrieben wird und was Entf wiederherstellt; die Referenz (of_load, of_reset_update) sagt, was zu speichern ist (of_is_dirty, of_dirty_keys) und was Abbrechen zurücksetzt (of_revert).
// The defaults of the window : a value that differs is written in bold
uo_grid.of_property(/*keys*/ "layout/width").is_default = "800"
uo_grid.of_property(/*keys*/ "layout/state").is_default = "normal"
// The width the user may type, and what Up / Down add or take
uo_grid.of_property(/*keys*/ "layout/width").is_min = "200"
uo_grid.of_property(/*keys*/ "layout/width").is_max = "4000"
uo_grid.of_property(/*keys*/ "layout/width").id_step = 50
// The saved settings, read back : they become the reference
uo_grid.of_load(/*json*/ is_saved_settings)
// OK : every value right first - otherwise the keyboard goes to the first error
if uo_grid.of_validate() > 0 then return
// Save only what changed (what the user is still typing counts too), then the screen becomes the reference
if uo_grid.of_is_dirty() then
is_saved_settings = uo_grid.of_values()
uo_grid.of_reset_update()
end if
// Cancel : every value back to the settings loaded
uo_grid.of_revert()
Eine aufklappbare Eigenschaft #
Eine Schrift passt in eine geschlossene Zeile, die ihre Werte zusammenfasst, und klappt zu ihren drei Eigenschaften auf. Ohne Vorlage lautet die Zusammenfassung Segoe UI; 9; False; is_summary schreibt sie nach Ihrem Geschmack: Segoe UI, 9 pt, dann , bold, solange Bold angehakt ist.
// A group in the category appearance : the font, closed when it is added
uo_grid.of_add_category(/*key*/ "appearance", /*title*/ "Appearance")
uo_grid.of_add_property(/*keys*/ "appearance/font", /*label*/ "Font", /*type*/ u_pbt_propertygrid.TYPE_GROUP, /*value*/ "")
// What it holds is added at its address
uo_grid.of_add_property(/*keys*/ "appearance/font/name", /*label*/ "Name", /*type*/ u_pbt_propertygrid.TYPE_STRING, /*value*/ "Segoe UI")
uo_grid.of_add_property(/*keys*/ "appearance/font/size", /*label*/ "Size", /*type*/ u_pbt_propertygrid.TYPE_NUMBER, /*value*/ "9")
uo_grid.of_add_property(/*keys*/ "appearance/font/bold", /*label*/ "Bold", /*type*/ u_pbt_propertygrid.TYPE_BOOLEAN, /*value*/ "false")
// Its summary, written your way : "Segoe UI, 9 pt", then ", bold" while Bold is checked
uo_grid.of_property(/*keys*/ "appearance/font").is_summary = "{name}, {size} pt{?bold}, bold{/bold}"
// Open it : its three values show under it
uo_grid.of_property(/*keys*/ "appearance/font").ib_expanded = true
// Local variables
n_pbt_json lnv_json
double ld_size
// The group is an object in the values : the same address reads its size
lnv_json.of_load(/*json*/ uo_grid.of_values())
ld_size = lnv_json.of_get_number(/*path*/ "appearance/font/size")
// event ue_property_toggled of uo_grid : (string as_keys, boolean ab_expanded)
// The group that opened or closed, by its address
if ab_expanded then
lb_log.AddItem(as_keys + " opened")
else
lb_log.AddItem(as_keys + " closed")
end if
Alle Werte auf einmal lesen #
// Local variables
n_pbt_json lnv_json
string ls_state
// Every value, typed, read along the same addresses as the grid
lnv_json.of_load(/*json*/ uo_grid.of_values())
w_customers.title = lnv_json.of_get_string(/*path*/ "name")
w_customers.width = lnv_json.of_get_number(/*path*/ "layout/width")
w_customers.resizable = lnv_json.of_get_boolean(/*path*/ "layout/resizable")
// One value alone : always text
ls_state = uo_grid.of_property(/*keys*/ "layout/state").is_value
Ansichten, Suche und Breite der Beschriftungen #
// One flat list sorted by label, instead of the categories
uo_grid.is_sort = u_pbt_propertygrid.SORT_ALPHABETICAL
// Keep only what speaks of a colour
uo_grid.is_filter = "colour"
// The labels take half of the width, and the help pane goes away
uo_grid.ii_label_width = 50
uo_grid.ib_help = false
Eine Kategorie durchlaufen #
// Local variables
n_pbt_propertygrid_category lnv_layout
string ls_keys
long ll_i
// Each property of the category, by its full address
lnv_layout = uo_grid.of_category(/*key*/ "layout")
for ll_i = 1 to lnv_layout.of_count()
ls_keys = lnv_layout.of_keys_at(/*index*/ ll_i)
lb_values.AddItem(ls_keys + " = " + uo_grid.of_property(/*keys*/ ls_keys).is_value)
next
Eine Auswahlliste neu laden #
// The states offered depend on the kind of window : the old choices go,
// the property keeps its handle, its flags and its place
uo_grid.of_clear_options(/*keys*/ "layout/state")
// The new choices, then the value to show among them
uo_grid.of_add_option(/*keys*/ "layout/state", /*value*/ "docked", /*text*/ "Docked")
uo_grid.of_add_option(/*keys*/ "layout/state", /*value*/ "floating", /*text*/ "Floating")
uo_grid.of_property(/*keys*/ "layout/state").is_value = "docked"
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"— unabhängig von der Sprache des Arbeitsplatzes. Für typisierte Werteof_valuesundn_pbt_json. - Der Code schreibt still, der Benutzer meldet sich:
is_valuelöst nichts aus,ue_value_changedspricht nur von den Gesten des Benutzers. Eine einzige Stelle wendet also die Änderungen an, wie im Inspektor-Beispiel. - Beschreiben Sie: ein Satz in
is_descriptionist mehr wert als eine überlange Beschriftung — der Hilfebereich zeigt ihn, wenn der Benutzer ihn braucht. ib_readonlystattib_visible = falsefür einen Wert, den der Benutzer sehen, aber nicht ändern soll.- Demomodus: ohne Schlüssel zeichnet das Raster 8 Eigenschaftszeilen, gezählt in der Reihenfolge des Bildschirms (Ansicht nach Kategorie): eine geschlossene Gruppe zählt als eine Zeile, und ihre Untereigenschaften — die ihre Zusammenfassung zeigt — zählen erst, wenn die Gruppe offen ist; Kategorie-Kopfzeilen zählen nicht. Der Rest bleibt im Speicher und in
of_values, aber weder eine Zusammenfassung noch die Suche liest seinen Wert (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.