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:

  1. Mit eindeutigen Namen, d.h. das Objekt hat einen eindeutigen Namen oder einen kompletten Pfad:

    Beispiele

    END_Button

    MyWindow.OKButton

  2. 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:

Abbildung 20-3: Referenzierungsmöglichkeiten

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.

Definition

<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.

Forward Referencing

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

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

.accelerator

object

Accelerator-Identifikator

key

.attribute

attribute

geändertes Attribut

changed

.count

integer

Anzahl der aufgetretenen Timer-Ereignisse

select in Timer

.event_code

anyvalue

Code des externen Ereignisses

extevent

.eventcount

integer

Anzahl der Ereignisse

allen Ereignissen

.event[EV]

boolean

true, wenn EV enthalten

allen Ereignissen

.event[I]

event

Typ des i-ten Ereignisses

allen Ereignissen

.index

integer

selektierter Eintrag

select, cut, paste
in Listbox, Poptext, Treeview

.index

index

selektiertes Feld

select, cut, paste
im Tablefield

.type

enum

Art der von der Drag&Drop-Operation betroffenen Objekts

paste

.value

anyvalue

Wert, der mit der Drag&Drop Operation verschoben wurde

paste

.x

integer

Maus X-Koordinate (Pixel)*

select in Fenster, Groupbox

.y

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].