5 Spezielle Objekte und Objektreferenzierung
In den folgenden Kapiteln finden Sie die Beschreibung wie Objekte im Inneren der Regeln referenziert werden können. Zusätzlich werden in den nachfolgenden Kapiteln zwei spezielle Objekte vorgestellt, die den Zugriff auf Objekte wesentlich erleichtern.
5.1 this
In dem in jeder Regel verfügbaren this-Objekt ist immer das aktuelle Objekt abgespeichert, das die Regelverarbeitung ausgelöst hat. Damit können zum Beispiel Regeln an Modelle gebunden werden, die aber nur auf die aktuelle Instanz des Modells wirken. Daher werden im Normalfall alle an Modellen definierten Regeln über das this auf das aktuelle Objekt zugreifen und von dort aus die entsprechenden Aktionen einleiten. Nur in den seltensten Fällen wird man in den Regeln direkt auf das Modell zugreifen wollen und dort Änderungen vornehmen wollen.
Beispiel
Es ist ein Modell eines Pushbuttons wie folgt definiert:
model pushbutton OK {}
In einer Regel soll auf das zugehörige Fenster zugegriffen werden. Das sieht dann wie folgt aus:
!! Regel ist am Modell definiert
on OK select
{
!! Regel greift über die Instanz auf das
!! zugehörige Fenster zu
this.window.visible := false;
}
Würde die Regel über den Objektnamen zugreifen, wäre die Reaktion undefiniert, da in der Regel die Instanzen einzeln sichtbar gemacht werden und sie daher die Sichtbarkeit nicht mehr vom Modell erben.
5.2 Objektreferenzierung
Es gibt zwei Arten, Objekte zu referenzieren:
-
Mit eindeutigen Namen, d.h. das Objekt hat einen eindeutigen Namen oder einen kompletten Pfad:
Beispiele
END_Button
MyWindow.OKButton
-
Durch Spezifikation des Vaters, d.h. durch Inbeziehungsetzen des Objektes bzw. des Vaters und der Kinder:
Beispiele
-
Object.parent
adressiert den Vater des Objektes.
-
Object.window
adressiert das Fenster, in das das Objekt positioniert wurde.
-
Object.groupbox
adressiert die Groupbox, in die das Objekt positioniert wurde.
-
Die oben beschriebenen zwei Möglichkeiten der Objektreferenzierung können in dem Ereignis, der (Vor-)Bedingung und den Aktionszeilen verwendet werden, d.h. auf ein Objekt kann mit einem eindeutigen Namen oder über Beziehungen ("relations") Bezug genommen werden.
Der Begriff Relation ("Verwandtschaftsbeziehung") fasst die Referenzierungsmöglichkeiten der Objekte untereinander zusammen.
Folgende Schlüsselworte stehen zur Bildung einer Relation zur Verfügung:
-
Setzt das "i"-te Kind eines Objektes (Fenster, Groupbox, Menübox).
-
Setzt das erste Kind eines Objektes.
-
Bezeichnet das erste Menü eines Objektes.
-
Bezeichnet die Groupbox, in der das Objekt liegt.
-
Setzt das letzte Kind eines Objektes.
-
Bezeichnet das letzte Menü eines Objektes.
-
Erfragt das "i"-te Kind der Menühierarchie eines Objektes.
-
Bezeichnet den Vater des Objektes.
-
Bezieht sich auf das Objekt, das das anstehende Ereignis ausgelöst hat.
-
Bezeichnet das nächste in der Hierarchie oberhalb (Richtung Vater) liegende Fenster.
Um auf ein bestimmtes Objekt in der Hierarchie zuzugreifen, können einige der oben genannten Schlüsselworte zusammengefügt werden. Am Ende einer solchen Referenzaktion können die Attribute des so gefundenen Objektes spezifiziert werden.
<Objekt>::=
<Objektpfad>{<Relation>}[<Attribut>]
<Objektpfad>::=
<Objektidentifikator>{.<Objektidentifikator>}|
<Variable>|
this
Beispiel
{
MainWindow.ytop := this.window.ytop + this.window.height;
}
Das Fenster "MainWindow" wird hier an die untere Kante des Fensters positioniert, in dem das Objekt this liegt.
Anmerkung
Die Verwendung der Relations ist nur dann angebracht, wenn die Beziehungen der Objekte zueinander im Wesentlichen bekannt sind.
Werden dynamische Objekte erzeugt, so ist diese Art der Objektreferenzierung oft der beste Weg, ein Objekt zu bezeichnen.
Neben der Referenzierung für bereits definierte Objekte, können an bestimmten Stellen Objekte auch erst nach der Referenzierung definiert werden, und zwar
5.3 null-Objekt
Es gibt ein Objekt mit einem speziellen Identifikator, mit dessen Hilfe das Zurücksetzen von Ressource-Attributen ermöglicht wird. Dieses Objekt wird null-Objekt genannt und hat die Dialog Manager ID null.
Dieses null-Objekt kann dazu benutzt werden, alle Ressource-Attribute zurückzusetzen. Es kann bei Zuweisungen auf alle Objekt-Attribute benutzt werden.
Implikationen
-
object.bgc := null;
Entfernt die Farbe an dem Objekt.
-
object.text := null;
Eliminiert den Text des Objekts.
-
Definition:
default pushbutton
{
}
model pushbutton PBM
{
.fgc RED;
}
pushbutton PB1
{
}
pushbutton PB2
{
.model PBM;
}
pushbutton PB3
{
.model PBM;
.fgc null;
}
Bei dieser Definition haben die Pushbuttons PB1 und PB3 keine Farbe, PB2 hat die Vordergrundfarbe RED.
Die Zuweisung verbietet explizit, dass Pushbutton PB3 die Farbe seines Modells erbt.
5.4 Ereignisobjekt thisevent
Neben den anderen speziellen Objekten setup und this gibt es noch das spezielle Objekt thisevent.
Mit Hilfe des Schlüsselwortes thisevent können Informationen zum aufgetretenen Ereignis erhalten werden. Es liefert das (virtuelle) Ereignis, das verschiedene Attribute besitzt. Diese Attribute können ausgelesen werden.
Attribute des Ereignisobjektes thisevent
Attribut |
Typ |
Bedeutung |
Gültig bei |
---|---|---|---|
object |
Accelerator-Identifikator |
key |
|
attribute |
geändertes Attribut |
changed |
|
integer |
Anzahl der aufgetretenen Timer-Ereignisse |
select in Timer |
|
anyvalue |
Code des externen Ereignisses |
extevent |
|
integer |
Anzahl der Ereignisse |
allen Ereignissen |
|
boolean |
true, wenn EV enthalten |
allen Ereignissen |
|
event |
Typ des i-ten Ereignisses |
allen Ereignissen |
|
integer |
selektierter Eintrag |
select, cut, paste |
|
index |
selektiertes Feld |
select, cut, paste |
|
enum |
Art der von der Drag&Drop-Operation betroffenen Objekts |
paste |
|
anyvalue |
Wert, der mit der Drag&Drop Operation verschoben wurde |
paste |
|
integer |
Maus X-Koordinate (Pixel)* |
select in Fenster, Groupbox |
|
integer |
Maus Y-Koordinate (Pixel)* |
select in Fenster, Groupbox |
* Die Mauskoordinaten sind nur bei den Objekten Fenster und Groupbox verfügbar und relativ zum Objekt, auf das sich das Ereignis bezieht.
Ist ein Attribut ungültig, so enthält es void-Data. Dies kann mit der Builtin-Funktion typeof ermittelt werden.
Eine Regel kann von mehreren Ereignissen gleichzeitig ausgelöst werden. Alle diese Ereignisse sind im (indizierten) Attribut .event[ ] enthalten.
Mit .eventcount kann die Anzahl der Ereignisse ermittelt werden.
Wird .event mit einem Integerwert indiziert, erhält man ein gleichzeitig aufgetretenes Ereignis.
Wird .event mit einem Wert vom Typ event indiziert, ist das Ergebnis vom Typ boolean mit dem Wert true, falls das Index-Ereignis eines der aufgetretenen Ereignisse ist.
Als EV kann jegliches Ereignis eingetragen werden, so kann z.B. erfragt werden, ob ein spezielles Ereignis vorliegt, z.B. .event[select].