Dies ist die alte 4D Dokumentations-Website. Die neue und aktualisierte Dokumentation finden Sie unter developer.4d.com

Home

 
4D v19.8
Objektnotation verwenden

Objektnotation verwenden  


 

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.

Mit Objektnotation können Sie auf Werte von Objekteigenschaften und Elemente von Collections über eine Kette von Tokens zugreifen.

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:
      // MyMethod1
     C_OBJECT($0)
     $0:=New object("a";10;"b";20)
     
      //myMethod2
     $result:=MyMethod1.a //10
  • Collections
    Beispiel:
     myColl.length //Größe der Collection
     maxSal:=myColl.max("salary")

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:

 C_COLLECTION(myCol)
 myCol:=New collection("A";"B")
 myCol[5]:="Z"
  //myCol[2]=null
  //myCol[3]=null
  //myCol[4]=null

Eigenschaft length

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.

Zeiger  

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

  • Direkter Zugriff:
    pointerOnObject->propertyName
  • Zugriff über Name:
    pointerOnObject->["propertyName"]

Beispiel:

 C_OBJECT(vObj)
 C_POINTER(vPtr)
 vObj:=New object
 vObj.a:=10
 vPtr:=->vObj
 x:=vPtr->a //x=10

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.
     C_OBJECT($o)
     mymethod($o.a) //einen undefinierten Parameter übergeben
     
      //In der Methode mymethod
     C_TEXT($1//Parametertyp ist Text
      // $1 enthält ""
  • Ein bedingter Ausdruck wird automatisch in Falsch konvertiert, wenn er über If und Case of als undefiniert gewertet wird:
     C_OBJECT($o)
     If($o.a) // falsch
     End if
     Case of
        :($o.a) // falsch
     End case
  • Einen undefinierten Wert einer vorhandenen Objekteigenschaft zuweisen initialisiert je nach Typ ihren Wert neu oder hebt ihn auf:
    • Objekt, Collection, Zeiger: Null
    • Bild: Leeres Bild
    • Boolean: Falsch
    • String: ""
    • Zahl: 0
    • Datum: !00-00-00! wenn die Einstellung "Verwende Datumstyp anstelle von ISO Datumsformat in Objekten" aktiviert ist, sonst ""
    • Zeit: 0 (Anzahl ms)
    • Undefiniert, Null: keine Änderung

     C_OBJECT($o)
     $o:=New object("a";2)
     $o.a:=$o.b //$o.a=0

  • 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:

 C_OBJECT($f)
 $f:=New object
 $f.message:=Formula(ALERT("Hello world"))

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:

 $vCity:=$Emp.city //"Paris"
 $vPhone:=$Emp.phone.home //"0011223344"

  • 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"



Siehe auch 

C_COLLECTION
C_OBJECT
New collection
New object
Objektnotation Analyse Fehler (-10737 -> -10701)

 
EIGENSCHAFTEN 

Produkt: 4D
Thema: Objekte (Sprache)

 
SEITENINHALT 
 
GESCHICHTE 

Erstellt: 4D v16 R4

 
ARTIKELVERWENDUNG

4D Programmiersprache ( 4D v19)
4D Programmiersprache ( 4D v19.1)
4D Programmiersprache ( 4D v19.4)
4D Programmiersprache ( 4D v19.5)
4D Programmiersprache ( 4D v19.6)
4D Programmiersprache ( 4D v19.7)
4D Programmiersprache ( 4D v19.8)