4D v14.3Richtlinien zur Typisierung |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
4D v14.3
Richtlinien zur Typisierung
|
Kontrollkästchen |
3D Kontrollkästchen |
Schaltfläche |
Invertierte Schaltfläche |
Unsichtbare Schaltfläche |
3D Schaltfläche |
Bildschaltfläche |
Schaltflächengitter |
Optionsfeld |
3D Optionsfeld |
Bildoptionsfeld |
Bildmenü |
Hierarchisches PopUp-Menü |
Hierarchische Liste |
Lineal |
Halbkreisskala |
Thermometer |
Hinweis: Die Formularvariablen Lineal, Halbkreisskala und Thermometer werden immer als Zahl typisiert, selbst wenn Sie in den Einstellungen zur Kompilierung als Schaltflächentyp Lange Ganzzahl definieren.
Für diese Variablen kann ein Datentypkonflikt nur auftreten, wenn der Name einer Variablen mit einer an anderer Stelle gesetzten Variablen identisch ist. Geben Sie in diesem Fall der zweiten Variablen einen anderen Namen.
Ein Diagrammbereich ist automatisch vom Datentyp Diagramm (Lange Ganzzahl). Diese Variable verursucht keinen Datentypkonflikt, außer der Name einer Variablen dieses Typs ist mit einer an anderer Stelle gesetzten Variablen identisch. Geben Sie in diesem Fall der zweiten Variablen einen anderen Namen.
Ein Plug-In Bereich ist immer vom Typ Lange Ganzzahl. Diese Variable verursucht keinen Datentypkonflikt, außer der Name einer Variablen dieses Typs ist mit einer an anderer Stelle gesetzten Variablen identisch. Geben Sie in diesem Fall der zweiten Variablen einen anderen Namen.
Nicht eingebbare Variable |
Eingebbare Variable |
DropDown Liste |
Menü/DropDown Liste |
Rollbarer Bereich |
Combo Boxen |
PopUp Menü |
Registerkarte |
Diese Variablen sind in zwei Kategorien unterteilt:
Enthält Ihre Datenbank Zeiger, nutzen Sie die Vorteile eines leistungsstarken und ausgeklügelten Werkzeugs von 4D. Der Compiler bewahrt alle Vorzüge von Zeigern.
Ein Zeiger kann auf Variablen mit verschiedenen Datentypen verweisen. Sie vermeiden Konflikte, wenn Sie einer Variablen nicht verschiedene Datentypen zuweisen. Achten Sie darauf, dass der Datentyp einer Variablen, auf die sich ein Zeiger bezieht, nicht verändert wird.
Hierzu ein Beispiel:
Variable:=5.3
Zeiger:=->Variable
Zeiger->:=6.4
Zeiger->:=Falsch
In diesem Fall ist der dereferenzierte Zeiger eine Variable vom Typ Zahl. Weisen Sie diesem einen Wert vom Typ Boolean zu, erzeugen Sie einen Datentypkonflikt.
Benötigen Sie Zeiger in derselben Methode für verschiedene Zwecke, achten Sie auf die korrekte Definition:
Variable:=5.3
Zeiger:=->Variable
Zeiger->:=6.4
Bool:=Wahr
Zeiger:=->Bool
Zeiger->:=Falsch
Ein Zeiger wird immer in Bezug auf das Objekt definiert, auf welches er zeigt. Deshalb kann der Compiler vom Zeiger verursachte Datenkonflikte nicht finden. Bei einem Konflikt erhalten Sie keine Fehlermeldung während der Typisierungs- oder Kompilierungsphase.
Das bedeutet jedoch nicht, dass der Compiler Konflikte im Zusammenhang mit Zeigern nicht finden kann. Er kann die Verwendung von Zeigern prüfen, wenn Sie in den Einstellungen zur Kompilierung die Option Bereichsprüfung markiert haben. Weitere Informationen dazu finden Sie im Abschnitt Bereichsprüfung des Handbuchs 4D Designmodus.
Der Compiler analysiert während dem Kompilieren die Definitionen der in der Datenbank verwendeten Plug-In Befehle, z.B. Anzahl und Typ ihrer Parameter. Beim Typisieren treten keine Verwechslungen auf, wenn Ihre Aufrufe mit der Deklaration der Methode übereinstimmen.
Stellen Sie sicher, dass Ihre Plug-Ins im Ordner PlugIns installiert sind und zwar an die von 4D zugelassene Stelle: Neben die Strukturdatei der Datenbank, neben das ausführbare Programm (Windows) / in das Software Paket (Mac OS). Zur Wahrung der Kompatibilität kann auch noch der Ordner Win4DX bzw. Mac4DX neben der Strukturdatei verwendet werden. Weitere Informationen dazu finden Sie im 4D Installationshandbuch.
Der Compiler dupliziert diese Dateien nicht, prüft jedoch, ob die dazugehörigen Routinen korrekt deklariert sind.
Liegen Ihre Plug-Ins an anderer Stelle, fordert der Compiler Sie auf, diese während der Typisierung über den Öffnen-Dialog zu setzen.
Bestimmte Plug-Ins, zum Beispiel 4D Write enthalten Befehle, die indirekt Befehle von 4D aufrufen.
Die Syntax für den 4D Write Befehl WR ON EVENT lautet:
WR ON EVENT(area;event;eventMethod)
Der letzte Parameter ist der Name der Methode, die Sie in 4D erstellt haben. Diese Methode ruft 4D Write immer auf, wenn das Ereignis empfangen wird. Es empfängt automatisch die nachfolgenden Parameter:
Parameter | Typ | Beschreibung |
$0 | Lange Ganzzahl | Zurückgegebene Funktion |
$1 | Lange Ganzzahl | 4D Write Bereich |
$2 | Lange Ganzzahl | Umschalttaste |
$3 | Lange Ganzzahl | Alt-Taste (Windows); Wahltaste (Mac OS) |
$4 | Lange Ganzzahl | Strg-Taste (Windows), Befehlstaste (Mac OS) |
$5 | Lange Ganzzahl | Ereignistyp |
$6 | Lange Ganzzahl | Wert richtet sich nach Parameter des Ereignisses |
Der Compiler kann diese Parameter nur berücksichtigen, wenn sie entweder über eine Compiler Direktive oder durch ihre Verwendung in der Methode typisiert sind. Kommen sie in einem Prozess vor, muss ihre Verwendung so klar sein, dass sich der Typ eindeutig ableiten lässt.
Mit 4D können Sie 4D Komponenten erstellen und verwalten. Eine 4D Komponente besteht aus einer Reihe von 4D Objekten, mit einer oder mehreren Funktionalitäten, die sich in verschiedenen Datenbanken, genannt Host Datenbank installieren lässt.
Eine Host Datenbank kann im interpretierten Modus sowohl interpretierte als kompilierte Komponenten verwenden. Sie können in derselben Host Datenbank interpretierte und kompilierte Komponenten installieren.
Dagegen kann eine Host Datenbank im kompilierten Modus keine interpretierten Komponenten verwenden. Hier sind nur kompilierte Komponenten möglich.
Eine interpretierte Datenbank mit interpretierten Komponenten ist kompilierbar, wenn sie keine Methoden von interpretierten Komponenten aufruft. Sonst erscheint beim Wählen des Menübefehls Compiler eine Warnung und Kompilieren ist nicht möglich.
Ein Namenskonflikt kann auftreten, wenn eine gemeinsam genutzte Projektmethode in einer Komponente denselben Namen wie eine Projektmethode der Host Datenbank hat. In diesem Fall wird beim Ausführen des Code in der Host Datenbank die Methode der Host Datenbank aufgerufen. Es ist also möglich, die Methode einer Komponente mit einer eigenen Methode zu verdecken, z.B. um eine andere Funktionalität zu erhalten
Wird der Code in der Komponente ausgeführt, wird die Methode der Komponente aufgerufen. Diese Überdeckung wird in einer Warnung im Kompilierungsereignis der Host Datenbank angezeigt.
Nutzen zwei Komponenten gemeinsam Methoden mit demselben Namen, wird beim Kompilieren der Host Datenbank ein Fehler erzeugt.
Weitere Informationen dazu finden Sie im Kapitel 4D Komponenten entwickeln und installieren des Handbuchs 4D Designmodus.
Für lokale Variablen gelten alle bereits genannten Regeln. Wie für andere Variablen lässt sich der Datentyp nicht abändern, während eine Methode ausgeführt wird. Im folgenden sehen Sie zwei Vorgänge, die zu Datentypkonflikten führen können:
Eine Variable lässt sich nicht retypisieren. Sie können sich jedoch über Zeiger auf Variablen mit unterschiedlichen Datentypen beziehen.
Nehmen wir als Beispiel eine Funktion, die die Speichergröße eines eindimensionalen Array zurückgibt. Das Ergebnis ist ein Wert vom Typ Zahl; davon ausgenommen sind Arrays vom Typ Text und vom Typ Bild. Hier richtet sich die Speichergröße nach Werten, die sich nicht als Zahl ausdrücken lassen. Weitere Informationen dazu finden Sie im Abschnitt Arrays und Speicher.
Für Arrays vom Typ Text bzw. Bild ist das zurückgegebene Ergebnis eine Zeichenkette. Diese Funktion benötigt als Parameter einen Zeiger auf das Array, dessen Speichergröße wir wissen wollen.
Hierfür gibt es zwei Möglichkeiten:
$Size:=Size of array($1->)
$Type:=Type($1->)
Case of
:($Type=Real array)
$0:=8+($Size*10) ` $0 ist eine Zahl
VarNum:=8+($Size*4)
:($Type=Integer array)
$0:=8+($Size*2)
:($Type=LongInt array)
$0:=8+($Size*4)
:($Type=Date array)
$0:=8+($Size*6)
:($Type=Text array)
$0:=String(8+($Size*4))+("+Sum of text lengths") ` $0 is a Text
:($Type=Picture array)
$0:=String(8+($Size*4))+("+Sum of picture sizes") ` $0 is a Text
:($Type=Pointer array)
$0:=8+($Size*16)
:($Type=Boolean array)
$0:=8+($Size/8)
End case
In der obigen Methode ändert sich der Datentyp von $0 entsprechend auf den Wert von $1; von daher ist er nicht mit dem Compiler kompatibel.
Funktion MemSize im interpretierten und kompilierten Modus (Beispiel für Mac OS)
Hier wird die Methode mit Zeigern geschrieben:
$Size:=Size of array($1->)
$Type:=Type($1->)
VarNum:=0
Case of
:($Type=Real array)
VarNum:=8+($Size*10) ` VarNum ist eine Zahl
:($Type=Integer array)
VarNum:=8+($Size*2)
:($Type=LongInt array)
VarNum:=8+($Size*4)
:($Type=Date array)
VarNum:=8+($Size*6)
:($Type=Text array)
VarText:=String(8+($Size*4))+("+Sum of text lengths")
:($Type=Picture array)
VarText:=String(8+($Size*4))+("+Sum of picture sizes")
:($Type=Pointer array)
VarNum:=8+($Size*16)
:($Type=Boolean array)
VarNum:=8+($Size/8)
End case
If(VarNum#0)
$0:=->VarNum
Else
$0:=->VarText
End if
Die wichtigsten Unterschiede zwischen beiden Funktionen sind:
Der Compiler verwaltet die Leistungsstärke und Flexibilität der Parameter Indirektion. Im interpretierten Modus können Sie frei wählen bei der Anzahl und den Datentypen der Parameter. Das gilt auch für den kompilierten Modus, vorausgesetzt, Sie verursachen keine Datentypkonflikte und verwenden nicht mehr Parameter, als Sie in der aufrufenden Methode übergeben haben.
Um Konflikte zu vermeiden, sollten Parameter, die über Indirektion angesprochen werden, alle vom selben Datentyp sein.
Die Indirektion funktioniert am besten, wenn Sie folgende Regel beachten: Werden nur einige der Parameter über Indirektion angesprochen, sollten Sie nach den fest vorgegebenen Parametern stehen
Innerhalb der Methode hat eine Indirektion das Format ${$i}, wobei $i eine numerische Variable ist, ${$i} der Parameter für die Indirektion.
Nehmen wir als Beispiel eine Funktion, die Werte hinzufügt und deren Summe in einem Format zurückgibt, das als Parameter übergeben wurde. Immer wenn diese Methode aufgerufen wird, kann die Anzahl der hinzugefügten Werte anders sein. Sie müssen die Werte als Parameter in der Methode übergeben, das Format als Zeichenkette. Die Anzahl der Werte kann von Aufruf zu Aufruf variieren. Die Funktion wird folgendermaßen aufgerufen:
Result:=MySum("##0.00";125,2;33,5;24)
In diesem Fall erhält die aufrufende Methode den String “182.70”, das ist die Summe der Zahlen im angegebenen Format. Die Parameter der Funktion müssen in der richtigen Reihenfolge übergeben wrden, d.h. zuerst das Format, dann die Werte.
Die Funktion mit Namen MySum lautet:
$Sum:=0
For($i;2;Count parameters)
$Sum:=$Sum+${$i}
End for
$0:=String($Sum;$1)
Diese Funktion können Sie nun auf verschiedene Arten aufrufen:
Result:=MySum("##0.00";125,2;33,5;24)
Result:=MySum("000";1;18;4;23;17)
Analog zu anderen lokalen Variablen ist es nicht notwendig, generische Parameter über eine Compiler Direktive zu deklarieren. Bei Bedarf, d.h. bei Zweideutigkeit oder zur Optimierung erfolgt dies mit folgender Syntax:
C_INTEGER(${4})
Dieser Befehl bedeutet, dass alle Parameter ab dem vierten (einschließlich) über Indirektion angesprochen werden und vom Datentyp Ganzzahl sind. $1, $2 und $3 können einen beliebigen Datentyp haben. Verwenden Sie dagegen $2 über Indirektion, wird der generische Datentyp verwendet, d.h. Ganzzahl, auch wenn Sie dafür als Datentyp Zahl festgelegt hatten.
Hinweis: Der Compiler verwendet diesen Befehl während der Typisierung. Die Zahl in der Deklaration muss eine Konstante und nicht eine Variable sein.
Einige Variablen und Konstanten in 4D erhalten Datentyp und Kennung über den Compiler. Von daher können Sie mit diesen Variablen- bzw. Konstantennamen weder neue Variablen, Methoden noch Funktionen oder Plug-In Befehle erstellen. Sie können sie jedoch wie im interpretierten Modus verwenden und ihre Werte testen.
4D enthält folgende Systemvariablen:
Variable | Typ |
OK | Lange Ganzzahl |
Document | String (255) |
FldDelimit | Lange Ganzzahl |
RecDelimit | Lange Ganzzahl |
Error | Lange Ganzzahl |
Error method | Text |
Error line | Lange Ganzzahl |
MouseDown | Lange Ganzzahl |
KeyCode | Lange Ganzzahl |
Modifiers | Lange Ganzzahl |
MouseX | Lange Ganzzahl |
MouseY | Lange Ganzzahl |
MouseProc | Lange Ganzzahl |
Erstellen Sie in einem Bericht berechnete Spalten, legt 4D automatisch eine Variable C1 für die erste, C2 für die zweite, usw. an. Verwenden Sie diese Variablen in Methoden, bedenken Sie, dass C1, C2…Cn sich wie andere Variablen nicht retypisieren lassen.
Die vollständige Liste vordefinierter Konstanten in 4D finden Sie unter Konstantenthemen. 4D Konstanten erscheinen auch im Designmodus im Explorer (siehe Seite Konstanten im Handbuch 4D Designmodus).
Produkt: 4D
Thema: Compiler
Compiler Direktiven
Einzelheiten zur Syntax
Fehlermeldungen
Systemvariablen
Tipps zur Optimierung
4D Programmiersprache ( 4D v12.4)
4D Programmiersprache ( 4D v14 R2)
4D Programmiersprache ( 4D v14 R3)
4D Programmiersprache ( 4D v13.5)
4D Programmiersprache ( 4D v14.3)
4D Programmiersprache ( 4D v14 R4)
Gesplittet : Richtlinien zur Typisierung ( 4D v11 SQL Release 6)