Variablen-Typen und Typbindung der Variablen: Unterschied zwischen den Versionen

Aus Wiki des Deutschsprachige Xbaseentwickler e. V.
Zur Navigation springen Zur Suche springen
Keine Bearbeitungszusammenfassung
Zeile 142: Zeile 142:
=== Objekte ===
=== Objekte ===


Objekte betrachtet man am besten als eine Art Container. Dieser Container kann Felder (Instanzvariablen) und Programm-Code (Methoden) enthalten, sowie in den Instanzvariablen weitere Objekte.
Objekte betrachtet man am besten als eine Art Container. Dieser Container kann Felder ([[Instanzvariablen]]) und Programm-Code ([[Methoden]]) enthalten, sowie in den Instanzvariablen weitere Objekte.


Eine Variable enthält eine Referenz auf ein Objekt, und nicht das Objekt selbst.
Eine Variable enthält eine Referenz auf ein Objekt, und nicht das Objekt selbst.


Diese Tatsache ist gerade im Umgang mit Xbase-Parts im Anfang etwas verwirrend:
Diese Tatsache ist gerade im Umgang mit [[Xbase-Parts]] im Anfang etwas verwirrend:


  oDlg := XbpDialog():new()
  oDlg := XbpDialog():new()
Zeile 158: Zeile 158:
  oXbp:create()
  oXbp:create()


Dieser Code erzeugt ein XbpDialog() Fenster. Im nächsten Schritt wird der Variablen oXbp ein neues Objekt der Klasse XbpSLE() zugewiesen, es werden bestimmte Definitionen durchgeführt, und dann wird das Objekt durch Anforderung der Systemressourcen fertiggestellt.
Dieser Code erzeugt ein [[XbpDialog()]] Fenster. Im nächsten Schritt wird der Variablen oXbp ein neues Objekt der Klasse [[XbpSLE()]] zugewiesen, es werden bestimmte Definitionen durchgeführt, und dann wird das Objekt durch Anforderung der Systemressourcen fertiggestellt.


Das Objekt, auf das oXbp verweist, existiert als Child von oDlg, also in dessen Kontext. Wenn nun im nächsten Schritt der gleichen (!) Variablen ein XbpPushButton() Objekt zugewiesen wird, so wird dadurch das XbpSLE() Objekt nicht zerstört! Es wird lediglich die Referenz auf ein Objekt durch die Referenz auf ein anderes Objekt ersetzt.
Das Objekt, auf das oXbp verweist, existiert als [[Child]] von oDlg, also in dessen Kontext. Wenn nun im nächsten Schritt der gleichen (!) Variablen ein [[XbpPushButton()]] Objekt zugewiesen wird, so wird dadurch das [[XbpSLE()]] Objekt nicht zerstört! Es wird lediglich die Referenz auf ein Objekt durch die Referenz auf ein anderes Objekt ersetzt.


Als Programmierer haben wir keinen direkten Zugriff mehr auf das XbpSLE() Objekt, das ist aber auch im Rahmen der Xbase++ Programmierung nicht mehr zwingend erforderlich.
Als Programmierer haben wir keinen direkten Zugriff mehr auf das [[XbpSLE()]] Objekt, das ist aber auch im Rahmen der [[Xbase++]] Programmierung nicht mehr zwingend erforderlich.


Um ein Objekt zu zerstören, ist die Ausführung der Methode :destroy() (sofern definiert) erforderlich. Die Überreste werden dann irgendwann vom [[Garbage Collector]] entsorgt.
Um ein Objekt zu zerstören, ist die Ausführung der [[Methode]] [[:destroy()]] (sofern definiert) erforderlich. Die Überreste werden dann irgendwann vom [[Garbage Collector]] entsorgt.

Version vom 17. Juni 2013, 16:46 Uhr

Unterstützte Variablen-Typen

Xbase++ kennt in den Speichervariablen keine Typ-Bindung, d.h. einer Variablen kann jeder Wert, unabhängig vom Typ, zugewiesen werden.

Felder in Dateien hingegen sind eindeutig typgebunden, und die Übertragung eines nicht kompatiblen Wertes führt beim Schreiben in die Datei zu einem Laufzeitfehler.

Xbase++ unterstützt die folgenden Variablen-Typen:


ARRAY

Ein Array ist eine Gruppierung von Variablen, die unterschiedliche Typen haben können.

nCount := fCount()
aRec := Array(nCount)
FOR nI := 1 TO nCount
  aRec[nI] := FieldGet(nI)
NEXT

In diesem Beispiel wird ein Array verwendet, um die Felder eines Datensatzes aufzunehmen. Zu diesem Zweck wird die Feldanzahl über die Funktion fCount() ermittelt und mittels der Funktion Array() ein leeres Array mit nCount Feldern erzeugt. Jedes Element des Arrays hat den Wert NIL. Danach wird in einer Schleife jedes Feld entsprechend seiner Position im Datensatz in das korrespondierende Array-Element übertragen.

Arrays können auch geschachtelt sein, d.h. ein Array-Element kann auch wieder ein eigenes Array sein.


BLOCK oder Codeblock

Ein Codeblock enthält zur Compile- oder Laufzeit erzeugten Code, der eigenständig im Programmkontext ausführbar ist.

bBlock := {|| Time()}
? Eval(bBlock)

Bei der Ausführung des Codeblocks über die Funktion Eval() wird die aktuelle Zeit ausgegeben.


CHAR oder Zeichen/String

Hierunter fallen alle alpha- und numerischen Zeichen incl. binärer Werte.

Wenn ein Memo-Feld aus einer Datei einer Speichervariablen zugewiesen wird, hat die Speichervariable den Feldtyp CHAR.

cName := "Felix Hugendabler"
cName := Str(27)


DATE oder Datum

Xbase++ unterstützt Datumswerte im Bereich von " . . " (= leer), "01.01.0001" bis "31.12.9999". Datumsfelder können auch in arithmetischen Operationen verwendet werden:

dDate := Date()              // weist das aktuelle Datum zu
dGestern := dDate - 1        // ermittelt das Datum des Vortages
nDauer := dDate - dGestern   // ermittelt die Tage zwischen dDate und dGestern


LOGICAL oder logisch

Logische Werte kennen .T. (WAHR) und .F. (FALSCH).

lErgebnis := .T.
lErgebnis := 1 > 3


NUM oder Zahlen

Darstellbar am Bildschirm sind Zahlen im Bereich von 16 Vor- und 15 Nachkommastellen, also insgesamt maximal 31 Ziffern. Intern operiert Xbase++ mit IEEE 64 bit format Zahlen.

Zuweisungen können dezimal, hexadezimal oder wissenschaftlich erfolgen, wobei zu berücksichtigen ist, dass für dezimale Werte ein Dezimalpunkt zu verwenden ist:

nWert := -176.33
nWert := 0xAD
nWert := 10.1E-5


OBJECT oder Objekt

Ein Objekt ist ein spezieller Datentype, der als Container wiederum Variablen und Programmcode enthalten kann. Variablen, die sich auf Objekte beziehen, enthalten immer nur eine Referenz auf das Objekt, nicht jedoch das Objekt selbst.

oXbp := XbpDialog():new()


NIL

Deklarierte, aber nicht initialisierte Variablen haben im Normalfall den Wert NIL.


Übersicht über die Feldtypen, Grössen und Wertebereiche

Typ Länge von bis Wertebereich
ARRAY (nicht explizit) (beliebig)
BLOCK (nicht explizit) n/a
CHAR 1 bis 32767 Bytes alphanumerisch incl. binär
DATE 8 bzw. 10 Bytes leer und gültige Datumswerte von 1.1.1 bis 31.12.9999
LOGIC 1 Byte WAHR und FALSCH
NUMERIC 1 bis 16.15 10**-308 bis 10**308
OBJECT (nicht explizit) n/a


Besonderheiten

Arrays

Während der Inhalt einer Variablen mittels der Zuweisung einer weiteren Variablen zugewiesen werden kann, ist dies bei Arrays nicht möglich.

dHeute := Date()
dDatum := dHeute
dHeute := NIL
? dDatum

Hier wird als Ergebnis das Tagesdatum ausgegeben.

aData := Array(1)
aData[1] := Date()
aWerte := aData
aWerte[1] := NIL
? aData

Hier wird als Ergebnis {NIL} ausgegeben.

Die Zuweisung aWerte := aData kopiert nicht das Array, sondern die Referenz auf das Array, so dass beide Variablen auf das gleiche Array zeigen. Die Zuweisung von NIL an ein Element von aWerte betrifft das Array, auf das auch aData Bezug nimmt, ebenso. Beide Variablen verweisen auf das gleiche Array, so dass Änderungen sich in beiden Variablen widerspiegeln.

Um Arrays zu kopieren, muss die Funktion AClone() verwendet werden:

aData := Array(1)
aData[1] := Date()
aWerte := AClone(aData)
aWerte := NIL
? aData

Diesmal wird als Ergebnis {(Tagesdatum)} ausgegeben.


Objekte

Objekte betrachtet man am besten als eine Art Container. Dieser Container kann Felder (Instanzvariablen) und Programm-Code (Methoden) enthalten, sowie in den Instanzvariablen weitere Objekte.

Eine Variable enthält eine Referenz auf ein Objekt, und nicht das Objekt selbst.

Diese Tatsache ist gerade im Umgang mit Xbase-Parts im Anfang etwas verwirrend:

oDlg := XbpDialog():new()
...
oDlg:create()
oXbp := XbpSLE():new(oDlg:drawingArea, oDlg:drawingArea, aPos, aSize)
...
oXbp:create()
oXbp := XbpPushButton():new(oDlg:drawingArea, oDlg:drawingArea, aPos, aSize)
...
oXbp:create()

Dieser Code erzeugt ein XbpDialog() Fenster. Im nächsten Schritt wird der Variablen oXbp ein neues Objekt der Klasse XbpSLE() zugewiesen, es werden bestimmte Definitionen durchgeführt, und dann wird das Objekt durch Anforderung der Systemressourcen fertiggestellt.

Das Objekt, auf das oXbp verweist, existiert als Child von oDlg, also in dessen Kontext. Wenn nun im nächsten Schritt der gleichen (!) Variablen ein XbpPushButton() Objekt zugewiesen wird, so wird dadurch das XbpSLE() Objekt nicht zerstört! Es wird lediglich die Referenz auf ein Objekt durch die Referenz auf ein anderes Objekt ersetzt.

Als Programmierer haben wir keinen direkten Zugriff mehr auf das XbpSLE() Objekt, das ist aber auch im Rahmen der Xbase++ Programmierung nicht mehr zwingend erforderlich.

Um ein Objekt zu zerstören, ist die Ausführung der Methode destroy() (sofern definiert) erforderlich. Die Überreste werden dann irgendwann vom Garbage Collector entsorgt.