Sie können 4D Programmiersprache Objekte mit der Objektnotation verwalten, um deren Werte zu erhalten oder zu setzen. Zur Wahrung der Kompatibilität müssen Sie explizit eine Option zur Kompatibilität aktivieren. Dann können Sie dieses Feature überall in 4D verwenden, wo Ausdrücke erwartet werden.
Jeder Eigenschaftswert, auf den über Objektnotation zugegriffen wird, wird als ein Ausdruck gewertet. Ist Objektnotation in Ihrer Anwendung aktiviert (siehe unten), können Sie solche Werte überall verwenden, wo 4D Ausdrücke erwartet werden:
In 4D Code, entweder in den Methoden (Methodeneditor) oder extern geschrieben (Formeln, Dateien mit 4D Tags, die mit PROCESS 4D TAGS oder dem Web Server bearbeitet werden, Exportdateien, 4D Write Pro Dokumente...),
In den Bereichen Ausdruck des Debugger und des Runtime Explorer,
In der Eigenschaftenliste des Formulareditors für Formularobjekte: Felder vom Typ Variable oder Ausdruck, sowie verschiedene Auswahl Listboxen und Spalten Ausdrücke (Datenquelle, Hintergrundfarbe, Stil oder Schriftfarbe).
Über Objektnotation verwaltete Objekte müssen initialisiert sein, z.B. über die Funktion New object. Sonst wird beim Lesen oder Ändern ihrer Eigenschaften ein Syntaxfehler erzeugt.
Beispiele:
C_OBJECT($obVar) //Ein Objekt vom Typ 4D Variable erstellen. $obVar:=New object//Objekt initialisieren und der 4D Variablen zuweisen.
Das gleiche Prinzip gilt für Felder vom Typ Objekt:
CREATE RECORD([Person]) //Einen neuen Datensatz mit einem Objektfeld in der Tabelle hinzufügen. [Person]Data_o:=New object//Objekt initialisieren und dem 4D Feld zuweisen.
Objektnotation bietet zwei Wege, um auf Objekteigenschaften zuzugreifen:
Über das Zeichen "Punkt":
object.propertyName
Beispiel:
employee.name:="Smith"
Über eine Zeichenkette in eckigen Klammern:
object["propertyName"]
Beispiel:
$vName:=employee["name"]
Da der Wert einer Objekteigenschaft ein Objekt oder eine Collection sein kann, akzeptiert Objektnotation eine Folge von Symbolen, um auf Untereigenschaften zuzugreifen, wie zum Beispiel:
$vAge:=employee.children[2].age
Objektnotation ist in allen Elementen der Programmiersprache verfügbar, die ein Objekt enthalten oder zurückgeben, wie z.B.:
Die Objekte selbst (gespeichert in Variablen, Feldern, Objekteigenschaften, Objekt Arrays oder Collection Elemente). Beispiele:
$age:=$myObjVar.employee.age //Variable $addr:=[Emp]data_obj.address //Feld $city:=$addr.city //Eigenschaft eines Objekts $pop:=$aObjCountries{2}.population //Objekt Array $val:=$myCollection[3].subvalue //Collection Element
4D Befehle, die Objekte zurückgeben. Beispiel:
$measures:=Get database measures.DB.tables
Projektmethoden, die Objekte zurückgeben. Beispiel:
Um auf ein Collection Element zuzugreifen, müssen Sie eine Elementnummer in eckigen Klammern übergeben:
collectionName[expression]
Hinweis: Weitere Informationen dazu finden Sie unter Collection auf developer.4d.com.
Sie können jeden gültigen 4D Ausdruck übergeben, der im Parameter Ausdruck eine positive Ganzzahl übergibt. Beispiele:
myCollection[5] //auf das 6. Element der Collection zugreifen
myCollection[$var]
Hinweis: Beachten Sie, dass Collection Elemente ab 0 nummeriert werden.
Über die Objektnotation können Sie einem Collection Element einen Wert zuweisen:
myCol[10]:="My new element"
Geht die Elementnummer über das letzte existierende Element der Collection hinaus, wird die Collection automatisch angepasst und alle dazwischenliegenden Elemente erhalten den Wert null:
Die Eigenschaft length ist automatisch für alle Collection verfügbar und gibt die Größe der Collection zurück, z.B. die Anzahl der enthaltenen Elemente. Es gibt zwei Wege, um auf diese Eigenschaft zuzugreifen:
Über das Zeichen "Punkt", z.B.:
$vSize:=myCollection.length
Über eine Zeichenkette in eckigen Klammern, z.B.:
$vSize:=myCollection["length"]
Beachten Sie, dass sich die Eigenschaft length nur lesen lässt, sie kann nicht verändert werden.
Werte von Eigenschaften sind über Zeiger zugänglich. Die Objektnotation mit Zeigern ist ähnlich wie die Objektnotation direkt mit Objekten, der Unterschied ist Weglassen des Zeichens "Punkt".
Die Objektnotation unterstützt über die Funktion Null den Nullwert. Damit können Sie Objekteigenschaften oder Collection Elementen den Nullwert zuweisen oder vergleichen, zum Beispiel:
myObject.address.zip:=Null If(myColl[2]=Null)
Weitere Informationen dazu finden Sie unter der Funktion Null.
Das Bewerten einer Objekteigenschaft kann manchmal einen undefinierten Wert ergeben. Wenn Sie versuchen, undefinierte Ausdrücke zu lesen oder zuzuweisen, generiert 4D normalerweise Fehler. Das passiert jedoch nicht in folgenden Fällen:
Die Eigenschaft eines undefinierten Objekts oder Werts lesen gibt undefiniert zurück; Variablen (außer Arrays) einen undefinierten Wert zuweisen hat dieselbe Wirkung, wie CLEAR VARIABLE aufrufen:
C_OBJECT($o) C_LONGINT($val) $val:=10 //$val=10 $val:=$o.a //$o.a ist undefiniert (kein Fehler), Zuweisen dieses Werts entfernt die Variable //$val=0
Die Eigenschaft length einer undefinierten Collection lesen ergibt 0:
C_COLLECTION($c) //Variable erstellt, aber keine Collection definiert $size:=$c.length //$size = 0
Ein undefinierter Wert in einer Projektmethode wird automatisch in 0 oder "" konvertiert, je nach dem deklarierten Parametertyp.
Einen undefinierten Wert einer nicht vorhandenen Objekteigenschaft zuweisen führt nichts aus.
Erwartet Ihr 4D Code Ausdrücke eines bestimmten Typs, können Sie sicherstellen, dass sie den korrekten Typ haben, selbst wenn sie als undefiniert bewertet werden. Dazu übergeben Sie die passenden 4D Befehle String, Num, Time, Date, Bool. Sie geben einen leeren Wert des angegebenen Typs zurück, wenn der Ausdruck als undefiniert bewertet wird. Zum Beispiel:
$myString:=Lowercase(String($o.a.b)) //Sicherstellen, dass Sie einen Stringwert erhalten, selbst wenn er undefiniert ist //um Fehler im Code zu vermeiden
Mit der Methode Formula oder Formula from string können Sie eigene Methoden oder Ausdrücke an ein Objekt binden bzw. sie einer Objekteigenschaft zuweisen:
Solche Eigenschaften sind z.B. Methoden, die an ihr übergeordnetes Objekt gebunden sind. Zum Ausführen einer Methode, die an eine Objekteigenschaft gebunden ist, setzen Sie nach dem Eigenschaftsnamen den Operator ( ), wie z.B.:
$f.message() //zeigt "Hello world" an
Die Syntax mit Klammern wird auch unterstützt:
$f["message"]() //zeigt "Hello world" an
Sie können auch Parameter in Ihrer Formel übergeben, wenn Sie diese, wie in 4D Projektmethoden, mit $1, $2… aufrufen:
C_OBJECT($f) $f:=New object $f.message:=Formula(ALERT("Hello "+$1)) $f.message("John") //zeigt "Hello John" an
Beachten Sie, dass eine objektgebundene Methode zum Ausführen mit Klammern ( ) aufgerufen werden muss, selbst wenn sie keine Parameter hat. Sonst wird nur die Objekteigenschaft aufgerufen und sie gibt eine neue Referenz zur Formel zurück (und führt sie nicht aus):
$o:=$f.message //gibt das Objekt Formel in $o zurück
Die Namensvergabe für Token, z.B. Namen von Objekteigenschaften, auf die über Objektnotation zugegriffen wird, ist restriktiver als für standardmäßige 4D Objektnamen. Hierfür müssen die Schreibregeln für JavaScript angewandt werden (siehe ECMA Script standard):
Das erste Zeichen muss ein Buchstabe, ein Unterstrich (_) oder ein Dollarzeichen sein ($).
Nachfolgende Zeichen können ein Buchstabe, Digit, Unterstrich oder Dollarzeichen sein. Leerzeichen sind NICHT erlaubt.
Groß- und Kleinschreibung wird berücksichtigt.
Hinweise:
Die Verwendung eines Tabellenfeldes als Collection Index, wie z.B. a.b[[Table1]Id], ist nicht erlaubt. Sie müssen eine Variable dazwischen setzen.
Bei Objektattributen, die als String in eckige Klammern gesetzt sind, müssen Sie die ECMA Schreibregeln nicht beachten. Beispiel: Das Attribut $o["My Att"] ist in 4D auch trotz Leerzeichen gültig. Sie können dann jedoch mit diesem Attribut keine Objektnotation verwenden.
Warnung Auch wenn für Namen von Objekteigenschaften Sonderzeichen, wie "." oder "[ ]" zulässig sind (und über die Syntax $o["My Att.name" ] verfügbar sind), werden diese Zeichen nicht empfohlen, da Sie nicht danach suchen oder sortieren können. Alle 4D Befehle und Methoden, die nach Objekteigenschaften suchen, wie dataClass.query() oder QUERY BY ATTRIBUTE verwenden einen String als Parameter EigenschaftPfad oder AttributPtad. Beispiel:
QUERY BY ATTRIBUTE([People];[People]Animals;"dog.name";#;"Rex") //Name Untereigenschaft von "dog"
Such- und Sortierläufe nach Eigenschaften mit Sonderzeichen im Namen werden u.U. nicht korrekt interpretiert und können ungültige Ergebnisse liefern. Haben Sie z.B. eine Eigenschaft mit Namen ["A.1.1"] definiert, können Sie nicht danach suchen:
QUERY BY ATTRIBUTE([Chapter]];[Chapter]code;"A.1.1";=;"Intro@") //Eigenschaftsname wird als ein Pfad interpretiert
Bisher hat 4D in jeder Version in tokenisierten Objektnamen der Anwendung immer Punkte (.) und eckige Klammern ([ and ]) akzeptiert (Tabellen, Felder, Variablen und Methoden).
Diese Zeichen werden jedoch zum Erkennen von Tokens der Programmiersprache in der standardmäßigen Objektnotation verwendet. Deshalb sind Anwendungen, die in Namen Punkte oder eckige Klammern enthalten, nicht kompatibel mit der Standard Objektnotation, da Falschinterpretation den Code unterbrechen kann. Wird z.B. folgender Code geschrieben:
a.b a.b:=c[1]
... kann 4D nicht wissen, ob a.b und c[1] standardmäßige Variablennamen darstellt oder ob b eine Eigenschaft von Objekt a ist und c das zweite Element einer Objekt Collection c.
Deshalb gilt folgendes:
In Anwendungen, die aus Versionen vor 4D v17 konvertiert werden, müssen Sie eine spezifische Option aktivieren, wenn Sie die Objektnotation verwenden wollen. Dadurch deklarieren Sie, dass sich Ihr Code für Objektnotation eignet, da er keine Namen mit den Zeichen "." oder "[]" verwendet.
Ein spezifisches Feature in MSC hilft Ihnen beim Suchen der Namen, die mit Objektnotation nicht kompatibel sind. Es wird dringend empfohlen, dieses Feature vor Aktivieren der Objektnotation einzusetzen. Weitere Informationen dazu finden Sie im Abschnitt Seite Prüfen des Kapitels "MSC". Und zur Sicherheit sollten Sie generell mit einer Kopie der Strukurdatei arbeiten.
Die Objektnotation lässt sich nicht rückgängig machen, da dafür Retokenisieren des Code erforderlich ist. Ist sie einmal aktiviert, lässt sie sich nicht aufheben und die Anwendung nicht mehr mit einer vorigen Version öffnen.
In 4D v17 (ab v16 R4) sind die Zeichen "." und "[]" in Namen von tokenisierten Objekten nicht mehr erlaubt.
Um Objektnotation in Ihrem Code zu nutzen, müssen Sie in den Datenbank-Eigenschaften auf der Seite Kompatibilität die Option Verwende Objektnotation, um auf Objekteigenschaften zuzugreifen auswählen:
Diese Einstellung ändert den internen Status Ihrer Strukturdatei und lässt sich nicht rückgängig machen. Weitere Informationen dazu finden Sie auf der Seite Kompatibilität.
Hinweis: Komponenten haben eine andere Einstellung von der Host Datenbank.
Der Einsatz von Objektnotation im 4D Code vereinfacht die Verwaltung von Objekten. Beachten Sie, dass die Befehlsnotation weiterhin voll unterstützt wird.
Objekte schreiben und lesen (dieses Beispiel vergleicht Objektnotation und Befehlsnotation miteinander):
// Objektnotation verwenden C_OBJECT($myObj) //deklariert eine 4D Variable Objekt $myObj:=New object//erstellt ein Objekt und weist es der Variablen zu $myObj.age:=56 $age:=$myObj.age //56
// Befehlsnotation verwenden C_OBJECT($myObj2) //deklariert eine 4D Variable Objekt OB SET($myObj2;"age";42) //erstellt ein Objekt und fügt die Eigenschaft "age" hinzu $age:=OB Get($myObj2;"age") //42</p><p>// Sie können auch beide Notationen mischen C_OBJECT($myObj3) OB SET($myObj3;"age";10) $age:=$myObj3.age //10
Eine Eigenschaft erstellen und Werte, inkl. Objekte, zuweisen:
C_OBJECT($Emp) $Emp:=New object $Emp.city:="London" //erstellt die Eigenschaft "city" und setzt ihren Wert auf "London" $Emp.city:="Paris" //ändert die Eigenschaft "city" $Emp.phone:=New object("office";"123456789";"home";"0011223344") //erstellt die Eigenschaft "phone" und setzt ihren Wert auf ein Objekt
Mit Objektnotation ist es ganz einfach, einen Wert in einem Unterobjekt zu erhalten:
Mit dem Operator [ ] können Sie auf Eigenschaften als String zugreifen:
$Emp["city"]:="Berlin" //ändert die Eigenschaft "city" //das ist hilfreich, um Eigenschaften über Variablen zu erstellen C_TEXT($addr) $addr:="address" For($i;1;4) $Emp[$addr+String($i)]:="" End for // erstellt im Objekt $Emp 4 leere Eigenschaften "address1...address4"