PBToolboxAI v5 ← Site

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_changed teilt es Ihnen mit.

▶ Live ansehen — Demoanwendung, Kachel Property grid: die Vorschau, der zugehörige Code und diese Seite, nebeneinander.


Auf einen Blick #

Userobjectu_pbt_propertygrid
Item-Klassenn_pbt_propertygrid_category (Kategorie) → n_pbt_propertygrid_property (Eigenschaft)
WofürEinen 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
WerteImmer Text, einzeln (of_property(adresse).is_value); alle auf einmal und typisiert über of_values
Opt-in-Optionenib_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.

KonstanteEditorDer Wert als Text
TYPE_STRINGTextfeldDer Text, wie er ist
TYPE_NUMBERTextfeld, 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 / abMit Punkt: "12.5"; "" = leer. Ziffer für Ziffer erhalten ("1.50" bleibt "1.50"); ein Text, der keine Zahl ist, wird abgelehnt
TYPE_BOOLEANKontrollkästchen"true" · "false"
TYPE_ENUMAuswahlliste in den Farben des Themas; ihre Optionen werden einzeln hinzugefügt (of_add_option), ihr Text schlicht, ohne AuszeichnungDer Wert der gewählten Option, nie ihr Text
TYPE_COLORFarbfeld 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 FarbeDer RGB-Long als Text: String(RGB(255, 0, 0)) = "255"
TYPE_DATEKalender; die Zelle zeigt das Datum im Format der Anzeigesprache"yyyy-mm-dd" : String(Today(), "yyyy-mm-dd")
TYPE_PASSWORDMaskiertes TextfeldDer Klartext, nie angezeigt und nie von der Suche gefunden (auch {x:raw} einer Zusammenfassung bleibt maskiert)
TYPE_GROUPKeiner: 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 geschlossenKeiner 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 #

EigenschaftTypStandardZweck
is_sortstring"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_toolbarbooleantrueDie Werkzeugleiste: die beiden Ansichten und das Suchfeld. false blendet sie aus; is_sort und is_filter bleiben per Code steuerbar
ib_helpbooleantrueDer Hilfebereich unten: Beschriftung und Beschreibung (is_description) der ausgewählten Eigenschaft, der Titel einer ausgewählten Kategorie
ii_label_widthinteger40Anteil der Breite für die Beschriftungen, in Prozent, von 15 bis 85. Der Benutzer zieht die Linie zwischen Beschriftungen und Werten: live gelesen
is_filterstring""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_changesbooleanfalseOpt-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_stylestring""Visueller Stil der Komponente (Konstanten THEME_STYLE_*); leer = der der Anwendung, bei jeder Änderung übernommen
is_theme_modestring""Helle oder dunkle Variante (Konstanten THEME_MODE_*); leer = die der Anwendung, bei jeder Änderung übernommen
il_theme_accentlong-1Akzentfarbe dieser Komponente (-1 = Akzent der Anwendung, sonst der des Designs)
is_tooltipstring""Einfacher Tooltip beim Überfahren der Komponente
is_super_tooltip_titlestring""Titel des erweiterten Tooltips (hat Vorrang vor is_tooltip)
is_super_tooltip_textstring""Text des erweiterten Tooltips (Rich-Markup zulässig)
is_super_tooltip_imagestring""Bild des erweiterten Tooltips

Eigenschaften einer Kategorie — n_pbt_propertygrid_category #

EigenschaftTypStandardZweck
is_titlestring""Titel der Kopfzeile. Akzeptiert die Rich-Text-Auszeichnung. Leer zeigt die Kopfzeile den Schlüssel
ib_collapsedbooleanfalsetrue 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_visiblebooleantruefalse nimmt die Kategorie samt Inhalt aus dem Raster; sie behält ihren Schlüssel und ihre Werte, die of_values weiterhin liefert
is_tooltipstring""Einfacher Tooltip beim Überfahren des Items
is_super_tooltip_titlestring""Titel des erweiterten Item-Tooltips (hat Vorrang vor is_tooltip)
is_super_tooltip_textstring""Text des erweiterten Item-Tooltips (Rich-Markup zulässig)
is_super_tooltip_imagestring""Bild des erweiterten Item-Tooltips
il_accentlong-1Akzent 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_colorlong-1Hintergrund der Kopfzeile der Kategorie, als RGB(r,g,b) (-1 = was das Design vorgibt)
il_text_colorlong-1Textfarbe der Kopfzeile der Kategorie (-1 = was das Design vorgibt)
il_back_color_hoverlong-1Hintergrund der Kopfzeile der Kategorie unter dem Mauszeiger (-1 = was das Design vorgibt)
il_text_color_hoverlong-1Textfarbe der Kopfzeile der Kategorie unter dem Mauszeiger (-1 = was das Design vorgibt)

Eigenschaften einer Eigenschaft — n_pbt_propertygrid_property #

EigenschaftTypStandardZweck
is_valuestringder von of_add_propertyDer 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_labelstringder von of_add_propertyDer 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_descriptionstring""Der Text des Hilfebereichs, solange die Eigenschaft ausgewählt ist; akzeptiert die Rich-Text-Auszeichnung
ib_readonlybooleanfalseAngezeigt, 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_visiblebooleantruefalse 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_ellipsisbooleanfalseEine 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_expandedbooleanfalseFü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_summarystring""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_maskstring""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_formatstring""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_defaultstring""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_errorstring""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_minstring""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_maxstring""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_stepdouble1Fü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_tooltipstring""Einfacher Tooltip beim Überfahren des Items
is_super_tooltip_titlestring""Titel des erweiterten Item-Tooltips (hat Vorrang vor is_tooltip)
is_super_tooltip_textstring""Text des erweiterten Item-Tooltips (Rich-Markup zulässig)
is_super_tooltip_imagestring""Bild des erweiterten Item-Tooltips
il_accentlong-1Akzent 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_colorlong-1Hintergrund der Zeile der Eigenschaft, als RGB(r,g,b) (-1 = was das Design vorgibt)
il_text_colorlong-1Textfarbe der Zeile der Eigenschaft (-1 = was das Design vorgibt)
il_back_color_hoverlong-1Hintergrund der Beschriftung der Eigenschaft, solange der Mauszeiger auf ihrer Zeile ist (-1 = was das Design vorgibt)
il_text_color_hoverlong-1Textfarbe der Beschriftung der Eigenschaft, solange der Mauszeiger auf ihrer Zeile ist (-1 = was das Design vorgibt)

Methoden #

Auf der Komponente #

MethodeZweck
of_add_category (string as_key, string as_title) → longFü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) → longFü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) → longFü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) → longEntfernt 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) → longEntfernt 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_categoryHandle 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_propertyHandle 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) → longEntfernt 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) → longEntfernt 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 ( ) → longLeert 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) → longWä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 ( ) → longLä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 ( ) → stringAdresse 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 ( ) → longKlappt 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 ( ) → longKlappt 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[]) → longFü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 ( ) → booleanTRUE, 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) → longLä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 ( ) → longDie 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 ( ) → longSetzt 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 ( ) → longEntfernt 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) → longSetzt 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[]) → longFü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 ( ) → booleanTRUE, 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 ( ) → longSetzt 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 ( ) → stringAlle 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 ( ) → longLeert 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.

MethodeZweck
of_count ( ) → longAnzahl 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) → stringAdresse 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) → booleanEnthält die Kategorie oder die Gruppe diese Eigenschaft? Bietet die Listeneigenschaft diesen Wert an?

Ereignisse #

EventAusgelö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) → booleanAbbrechbar, 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 #

GesteWirkung
Pfeil auf / ab, Pos1 / Ende, Bild auf / Bild abBewegen die Auswahl von Zeile zu Zeile; Bild auf / Bild ab springen um die Höhe der Liste
Pfeil links / rechtsAuf 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
LeertasteSetzt oder entfernt das Häkchen eines Booleans; auf einer Kopfzeile oder einer Gruppe klappt es ein oder auf
Eingabe / Esc in einem EditorBestä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+EingabeDie Schaltfläche … der ausgewählten Zeile (ue_ellipsis_clicked)
TabDie 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 BeschriftungEin Boolean wechselt, eine Liste springt zur nächsten Wahl, eine Gruppe öffnet oder schließt sich
EntfAuf 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 ZeichentasteAuf 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 ZahlAddieren / subtrahieren id_step, innerhalb von is_min / is_max; jeder Schritt löst ue_value_changed aus
Trennlinie: links / rechts, Pos1 / EndeDie 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 EingabeLeert 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 #

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.

MitgliederRolleBeschrieben in
of_count · of_keys_at · of_hasDurchlaufen, was die Komponente enthält3.2 Die Items
of_resetDie Komponente zurücksetzen3.6 Eine Komponente zurücksetzen: of_reset()
of_register_shortcut · of_clear_shortcutsTastenkürzel der Komponente3.5 Tastenkombinationen
of_is_created · of_is_ready · of_get_last_errorOb sie entstanden ist, ob sie bereit ist, was fehlschlug3.7 Diagnose
of_save_as_png · of_save_as_jpgDie Darstellung als Bild exportieren3.8 Die Darstellung als Bild exportieren
of_set_redrawÄnderungen zu einem einzigen Neuzeichnen bündeln3.10 Best Practices
of_preload_iconsSymbole ohne VerzögerungSofortige Anzeige: of_icon
of_set_translationEine Beschriftung der Komponente übersetzen5.2 Eine Beschriftung anpassen: of_set_translation
of_focus_webviewDer Komponente den Fokus geben6.4 Tastatur und Fokus
of_print · of_print_to_pdfDrucken oder ein PDF schreiben6.9 Drucken
of_set_property · of_get_property · of_component_nameEine Eigenschaft über ihren Namen steuern3.1 Die Eigenschaften-Engine
is_accessible_name · is_accessible_descriptionName und Beschreibung, die ein Bildschirmleser sagt3.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.

← Komponentenreferenz · Inhalt des Handbuchs