Akcia ON CHANGE


Deklarácia
ON CHANGE ident GOTO procName [NONE]
Parametre
identinIdentifikátor hodnoty (alebo skupiny hodnôt).
procNameinMeno procedúry.
Popis
Akcia špecifikuje procedúru (prostredníctvom mena procName), ktorá bude zavolaná, ak nastane zmena hodnoty ident (alebo niektorej zo skupiny hodnôt). Parameter ident môže byť meno objektu alebo premennej (premenná nesmie byť deklarovaná v kontexte procedúry)
Napríklad:


Skupina hodnôt predstavuje riadok, stĺpec alebo celý objekt typu Štruktúrovaná premenná.
Napríklad:

  • identifikátor druhého riadku - SV.Struktura[2] (nie je uvedené meno stĺpca)
  • identifikátor stĺpca Int - SV.Struktura[0]^Int (index riadku je 0)
  • identifikátor všetkých hodnôt (celej štruktúry) - SV.Struktura alebo SV.Struktura[0] (index riadku je 0).


Sledovanú hodnotu je možné identifikovať aj prostredníctvom výrazu typu HOBJ alebo VOBJ.
V lokálna premenná nesmie byť štruktúrovaná ani typu ALIAS.


Napríklad:

 INT _hbj
 ...
 ON CHANGE (_hbj) GOTO ValueChanged 

Po vykonaní akcie, napríklad:
 ON CHANGE Sec GOTO ValueChanged 
bude procedúra s menom ValueChanged zavolaná vždy, keď príde k zmene hodnoty objektu Sec (t.j. každú sekundu).

Ak sa v rámci skriptu vykoná akcia:
 ON CHANGE Sec GOTO ValueChanged NONE 
bude volanie procedúry ValueChanged pri zmene hodnoty objektu Sec ukončené.

V zápise akcie je možné uviesť aj položku štruktúry:
 ON CHANGE SV.Struktura[2]^Int GOTO ValueChanged 

Na zmenu jednej hodnoty je možné reagovať aj na viacerých procedúrach:
 ON CHANGE Sec GOTO ValueChanged
 ON CHANGE Sec GOTO ValueChanged1 

V tomto prípade budú pri zmene objektu Sec postupne volané procedúry ValueChanged a ValueChanged1.


Na zmenu hodnoty lokálnej premennej:

 ON CHANGE _locVar GOTO LocalValueChanged


Procedúra, ktorá je volaná na základe zmeny hodnoty objektu musí byť deklarovaná nasledovne:

 PROCEDURE ProcName(typHodnoty _hodnota, ALIAS _odkazNaObjekt, INT _riadok, INT _stlpec) 

Procedúra, ktorá je volaná na základe zmeny hodnoty lokálnej premennej musí byť deklarovaná nasledovne:

 PROCEDURE LocalValueChanged(typHodnoty _hodnota, IN INT _locVarId) 

Kde:
ProcNameMeno procedúry, ktoré vyhovuje obmedzeniam pre meno procedúry.
typ_hodnotyTyp hodnoty parametra _hodnota. Ak je typ nevhodne zvolený (vzhľadom na zmenenú hodnotu), parameter bude nadobúdať neplatnú hodnotu.
_hodnotaParameter, ktorý bude po štarte procedúry naplnený novou hodnotou sledovaného objektu (alebo položky pri sledovaní zmeny položky štruktúry).
_odkazNaObjektParameter typu ALIAS. Po štarte procedúry je inicializovaný tak, aby sa odkazoval na objekt, ktorý zmenil hodnotu (ak je sledovaná položka štruktúry, tak ALIAS sa odkazuje na celú štruktúru nie na položku).
_riadok, _stlpecParametre typu INT. Majú význam len ak bola procedúra zavolaná z dôvodu zmeny hodnoty políčka štruktúrovanej premennej. Ináč sú vždy nastavené na hodnotu 0. V prípade zmeny hodnoty políčka parameter _riadok obsahuje poradové číslo riadku a parameter _stlpec obsahuje poradové číslo stĺpca v rámci hodnoty príslušnej štruktúrovanej premennej.
_locVarIdID lokálnej premennej. Získať ID lokálnej premennej je možné prostredníctvom atribútu \HBJ

Akcia je použiteľná len v rámci skriptu Aktívnej schémy alebo objektu typu Event s aktívnou voľbou Server Event.


Príklad
Príklad skriptu v rámci aktívnej schémy, ktorý sleduje a operátorovi na ploche procesu D2000 HI oznamuje zmeny hodnôt:
  • objektu Sec
  • položky SV.Struktura^Int
  • ľubovoľného políčka v stĺpci Int (t.j. SV.Struktura[0]^Int).
 INT _sec

 PROCEDURE LocalValueChanged(typHodnoty _hodnota, IN INT _locVarId)
   IF _locVarId = _sec\HBJ THEN
     ; zmenila sa hodnota premennej _sec
   ENDIF
 END LocalValueChanged

 ; Obsluha zmien hodnôt
 PROCEDURE ValueChanged(REAL _value, ALIAS _obj, INT _row, INT _col)
   ; zmenila sa hodnota objektu Sec ?
   IF _obj\HBJ = Sec\HBJ THEN
     MESSAGE "Zmenil sa objekt Sec = " + %IToStr(_value) ON  _FROM_HIP
     _sec := _value
   ; zmenila sa hodnota objektu SV.Struktura ?
   ELSIF _obj\HBJ = SV.Struktura\HBJ THEN
     IF _row = 1 & _col = 1 THEN
       MESSAGE "Zmenil sa SV.Struktura^Int = " + %IToStr(_value) ON _FROM_HIP
     ELSE
       MESSAGE "V stlpci SV.Struktura[0]^Int sa zmenil riadok = " + %IToStr(_row) ON _FROM_HIP
     ENDIF
   ENDIF
 END ValueChanged
 
 ; Inicializačná časť
 BEGIN
   ON CHANGE Sec GOTO ValueChanged
   ON CHANGE SV.Struktura^Int GOTO ValueChanged
   ON CHANGE SV.Struktura[0]^Int GOTO ValueChanged
   ON CHANGE _sec GOTO LocalValueChanged
 END 

Súvisiace stránky:

1 komentár

  1. Anonymný

    Konečne implementované detekcie zmien lokálnych prmeenných aj mimo javy. Ďakujem. PS: Ešte som neotestoval.

Nie ste prihlásený. Akékoľvek zmeny, ktoré vykonáte, sa označia ako anonymné. Ak už máte svoj účet, pravdepodobne sa budete chcieť prihlásiť .