4D v16.3Einzelheiten zur Syntax |
||
|
4D v16.3
Einzelheiten zur Syntax
Einzelheiten zur Syntax
Der Compiler geht davon aus, dass die üblichen Syntaxregeln für 4D Befehle angewandt werden. Für Datenbanken, die kompiliert werden sollen, sind keine besonderen Änderungen erforderlich. Dieser Abschnitt weist auf bestimmte Eigenheiten und spezifische Details hin:
Für Befehle, die mit Strings arbeiten, benötigt nur die Funktion Character code besondere Aufmerksamkeit. Im interpretierten Modus können Strings Zeichen beinhalten oder leer sein. SEND Variable(Variable) Der übergebene Parameter muss immer vom selben Datentyp sein. Nehmen wir an, Sie wollen eine Liste mit Variablen an eine Datei senden. Um auszuschließen, dass der Datentyp versehentlich geändert wird, empfehlen wir, den Datentyp der Variablen in der Titelzeile der Liste anzugeben. So erhalten Sie beim Empfangen der Variablen zu Beginn immer einen Indikator. Rufen Sie dann den Befehl RECEIVE VARIABLE auf, wird der Transfert über eine Case of Anweisung ausgeführt. Beispiel: SET CHANNEL(12;"Datei") Field (field pointer) oder (table number;field Numerisch)
Beachten Sie, dass Referenzen auf Dokumente, die von den Funktionen Open document, Append document und Create document zurückgegeben werden, vom Typ Zeit sind. Mod (value;divider) Der Ausdruck “25 modulo 3” lässt sich auf zwei Arten in 4D darstellen: Variable:=Mod(25;3) oder Variable:=25%3 Der Compiler erkennt den Unterschied zwischen ihnen: Mod gilt für alle Zahlen, der Operator % dagegen nur für Ganzzahlen und Lange Ganzzahlen. Übersteigt der Operand die Reichweite des Typs Lange Ganzzahl, ist das zurückgegebene Ergebnis falsch. IDLE Der Befehl IDLE wurde in die Programmiersprache von 4D integriert, um Ausnahmen zu verwalten. Verwenden Sie diesen Befehl in Verbindung mit dem Befehl ON EVENT CALL. Sie können ihn als Direktive zur Ereignisverwaltung verwenden. Wartet 4D dagegen passiv auf ein Ereignis –– zum Beispiel in einer Warteschleife –– ist klar, dass es keinen Aufruf geben wird. `Methode Mausklick In diesem Fall fügen Sie den Befehl IDLE folgendermaßen ein: `Methode Warten Verwenden Sie diesen Befehl nur in Projektmethoden zur Fehlerverwaltung. Er arbeitet genauso wie in 4D, außer in einer Methode, die von folgenden Befehlen aufgerufen wurde: EXECUTE FORMULA, APPLY TO SELECTION oder _o_APPLY TO SUBSELECTION. Versuchen Sie, derartige Situationen zu vermeiden. Der Compiler bestimmt den Datentyp eines Array über folgende 4D Befehle: COPY ARRAY(Quelle;Ziel) Dieser Befehl akzeptiert zwei Arten von Array-Parametern. Ist einer der Array-Parameter nicht an anderer Stelle deklariert, bestimmt der Compiler den Datentyp des nicht deklarierten Array anhand des deklarierten Typs.
Da der Compiler bei Datentypen strikt ist, lässt sich COPY ARRAY nur von einem Array eines bestimmten Datentyps zu einem Array desselben Typs ausführen. Nehmen wir an, Sie wollen Elemente von einem Array Typ Ganzzahl zu einem Array Typ Zahl kopieren. Gehen Sie folgendermaßen vor: $Size:=Size of array(ArrInt) Bedenken Sie, dass Sie während dem Prozess die Anzahl der Dimensionen eines Array nicht verändern können. Kopieren Sie ein eindimensionales Array in ein zweidimensionales Array, erzeugt der Compiler eine Fehlermeldung. Diese Befehle müssen im interpretierten Modus nicht deklariert werden. Ein nicht typisiertes Array erhält den Datentyp des Feldes, das im Befehl angegeben ist. SELECTION TO ARRAY([MyTable]IntField;MyArray) ist MyArray eindimensional mit dem Typ Lange Ganzzahl (in der Annahme, dass IntField vom Typ Ganzzahl ist). Wurde das Array typisiert, stellen Sie sicher, dass das Datenfeld vom selben Datentyp ist. Ganzzahl, Lange Ganzzahl und Zahl sind zwar ähnliche Typen, jedoch nicht vollkommen gleich. Bei den Datentypen Text und String gibt es dagegen mehr Spielraum. Wurde ein Array nicht vorab typisiert und wenden Sie einen Befehl an, der als Parameter ein Feld vom Typ String enthält, wird dem Array standardmäßig als Typ Text zugewiesen. Wurde das Array zuvor als String bzw. Text typisiert, befolgen diese Befehle Ihre Direktiven. Dasselbe gilt für Felder vom Typ Text –– Ihre Direktiven haben Vorrang. Der Befehl SELECTION TO ARRAY hat auch eine zweite Syntax, nämlich: Für die Befehle LIST TO ARRAY und ARRAY TO LIST treffen nur zwei Arten von Arrays zu:
Der Compiler kann keinen Datentyp aufspüren, wenn Sie in einem Befehl mit Array Deklaration einen dereferenzierten Zeiger als Parameter übergeben. Schreiben Sie: SELECTION TO ARRAY([Table]Field;Pointer->) wobei Pointer-> für ein Array steht, kann der Compiler nicht prüfen, ob Feldtyp und Array-Typ identisch sind. Solche Konflikte müssen Sie selbst ausschliessen, indem Sie das Array typisieren, auf das sich der Zeiger bezieht. Der Compiler zeigt eine Warnung, wenn er eine Anweisung mit einer Array-Deklaration findet, in der ein Parameter ein Zeiger ist. Diese Meldungen sind hilfreich beim Suchen solcher Datentypkonflikte. Verwendet Ihre Datenbank lokale Arrays, d.h. sie werden nur in der Methode erkannt, in welcher sie erstellt wurden, müssen diese vor der Verwendung ausdrücklich in 4D typisiert werden. Erstellt eine Methode z.B. ein lokales Array vom Typ Ganzzahl mit 10 Elementen, müssen Sie zuvor das Array wie folgt typisieren: ARRAY INTEGER($MyArray;10) Get pointer(varName) Die Funktion Get pointer gibt einen Zeiger auf den ihm übergebenen Parameter zurück. Nehmen wir an, Sie möchten ein Array mit Zeigern initialisieren. Jedes Element im Array zeigt auf eine bestimmte Variable. Unser Beispiel enthält 12 Variablen mit Namen V1, V2, …V12. Sie können schreiben: ARRAY POINTER(Arr;12) Sie können auch schreiben: ARRAY POINTER(Arr;12) Am Ende dieser Operation enthalten Sie ein Array mit Zeigern, in dem jedes Element auf eine Variable Vi zeigt. Sie können beide Sequenzen kompilieren. Werden die Variablen V1 bis V12 jedoch nicht in der Datenbank an anderer Stelle ausdrücklich verwendet, kann der Compiler sie nicht typisieren. Sie müssen sie also explizit an anderer Stelle verwenden bzw. typisieren. Es gibt zwei Möglichkeiten:
C_LONGINT(V1;V2;V3;V4;V5;V6;V7;V8;V9;V10;V11;V12)
V1:=0 Da jede Variable in einer kompilierten Datenbank nur einen Datentyp hat, scheint diese Funktion überflüssig. Der Einsatz von Zeigern ist jedoch hilfreich, z.B. wenn Sie den Datentyp der Variablen benötigen, auf die sich ein Zeiger bezieht. Da Zeiger flexibel sind, können Sie nicht immer sicher sein, auf welche Objekte sie jeweils zeigen. Dieser Befehl bietet im interpretierten Modus Vorteile, die nicht in den kompilierten Modus übernommen werden. Wir gehen von folgender Sequenz aus: i:=FormFunc Sie lässt sich ersetzen durch: i:=FormFunc Anderes Beispiel: $Num:=SelPrinter Hier lässt sich EXECUTE FORMULA ersetzen durch Case of: Case of Der Befehl EXECUTE FORMULA lässt sich immer ersetzen. Da die auszuführende Methode aus der Liste der Projektmethoden in der Datenbank oder den 4D Befehlen ausgewählt wird, gibt es eine feste Anzahl an Methoden. Folglich lässt sich EXECUTE FORMULA immer durch eine Anweisung Case of oder einen anderen Befehl ersetzen. Dadurch wird Ihr Code auch rascher ausgeführt. Diese beiden Befehle werden beim Debuggen verwendet. Sie haben in einer kompilierten Datenbank keine Funktion. Sie können sie jedoch in Ihren Methoden beibehalten, der Compiler ignoriert sie einfach. Undefined(Variable) Da der Compiler die Typisierung ausführt, kann eine Variable im kompilierten Modus nie undefiniert sein. Tatsächlich sind alle Variablen definiert, wenn die Kompilierung abgeschlossen ist. Von daher gibt die Funktion Undefined immer Falsch zurück, egal, welcher Parameter übergeben wurde. Hinweis: Über die Funktion Is compiled mode können Sie feststellen, ob Ihre Anwendung im kompilierten Modus läuft. Im interpretierten Modus können Sie prüfen, ob das Dokument vorhanden ist, indem Sie testen, ob eine der Variablen nach Ausführen des Befehls LOAD VARIABLES undefiniert ist. Das ist in einer kompilierten Datenbank nicht möglich, da die Funktion Undefined immer Falsch zurückgibt. Diesen Test können Sie im interpretierten oder kompilierten Modus folgendermaßen durchführen:
Sie schreiben folgende Methode: Var1:="xxxxxx" Diese Routine verwendet im interpretierten Modus zwei unterschiedliche Syntaxarten: Für ein Array MyArray, dessen Elemente vom Typ Ganzzahl sind, bewirkt CLEAR VARIABLE(MyArray) dasselbe wie einer der folgenden Ausdrücke: ARRAY INTEGER(MyArray;0) Die zweite Syntax CLEAR VARIABLE("a") ist mit dem Compiler nicht kompatibel, da er auf Variablen über deren Adresse und nicht über deren Namen zugreift. Nachfolgende Befehle haben folgendes gemeinsam: Sie erlauben einen optionalen ersten Parameter [Tabelle], der zweite Parameter kann ein Zeiger sein. Im kompilierten Modus ist es leicht, den optionalen Parameter [Tabelle] zurückzugeben. Wird dagegen in einem dieser Befehle als erster Parameter ein Zeiger übergeben, weiss der Compiler nicht, auf was sich der Zeiger bezieht; er behandelt ihn als Zeiger auf eine Tabelle. Nehmen wir den Befehl QUERY mit folgender Syntax: QUERY(PtrField->=True) sucht der Compiler nach einem Symbol, das im zweiten Element ein Feld darstellt. Findet er das Zeichen "=", generiert er eine Fehlermeldung, da er den Befehl nicht mit einem Ausdruck identifizieren kann, der weiß, wie die Operation abläuft. Schreiben Sie dagegen: QUERY(PtrTable->;PtrField->=True) oder QUERY([Table];PtrField->=True) vermeiden Sie jede Art von Zweideutigkeit. Beim Arbeiten mit Zeigern gibt es eine Besonderheit bei Befehlen, in denen der erste Parameter [Tabelle] und der zweite Parameter optional sind. Aus internen Gründen erlaubt der Compiler hier nicht, dass ein Befehl, der einen Zeiger zurückgibt, wie z.B. Current form table, direkt als Parameter übergeben wird. Es wird ein Fehler generiert. Das ist zum Beispiel beim Befehl FORM SCREENSHOT der Fall. Nachfolgender Code funktioniert im interpretierten Modus, wird aber während dem Kompilieren zurückgewiesen: //löst Kompilierungsfehler aus In diesem Fall können Sie eine Variable dazwischen setzen, damit der Compiler diesen Code korrekt bewertet: //Entsprechung kompilierbarer Code Erstellen Sie Ihre eigenen 4DK# Ressourcen (Konstanten), stellen Sie sicher, dass Zahlen als Lange Ganzzahl (L) oder Zahl (R) und Zeichenketten als Strings (S) angelegt werden. Jeder andere Typ generiert eine Warnung.
Siehe auch
Compiler Direktiven
|
EIGENSCHAFTEN
Produkt: 4D
GESCHICHTE
ARTIKELVERWENDUNG
4D Programmiersprache ( 4D v16) |