Attribute
  • 13 May 2024
  • 5 Minutes to read
  • Dark
    Light
  • PDF

Attribute

  • Dark
    Light
  • PDF

The content is currently unavailable in English. You are viewing the default German version.
Article summary

Definition

Attribute beinhalten die internen Daten eines Datentyps sowie zusätzliche Eigenschaften die vom Programmierer selbst gesetzt werden können. Attribute sind immer durch einen Punkt von einer Variable getrennt und durch die erste Zuweisung definiert.

Format:

Objekt.Attribut = Wert

Während der Konfiguration werden alle Fragemodelle und Frageparameter als verschachtelte Attribute ausgehend vom Startmodell gespeichert. Das bedeutet des gesamte Inhalt der Konfiguration ist in einer einzigen Variablen gespeichert. Jeder Frageparameter ist also ein Attribut des Fragemodells, und ein Folgemodell ist auch ein Attribut des Fragemodells, von dem es aufgerufen wurde.

FmStart.Fp1

FmStart.Fp2

FmStart.Fp3

FmStart.FmFolge1

FmStart.FmFolge1.Fp1

FmStart.FmFolge1.Fp2

FmStart.FmFolge1.Fp3

FmStart.FmFolge1.FmFolge2

FmStart.FmFolge1.FmFolge2.Fp1

FmStart.FmFolge1.FmFolge2.Fp2

FmStart.FmFolge1.FmFolge2.Fp3

Der Name des Startmodells und der Name des Attributes für das Folgemodell kann jedoch mit der Systemvariable MASKATTRNAME überschrieben werden. Für das Startmodell erfolgt dies im Makroblock des Warenstammes:

MASKATTRNAME = "Rahmen"

Für Folgemodelle erfolgt dies im Übergabemakro des aufrufenden Frageparameters:

MASKATTRNAME = "Fluegel"

Vergleichen von Attributen

Die bestehenden Vergleichsoperatoren arbeiten weiterhin mit dem Wert der Variablen. Wenn man den Wert von allen Attributen zweier Variablen vergleichen möchte, kann man durch alle Attribute iterieren oder diese einzeln miteinander vergleichen:

! -------------------------------
! Vergleichen von Attributen
! -------------------------------

NR1K = "Einteiliges Fenster"

NR1K.Breite = 1500
NR1K.Hoehe = 2500
NR1K.Farbe = "W"

! Exakte Kopie der Variable erzeugen
ASSIGN NR1K_Kopie = NR1K

! Attributvergleich
IF NR1K_Kopie.ATTRIBUTES = NR1K.ATTRIBUTES THEN BEGIN

Modified = FALSE

END
ELSE BEGIN

Modified = TRUE

ENDIF

! Zu diesem Zeitpunkt ist Modified = FALSE

! Leichte Veränderung von NR1K_Kopie
NR1K_Kopie.Breite = NR1K_Kopie.Breite + 1

! Erneuter Attributvergleich
IF NR1K_Kopie.ATTRIBUTES = NR1K.ATTRIBUTES THEN BEGIN

Modified = FALSE

END
ELSE BEGIN

Modified = TRUE

ENDIF
! Modified ist jetzt TRUE

Diese Technik kann verwendet werden, um Änderungen in den Attributen sofort zu entdecken. Gerade in der Modellverarbeitung wenn sehr viele kleine Makros irgendeinen Attributwert ändern können, ist dieser Massenvergleich von Attributen vorteilhaft. Um genau zu ermitteln, welches Attribut genau geändert wurde, muss man durch die Attribute iterieren.

Diese Operatoren vergleichen nur die unmittelbaren Attribute, d.h. Änderungen in verschachtelten Attributen werden nicht berücksichtigt.

Collection Attributes

Wie in den letzten Abschnitten ersichtlich, kann man einer Variablen beliebig viele Attribute zuweisen. Das virtuelle Attribut Attributes schafft Abhilfe zu Anzahl und Namen der dynamischen Attribute einer Variablen. Attributes stellt die Attribute einer Variable als Container (oder Collection) zur Verfügung und bietet eine zusätzliche Möglichkeit, auf die dynamischen Attribute zuzugreifen. Im folgenden Beispiel sind die Zuweisungen gleichgültig:

! ------------------------------- ! Verwendung von Attributes ! -------------------------------

! Hinweis: Die Variablen Breite und Hoehe wurden zu ! diesem Zeitpunkt noch nicht definiert

Breite = 1500
Hoehe = 2500

Breite.Visible = TRUE
Breite.ATTRIBUTES("Visible") = TRUE

Breite.Enabled = FALSE
Breite.ATTRIBUTES("Enabled") = FALSE

Hoehe.Visible = TRUE
Hoehe.ATTRIBUTES(1) = TRUE

Hoehe.Enabled = FALSE
Hoehe.ATTRIBUTES(2) = FALSE
! Anzahl der Attribute von "Breite" ausgeben
MESSAGE "Breite hat ",Breite.ATTRIBUTES.COUNT," Attribute"

! Das Ergebnis ist: ! "Breite hat 2 Attribute"

Auf die dynamischen Attribute kann man entweder mit dem Namen a) oder mit dem Index b) zugreifen. Der Index gibt die Reihenfolge an, in welcher das Attribut erstellt wurde. Umreihung von Attributen ist nicht möglich. Attributes bietet selbst ein virtuelles Attribut Count, wie das letzte Beispiel zeigt, mit welcher die Anzahl der Attribute ermittelt werden kann.

Die virtuellen Attribute Name, Value und Attributes selbst, zählen nicht bei der Verwendung von Count, d.h. Count liefert 0 zurück, wenn eine Variable keine Attribute besitzt:

! ------------------------------- ! Verwendung von Count ! -------------------------------

! Hinweis: Die Variablen Breite und Hoehe wurden zu ! diesem Zeitpunkt noch nicht definiert

Breite = 1500
Hoehe = 2500

Breite.Visible = TRUE
Breite.Enabled = FALSE

! Anzahl der Attribute von "Breite" und "Hoehe" ausgeben
MESSAGE "Breite hat",Breite.ATTRIBUTES.COUNT,"Attribute"
MESSAGE "Hoehe hat",Hoehe.ATTRIBUTES.COUNT,"Attribute"

! Das Ergebnis ist: ! "Breite hat 2 Attribute" ! "Hoehe hat 0 Attribute"

Es gibt 2 Hauptbereiche, in welchen die Verwendung von Attributes unentbehrlich ist. Der erste ist, wenn man durch die dynamischen Attributes iterieren möchte und die Namen nicht kennt:

! ------------------------------- ! Iteration durch alle Attribute ! -------------------------------

! Hinweis: Die Variable Breite wurde zu ! diesem Zeitpunkt noch nicht definiert

Breite = 1500

Breite.Visible = TRUE
Breite.Attributes("Visible") = TRUE

Breite.Enabled = FALSE
Breite.Attributes("Enabled") = FALSE

! Iteration
FOR i = 1 TO Breite.ATTRIBUTES.COUNT DO BEGIN

MESSAGE "Attribut ",i," mit Namen <",Breite.ATTRIBUTES(i).NAME,
"> ist gleich ",Breite.ATTRIBUTES(i)

END

! Das Ergebnis ist: ! Attribut 1 mit Namen <Visible> ist gleich 1 ! Attribut 2 mit Namen <Enabled> ist gleich 0 ! Bei der FOR-Iteration wurde der Name der Attribute zur Laufzeit ermittelt.

Der zweite Einsatzbereich von ATTRIBUTES ist, wenn man erst zur Laufzeit den Attributnamen kennt. In diesem Fall entscheidet man zur Laufzeit, welches Attribut verwendet werden soll:

! ------------------------------- ! Auswahl der Attribute zur Laufzeit ! -------------------------------

NR1K = "Einteiliges Fenster"
NR1K.Stock = "ST"
NR1K.Breite = 1500
NR1K.Hoehe = 2500

! Attribut zur Laufzeit ermitteln
AttributName = "Hoehe"

MESSAGE AttributName," hat einen Wert von ",NR1K.ATTRIBUTES(AttributName)

! Das Ergebnis ist: ! "Hoehe hat einen Wert von 2500"
Diese Methode ist eleganter als die auch gültige Verwendung von EVAL:

! Alles wie oben
MESSAGE AttributName," hat einen Wert von ",EVAL("NR1K." + AttributName)

Sondieren von Attributen

Das Sondieren von Attributen (auch Reflektion benannt), ermöglicht das Auflisten von allen Attributen einer Variable. Wenn man die Iterationsroutine zusätzlich rekursiv macht, dann kann man alle Attribute in allen Verschachtelungsebenen ausgeben. Die Sondierung von Attribute kann hervorragend für Debugzwecke verwendet werden.

! ------------------------------- ! Sondierungsprozedur ! -------------------------------

PROCEDURE ShowAttributes

DEFINE PARAMETER INPUTOUTPUT poObject

DEFINE VARIABLE i !Iterationsvariable

i = 0

! Iteration durch alle dynamische Attribute

FOR i = 1 TO poObject.ATTRIBUTES.COUNT DO BEGIN

! Attributname und –Wert anzeigen

MESSAGE poObject.ATTRIBUTES(i).Name," = ",poObject.ATTRIBUTES(i).VALUE

! Sind Attribute verschachtelt?

IF poObject.ATTRIBUTES(i).ATTRIBUTES.COUNT >0 THEN BEGIN

RUN ShowAttributes(poObject.Attributes(i))

ENDIF

END

END

Virtuelle Attribute

Ein virtuelles Attribut ist eines, das nicht wirklich existiert, sondern immer zur Laufzeit berechnet wird. Normalerweise, wie in unserem Fall, sind die virtuellen Attribute read-only und müssen nicht explizit deklariert werden. Jede Variable besitzt 2 virtuelle Attribute: VALUE und NAME.

VALUE enthält den Wert der Variable und mit Name erhält man den Variablennamen, wie folgendes Beispiel zeigt:

! ------------------------------- ! .Value und .Name ! -------------------------------

Breite = 1500
MESSAGE "Der Wert von ",Breite.NAME," ist ",Breite.VALUE
! Der Text der Message lautet: "Der Wert von Breite ist 1500"

Dieses Beispiel ist trivial, weil der Name der Variable im Quelltext bereits bekannt ist. Attribute selber haben auch Name und Value.

Zerstörung von Attributen

Attribute reagieren wie Variablen hinsichtlich der Zerstörung und werden daher auch mit dem Befehl DELETE entfernt:

NR1K = "Einteiliges Fenster"

NR1K.Breite = 1500
NR1K.Hoehe = 2500
NR1K.Farbe = "W"

!Einzeln Attribute zerstören
DELETE NR1K.Breite
DELETE NR1K.ATTRIBUTES("Hoehe")
DELETE NR1K.ATTRIBUTES(1) ! Farbe wird entfernt

!Alle Attribute zerstören – Iteration

FOR i = 1 TO NR1K.ATTRIBUTES.COUNT DO BEGIN

DELETE NR1K.ATTRIBUTES(1)

END

Selbstverständlich werden alle Attribute entfernt, wenn die Variable selbst gelöscht wird.

Schnellzugriff auf Strukturvariablen

Syntax:

WITH stucVar DO BEGIN

Attributname = 3

END

Beispiel für Referenzen und Schnellzugriffe:

myAdress = ""

myAdress.FullName = ""

myAdress.FullName.PreName = ""

myAdress.FullName.SurName = ""

Ptr = REF myAdress.FullName

Ptr.PreName = "Charly"

Ptr.SurName = "Brown"

WITH myAdress DO BEGIN

MESSAGE .FullName.PreName !Charly

MESSAGE .FullName.SurName !Brown

END


Was this article helpful?