Auf einen Schreibzugriff des Benutzers reagieren
Beispielmodul: helloedit.
Zwei Einstellungen steuern, was passiert, wenn ein Client einen Wert auf ein Element schreibt:
directedit(pro Element, Standardfalse): wennfalse, wird einSV-Versand (Schreiben eines einzelnen Elements) auf dieses Element abgelehnt — nur einSA-Versand (gruppiertes Schreiben der gesamten Property) kann es ändern.autoupdate(pro Element und pro Property, Standardtrueauf Property-Ebene,falseauf Element-Ebene): wenn das Element oder seine Propertyautoupdate:truehat, wendet das Framework den geschriebenen Wert selbst auf den Datastore an, noch bevor das Modul davon informiert wird.
"hello": {
"permission": 2,
"devcat": "", "group": "",
"autoupdate": false,
"e": {
"autoname": {
"type": "string", "directedit": true, "autoupdate": true
},
"manualname": {
"type": "string", "directedit": true, "autoupdate": false
}
}
}Mit dieser Deklaration wird ein Schreibzugriff auf autoname sofort reflektiert, ohne jeglichen Code: das Framework wendet den Wert von sich aus an.
Wenn die Property selbst autoupdate nicht setzt (oder auf true setzt), bleibt sie bei ihrem Standard true — und ein Element mit autoupdate:false wird trotzdem automatisch angewendet, weil élément.autoupdate() || propriété.autoupdate() bereits true ergibt, sobald eines der beiden es ist. Damit ein Element der automatischen Anwendung wirklich entgeht, muss auch seine Property explizit autoupdate:false haben, wie oben.
Einen nicht automatisch angewendeten Wert extrahieren
Für manualname (Element und Property beide autoupdate:false) wird nichts automatisch angewendet: onExternalEvent() muss den vom Client geschriebenen Rohwert selbst extrahieren und ihn anschließend anwenden (gegebenenfalls nach einer Transformation):
void HelloEdit::onExternalEvent(OST::ExtEvent event)
{
// autoname : rien à faire, déjà appliqué par le framework.
if (event.ev == OST::ExtEvType::SV && event.prpkey == "hello" && event.eltkey == "manualname")
{
QJsonObject o = event.data["m"].toObject()[getModuleName()].toObject();
QJsonObject e = o["p"].toObject()["hello"].toObject()["e"].toObject();
QString written = e["manualname"].toVariant().toString();
getEltString("hello", "manualname")->setValue(written.toUpper(), true);
}
}Einen Wert aus dem Code des Moduls heraus zu ändern (getEltXxx(...)->setValue(..., true)) durchläuft nie die Permission-/directedit-Kontrollen: diese gelten nur für Schreibzugriffe vom Client. Das erlaubt es hier, den Wert zu transformieren (Umwandlung in Großbuchstaben), bevor er tatsächlich angewendet wird.
Katalog der Zugriffsmethoden
Zwei Familien, je nachdem, ob man das Element selbst will (um setValue(), disable()… aufzurufen) oder nur seinen Wert:
| Typ | getElt...() | direkter Wert |
|---|---|---|
| string | getEltString() | getString() |
| int | getEltInt() | getInt() |
| float | getEltFloat() | getFloat() |
| bool | getEltBool() | getBool() |
| date | getEltDate() | getDate() |
| time | getEltTime() | getTime() |
| light | getEltLight() | — |
| image | getEltImg() | — |
| Video | getEltVideo() | — |
| Fortschritt | getEltPrg() | — |
Alle nehmen (propriété, élément). Die direkten Wert-Zugriffsmethoden (getString/getInt/getFloat/getBool/getDate/getTime) haben eine Überladung (propriété, élément, ligne), um eine bestimmte Zeile eines Grids zu lesen — siehe Die Grids.