- 13 May 2024
- 5 Minutes to read
- Print
- DarkLight
- PDF
Attribute
- Updated on 13 May 2024
- 5 Minutes to read
- Print
- DarkLight
- PDF
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