4.7 Number4.7.1 Grundlegende Eigenschaften
Die folgenden Ausführungen gehen zunächst grundsätzlich davon aus, dass das Number-Objekt im normalen Modus (nicht im sogenannten "Delayed Mode") arbeitet. Das ist der Normalfall, wenn man nicht spezielle Hints setzt, um in den Delayed Mode zu kommen. Dieser "Delayed Mode" ist ausführlich im Kapitel 3.4.2 (Delayed Mode und Status-Message) dieses Handbuchs beschrieben. Abstammung:
Spezielle Instance-Variablen:
Methoden:
Action-Handler-Typen:
^4.7.1 Grundlegende EigenschaftenR-BASIC Number-Objekte speichern eine Zahl im Wertebereich von -32768 ... +32767 mit einer Genauigkeit von 4 Stellen nach dem Komma. Das gilt für die Instance-Variablen value, minVal, maxVal und incVal. Um Kommastellen darstellen zu können muss die Instance-Variable displayFormat auf einen passenden Wert gesetzt werden (siehe Kapitel 4.7.2), per Default werden ganze Zahlen dargestellt.
Der Zahlenwert
valueDie Instance-Variable value enthält die vom Number-Objekt dargestellte Zahl. Sie sollten den Wert auf die notwendige Anzahl von Stellen runden (R-BASIC Befehl ROUND), wenn Sie ihn vom Number-Objekt lesen, da ein Number-Objekt eine begrenzte Genauigkeit in der internen Zahlendarstellung aufweist.
Syntax UI-Code: value = numWert
Lesen: <numVar> = <obj>.value
Schreiben: <obj>.value = numWert
minValDie Instance-Variable minVal enthält den unteren Grenzwert für die Instance-Variable value. Das Number-Objekt sorgt selbständig dafür, dass dieser Grenzwert nicht unterschritten wird. Der Defaultwert für minVal beträgt 0.
Syntax UI-Code: minVal = numWert
Lesen: <numVar> = <obj>.minVal
Schreiben: <obj>.minVal = numWert
maxValDie Instance-Variable maxVal enthält den oberen Grenzwert für die Instance-Variable value. Das Number-Objekt sorgt selbständig dafür, dass dieser Grenzwert nicht überschritten wird. Der Defaultwert für maxVal beträgt 32766.
Syntax UI-Code: maxVal = numWert
Lesen: <numVar> = <obj>.maxVal
Schreiben: <obj>.maxVal = numWert
incValDie Instance-Variable incVal enthält den Wert, um den die Instance-Variable value erhöht bzw. erniedrigt wird, wenn man auf einen der Pfeile neben dem Zahlenwert klickt. Der Defaultwert für incVal beträgt 1.
Syntax UI-Code: incVal = numWert
Lesen: <numVar> = <obj>.incVal
Schreiben: <obj>.incVal = numWert
Anwenden der Änderungen
ApplyHandlerDie Instance-Variable ApplyHandler enthält den Namen des ActionHandlers, der aufgerufen wird, wenn das Number-Objekt seinen Wert "anwenden" will (engl. to apply: Anwenden). Dieser muss als NumberAction vereinbart sein. Der Apply-Handler wird üblicherweise aufgerufen, wenn der Nutzer auf die Pfeile des Number-Objekts klickt, nach Eingabe eines Wertes auf "Enter" drückt oder einen Slider "zieht". Sliders werden im Kapitel 4.7.3 besprochen. Der Wert für den ApplyHandler wird üblicherweise im UI-Code gesetzt. Bei Bedarf kann er auch zur Laufzeit (im BASIC-Code) gesetzt, aber nicht gelesen werden.
Syntax UI-Code: ApplyHandler = <Handler>
Schreiben: <obj>.ApplyHandler = <Handler>
Beispiel: Ein typisches Number-Objekt | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Number testNumber Caption$ = "Value = " ApplyHandler = numberApply incVal = 5 value = 280 minVal = -105 maxVal = 300 END Object | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
BASIC-Code des Apply-Handlers: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
NumberAction numberApply Print ROUND(value) END Action | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Beachten Sie die Verwendung der R-BASIC Funktion ROUND( ), um sicherzustellen, dass der ausgegeben Wert ganzzahlig ist. Auch wenn das Number-Objekt eine Ganze Zahl darstellt kann es trotzdem intern eine Zahl mit Nachkommastellen gespeichert haben.
Hinweis: Es ist möglich den ApplyHandler des Number-Objekts manuell (vom BASIC-Code aus) zu aktivieren. Dazu wird die von der GenericClass geerbte Methode Apply verwendet. Da ApplyHandler nur ausgelöst werden, wenn das Objekt "modified" ist, muss es vorher als "modified" markiert werden. Alternativ könnte man dem Objekt auch den Hint ApplyEvenIfNotModified geben. Beispiel: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
testNumber.modified = TRUE testNumber.Apply | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Eine ausführliche Beschreibung dazu finden Sie im Kapitel 3.4 (Die "Apply"-Message) dieses Handbuchs.
modifiedDie Instance-Variable modified enthält die Information, ob der vom Number-Objekt dargestellte Wert seit dem letzten Aufruf des Apply-Handlers geändert wurde (modified = TRUE) oder nicht (modified = FALSE). Beachten Sie, dass ein Verändern des Objekts vom BASIC-Code aus (z.B. Belegen der Instance-Variable value), das Objekt nicht als "modified" markiert, d.h. der Wert der Instance-Variablen modified wird nicht verändert. Sie können dies bei Bedarf selbst machen, indem Sie die Anweisung "<obj>.modified = TRUE" verwenden.
Syntax UI-Code: modified = TRUE | FALSE
Lesen: <numVar> = <obj>.modified
Schreiben: <obj>.modified = TRUE | FALSE
Wenn Sie die Instance Variable modified lesen, werden Sie feststellen, dass sie Null enthält, es sei denn, Sie haben sie explizit auf einen anderen Wert gesetzt. Ändert der Nutzer nämlich den Zahlenwert, so passiert intern folgendes:
Hinweis: Im sogenannten Delayed Mode (siehe entsprechendes Kapitel weiter unten) werden die letzten beiden Schritte nicht ausgeführt, so dass die Instance-Variable modified eine eigene Bedeutung erhält.
NavigateToNextFieldOnReturnDrückt der Nutzer in Eingabefeld eines Number-Objekts die Enter-Taste bleibt der Cursor üblicherweise dort stehen. Der Hint NavigateToNextFieldOnReturn bewirkt, dass der Cursor stattdessen zum nächsten Eingabefeld weiterrückt. Syntax UI-Code: NavigateToNextFieldOnReturn Methoden
IncrementDie Methode Increment bewirkt, dass der Instance-Wert value um incVal erhöht wird, genau so, als ob der Nutzer auf den entsprechenden Pfeil des Number-Objekts geklickt hat. Syntax BASIC-Code: <obj>.Increment DecrementDie Methode Decrement bewirkt, dass der Instance-Wert value um incVal vermindert wird, genau so, als ob der Nutzer auf den entsprechenden Pfeil des Number-Objekts geklickt hat. Syntax BASIC-Code: <obj>.Decrement ^4.7.2 Display-Format
Grundsätzlich gilt: Number-Objekte speichern Zahlen im Wertebereich von -32768 ... +32767 mit einer Genauigkeit von 4 Stellen nach dem Komma. Diese Zahl kann aber von einem Number-Objekt auf verschieden Weise dargestellt werden. Das wird über die Instance-Variablen displayFormat und decimal gesteuert. decimalDie Instance-Variable decimal stellt die Anzahl der angezeigten Nachkommastellen ein. Voraussetzung ist, dass das mit displayFormat eingestellte Anzeigeformat auch Nachkommastellen zulässt. Das ist bei allen Formaten außer DF_INTEGER der Fall. Der Default-Wert für decimal ist 3, der Maximalwert ist 4.
Syntax UI-Code: decimal = numWert
Lesen: <numVar> = <obj>.decimal
Schreiben: <obj>.decimal = numWert
displayFormatDie Instance-Variable displayFormat stellt ein, auf welche Weise die vom Number-Objekt gespeicherte Zahl dargestellt wird. Der Default-Wert für displayFormat ist DF_INTEGER.
Syntax UI-Code: displayFormat = numWert
Lesen: <numVar> = <obj>.displayFormat
Schreiben: <obj>.displayFormat = numWert
Das Number-Objekt rechnet dabei den internen Wert in die das gewünschte Format um. Intern geht das Number-Objekt davon aus, das der intern gespeicherte Wert in US-Points vorliegt. Es stehen die folgenden Formate zur Verfügung:
Anmerkungen zu einigen der Konstanten
Dabei gelten die folgenden Umrechnungen: Hinweis Bernd: Das "fast gleich"-Zeichen ließ sich im GEOS-Browser nicht darstellen, daher stattdessen in der Tabelle die Kombi aus Gleichheitszeichen und Sternchen =*
Beispiel: value steht auf 72 (Pt), das sind 2,54 cm
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Number testnumber Caption$ = "Abstand = " displayFormat = DF_CENTIMETERS value = 72 incVal = 36 maxVal = 3000 END Object | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Beachten Sie, dass beim Lesen der Instance-Variable value natürlich der dort gespeicherte Wert gelesen wird. Im Beispiel ist das 72, und nicht etwa 2,54!
^4.7.3 Angepasstes Aussehen und Sliders
lookDas Aussehen eine Number-Objekts kann mit der Instance-Variable look angepasst werden (engl. look : Aussehen, äußere Erscheinung).
Syntax UI-Code: look = numWert
Lesen: <numVar> = <obj>.look
Schreiben: <obj>.look = numWert
Dabei stehen die folgenden Werte zur Verfügung:
Für Sliders gibt es weitere Möglichkeiten, das Aussehen anzupassen. Sie sollten die folgenden Hints nur anwenden, wenn die Instance-Variable look auf einen der SLIDER-Werte gesetzt ist.
sliderShowIntervalsDieser Hint versieht den Slider mit Intervall-Marken. Sie können angeben, wie viele Hauptintervalle gezeichnet und ob diese noch unterteilt werden sollen.
Syntax UI-Code: sliderShowIntervals = main [ , sub ]
Lesen: <numVar> = <obj>.sliderShowIntervals ( n )
n = 0: main-Wert lesen
n = 1: sub-Wert lesen
Schreiben: <obj>.sliderShowIntervals = main [ , sub ]
<obj>.sliderShowIntervals = 0 löscht den Hint aus den Instance-Daten, d.h. die Intervalle werden entfernt.
Der Parameter main gibt die Anzahl der Hauptintervalle an. Der Parameter sub ist optional und legt fest, in wie viele Unterintervalle die Hauptintervalle zu unterteilen sind. Die Sub-Intervallstriche sind etwas kürzer als die der Hauptintervalle. Die Einteilung in Intervalle erfolgt völlig unabhängig vom dargestellten Zahlenbereich. Beispiel: siehe unten SliderNoDigitalDisplayDieser Hint entfernt den Zahlenwert, der üblicherweise über bzw. neben dem Slider erscheint. Syntax UI-Code: SliderNoDigitalDisplay Beispiel: siehe unten SliderShowMinMaxDieser Hint fügt die Anzeige des Minimal- und Maximal-Wertes (minVal und maxVal) zum Slider hinzu. Die Werte werden in dem durch die Instance-Variable displayFormat spezifizierten Format angezeigt. Syntax UI-Code: SliderShowMinMax Beispiel: Ein Slider mit 4 Intervallen, die in je 2 Unterintervalle geteilt sind. Die Anzeige des aktuellen Digitalwertes ist deaktiviert, die Anzeige des Minimum- und Maximum-Wertes ist aktiviert.
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Number QualitySlider Caption$ = "Quality:" justifyCaption = J_TOP ApplyHandler = numberApply value = 30 incVal = 10 minVal = 0 maxVal = 100 look = LOOK_X_SLIDER sliderShowIntervals = 4, 2 SliderNoDigitalDisplay SliderShowMinMax END Object | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Beachten Sie, dass Number-Objekte von der GenericClass abstammen und daher alle Eigenschaften und Fähigkeiten dieser Klasse erben. Insbesondere gilt das für die Geometrie-Hints sowie die Möglichkeit sie auf "enabled = FALSE" oder "readOnly = TRUE" zu setzen.
Die Bilder zeigen "readOnly = TRUE" Objekte, links einen Slider mit dem Hint SliderNoDigitalDisplay gesetzt und rechts ein "normales" Objekt.
4.7.4 Weitere Hinweise zur Arbeit mit Number-Objekten
Interne DetailsDer von Number-Objekten zur Speicherung von Zahlen verwendete Datentyp WWFixed wird im GEOS System sehr häufig, unter anderem für alle grafischen Berechnungen, verwendet. Das liegt daran, dass sie einen sehr guten Kompromiss aus guter Genauigkeit (Nachkommastellen) und sehr hoher Rechengeschwindigkeit ermöglicht. Die oben genannte Begrenzung des Wertebereichs ergibt sich aus der Verwendung eine Integer-Wertes für den ganzzahligen Teil. Der Nachkommateil kann als Anzahl der 1/65536 interpretiert werden, die auf den ganzzahligen Teil zu addieren ist. Da 1/65536 _ 0,000015 ist, kann der Nachkommawert nur in dieser Abstufung geändert werden. Eine Genauigkeit von 5 Nachkommastellen ist damit nicht mehr erreichbar. Selbst 4 Stellen sind mit Vorsicht zu genießen, da 0,0001 intern bereits als 7/65536 dargestellt werden muss, was aber eigentlich 0,0001068 ist. R-BASIC begrenzt den Wert für decimal daher auf 4. Die Bedingungen "minVal - incVal >= -32768" und "minVal + incVal <= 32767" haben folgenden Grund: Erhöht oder Erniedrigt das Number-Objekt seinen value-Wert um den durch incVal gegebenen Wert (klicken Sie z.B. auf den Hoch- bzw. Runter-Pfeil), so nutzt es dazu Ganzzahl-Arithmetik. Daher kann es zu einer Wertebereichsüberschreitung (Übertrag) kommen, die vom GEOS-System aus Performance-Gründen nicht behandelt wird. R-BASIC beachtet diese Bedingungen beim Compilieren des UI-Codes, aber - ebenfalls aus Performance-Gründen - nicht zur Laufzeit. Sie können daher gegen diese beiden Bedingungen verstoßen, wenn Sie die Instance-Variablen zur Laufzeit setzen. Sie werden schon sehen, was Sie davon haben. Wenn Sie eine höhere Genauigkeit wünschen oder den Integer-Wertebereich verlassen müssen, können Sie zur Eingabe einer Zahl einer der Befehle INPUT oder InputBox oder ein Text-Objekt (z.B. Memo oder InputLine) und ggf. die BASIC-Funktionen VAL, ValLocal bzw. Str$ verwenden.
4.7.5 Number-Objekte im Delayed ModeEin Number-Objekt kann im "Delayed Mode" (engl.: verzögerter Modus) arbeiten. Dazu muss man dem Objekt selbst bzw. einem seiner Parents im UI-Code den Hint MakeDelayedApply geben oder man bindet das Objekt als Child in einem Dialog ein, dessen dialogType Instance Variable auf DT_DELAYED_APPLY gesetzt ist. Dieser "Delayed Mode" ist ausführlich im Kapitel 3.4.2 (Delayed Mode und Status-Message) dieses Handbuchs beschrieben, eine Beschreibung des Dialog-Objekts im Delayed Mode finden Sie im Kapitel 4.6.6.5.
Syntax UI-Code: StatusHandler = <Handler>
Schreiben: <obj>.StatusHandler = <Handler>
Der StatusHandler wird im Delayed Mode statt des ApplyHandlers gerufen, wenn der Nutzer auf die Pfeile des Number-Objekt klickt, nach Eingabe eines Wertes auf "Enter" drückt oder einen Slider "zieht". Der ApplyHandler hingegen wird erst auf Anforderung gerufen (siehe Kapitel 3.4.2). Die Instance-Variable modified kann TRUE enthalten, nämlich dann, wenn das Objekt vom User modifiziert wurde, der ApplyHandler aber noch nicht gerufen wurde. Der Aufruf des ApplyHandlers setzt auch im Delayed Mode den modified-Status zurück.
Syntax BASIC-Code: <obj>.SendStatus Die Methode SendStatus fordert das Objekt auf, seinen StatusHandler aufzurufen (d.h. seine Status-Message zu senden). ^ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||