Statusvariablen beim Erzeugen mit Wert initialisieren

Hallo,

kleine Nachfrage.
Ich lege im Create Bereich Statusvariablen an.
$this->RegisterVariableInteger(„…“,„…“,„…“);

Ebenfalls im Create Bereich belege ich die Variablen mit sinnvollen Startwerten.
$this->SetValue(„…“, …);

Diese Einträge findet man nun auch im Objektbaum unter dem selbst erstellten Modul. Alles gut soweit. Nur, wenn ich Symcon oder den Server nun neu starte, dann werden vom Benutzer im Objektbau geänderten Variablen leider wieder mit den Standardwerten überschrieben.

Wie macht man es geschickt, dass nur beim ersten Anlegen Startwerte gesetzt werden, aber später vom Nutzer geänderte Werte in vorhandenen Variablen im Objektbaum nicht wieder überschrieben werden?

Sollte man über GetValue zuvor auslesen ob die Variable schon belegt ist? Oder wie stellt man das geschickt an?

Ich persönlich lasse sie einfach ohne Wert.
Der kommt ja meistens nachdem irgendwas in applychanges passiert ist bzw Werte verarbeitet wurden.
Aber du kannst natürlich vorher mit GetIdByIdent prüfen ob die Variable schon existiert hat.
Oder… Gleich auf IPSModuleStrict wechseln.
Da liefert dir RegisterVariableXYZ einen bool für neu angelegt oder vorhanden.
Michael

Danke für die Info.
Meinst du GetIDForIdent ? Die soll laut Dokumentaion eine Fehlermeldung zurückgeben, wenn die Variable nicht exitiert. Das wäre nicht unbedingt gut.
Zu IPSModuleStrict oder IPS_ModuleStrict finde ich nichts in der Dokumentation. Gibt da nähere Infos zu?

Nachtrag: GetIDForIdent liefert die ID sonst false. Erst eine Fehlermeldung, wenn wenn der Ident nicht vorhanden ist. Damit kann ich dann den Inhalt auslesen und auf Inhalt prüfen. Das sollte gehen. Dachte nur, dass es vielleicht einen einfacheren Weg gibt. Dann scheint dies wohl der übliche Weg zu sein?

Nachdem ich das nun versucht habe in meinem Code einzubauen stelle ich fest, dass ich ja gar nicht den Umweg über GetIDForIdent gehen muss. Ich kann ja direkt via $this->GetValue(„…“) den inhalt auslesen und auf Inhalt prüfen. Problematisch ist es nur, wenn ich den Inhalt eines Boolean Objekte prüfen muss. Da kann ich im Grunde nur gegen den Standardwert prüfen.

Ja.

Welche man mit @ unterdrücken kann.

Ja, aber hier im Forum:

Warum willst du den Inhalt auslesen?
Wenn GetIDForIdent ein false gibt, dann kannst du nach dem RegisterVariableXYZ den Wert setzen.
Wenn GetIDForIdent ein Integer liefert, dann halt nicht.

Darum gibt es ja GetIDForIdent…
Michael

Hmm, so richtig funktioniert das auch nicht. Wenn ich die Variablen auf Inhalt prüfe wie:
Ungleich der erstmaligen im Modul gesetzten Standards
oder auf 0 bei Integer bzw. Float bzw. Leerstring bzw. False bei Boolean
dann könnte der Nutzer keine dieser Werte mehr setzen ohne, dass diese überschrieben werden.

Im Grunde komme ich offensichtlich nicht drum herum irgendwie herauszufinden, ob die Variablen im Objektbaum schon angelegt wurden oder nicht. Wenn da bisher keine Möglichkeit gibt, wird es denn mit IPSModuleStrict möglich sein?

Keine Ahnung was du überhaupt vor hast.
Sie einmalig setzen wenn sie erzeugt wird?
Oder was genau?
Das hier klappt auf jeden Fall:

<?

class Test extends IPSModule
{
    public function ApplyChanges(): void
    {
        $isValid = @$this->GetIDForIdent('Test');
        $this->RegisterVariableString('Test', 'Test');
        if (!$isValid){
            $this->SetValue('Test','NEU');
        }
    }
}

Oder halt

<?

class Test extends IPSModuleStrict
{
    public function ApplyChanges(): void
    {
        if ($this->RegisterVariableString('Test', 'Test')) {
            $this->SetValue('Test','NEU');
        }
    }
}

Michael

Hab es nun hinbekommen:

// Wenn die Variable Integer ist, dann gibt es sie sonst bei Boolean wird ein False gemeldet
if ( is_int( $this->GetIDForIdent("...") ) ) {
	// Ist ObjektID, dann gibt es sie schon
	// Dann nichts weiter machen, da der Nutzer evtl. schon Werte definiert hat
} else {
	// Variable muss angelegt werden ggf. mit Standardwerten
	$this->RegisterVariableBoolean("...","....", "...");
	$this->SetValue("...", ...);
}

Danke dir für den Hinweis mit GetIDForIdent. Das hat es am Ende gebracht.