2.11 Weitere Funktionen
2.11.2 Datum und Zeit - u.a. Julianisches Datum 2.11.5 System Services - Tatstaur, Maus, Drucken, Clipboard, Hilfedateien, Timer, Dateiarbeit, Dokumente, Geometriemanagement ^2.11.1 VersionsnummernDa sowohl die R-BASIC IDE als auch ein R-BASIC Programm aus verschiedenen Komponenten bestehen gibt es verschiedene Arten von Versionsnummern.
Version$Jedes Programm und jede Library besitzt eine Versionsnummer, mit deren Hilfe man verschiedene Programmversionen identifizieren kann. Man kann sie über die globale Variable Version$ ermitteln. Rufen Sie Version$ aus einer Library heraus auf so erhalten Sie die Versionsnummer der Library.Syntax: <stringVar> = Version$ Der Aufbau von Version$ ist folgender:
Verwechseln Sie Version$ nicht mit der Variablen BasicVersion$, welche die Versionsnummer der BASIC-IDE enthält, die das aktuelle Programm compiliert hat. Die Werte für Major und Minor können im Menüpunkt "Programm" geändert werden. Der Major-Wert sollte geändert (vergrößert) werden, wenn wesentliche neue Funktionen dazugekommen sind, ein neuer Wert für Minor sollte Bugfixes oder kleinere Änderungen anzeigen.
Tipps:
Release- und ProtokollnummerAuf GEOS Systemebene werden die Protokoll- und Releasenummer verwendet, um zu prüfen, ob Dateien, Libraries und Programme zueinander kompatibel sind.Eine komplette Beschreibung der Befehle zur Arbeit mit Protocol- und Releasenummern finden Sie im Handbuch "Spezielle Themen", Kapitel 9.2 (Dateiattribute). Die folgende Tabelle enthält einen Überblick.
BasicVersion$Sie können die Versionsnummer der BASIC-IDE, die das aktuelle Programm compiliert hat, mit der Systemvariablen BasicVersion$ abfragen. Nicht zu verwechseln mit der Variablen Version$, die die Versionsnummer des aktuell ausgeführten Programms enthält.Syntax: <stringVar> = BasicVersion$ BasicVersion$ liefert eine String der Form:
Dieser Wert ist der gleiche, wie er im Menü "Datei-Information" angezeigt wird, es handelt sich um die Release-Nummer der R-BASIC IDE.
Interne DetailsDer folgende Abschnitt enthält Hintergrundinformationen, die zur täglichen Arbeit mit R-BASIC nicht unbedingt benötigt werden.Die Releasenummer enthält die "Version" eines Programms oder einer Library. Sie wird angezeigt, wenn Sie im GeoManager die Tastenkombination Strg-G eingeben bzw. den Menüpunkt "Datei" -> "Info & Attribute" anklicken. Die Protokollnummer beschreibt die "Fähigkeiten" eines Programms oder einer Library bzw. die "innere Struktur" einer Datei. Sie wird zur Versionsprüfung auf Systemebene verwendet. Wenn die Protokollnummer nicht passt ist die Datei (Dokument, Library, Programm) nicht kompatibel. Zum Beispiel verwendet die R-BASIC IDE die Protokollnummer um zu entscheiden ob R-BASIC die Datei öffnen und bearbeiten kann. R-BASIC verwendet die Releasenummer zur Versionsprüfung. Aus Sicht des GEOS-Systems sind sowohl die R-BASIC Codedatei als auch die BIN-Datei Dokumente. Das gilt auch für R-BASIC Libraries. Das GEOS-System ignoriert die Releasenummer von Dokumenten, deshalb kann R-BASIC sie benutzen. Der R-BASIC Compiler setzt beim Compilieren die ersten drei Felder der Releasenummer der BIN-Datei entsprechend der Versionsnummer des Programms bzw. der Library. Das hat folgende Konsequenzen:
^2.11.2 Arbeit mit Datum und ZeitR-BASIC unterstützt die Grundfunktionen zum Zugriff auf das Systemdatum sowie elementare Funktionen zur Anzeige von Datum und Uhrzeit. Außerdem wird die Arbeit mit dem Julianischen Datum unterstützt.
Alle Zeitfunktionen, einschließlich der Funktionen zum Zugriff auf das Dateidatum benutzen eine Struktur, die DateAndTime heißt. |
STRUCT DateAndTime year, month, day AS INTEGER hour, minute, second AS INTEGER END STRUCT |
|
year, month, day enthalten das Jahr (z.B. 2014), den Monat (1...12) und den Tag (1 ... 31).
hour, minute, second enthalten die Stunde (0..23), die Minute (0...59) und die Sekunde (0...59).
Zugriff auf Datum und ZeitSysGetTimeSysGetTime liefert das aktuelle Systemdatum und die Systemzeit.
Beispiel: |
DIM time AS DateAndTime time = SysGetTime() Print "Das Weltall. Unendliche Weiten. \ Wir schreiben das Jahr ";time.year |
SysGetCountSysGetCount liefert die Anzahl der "Tics" (1/60 s) seit dem letzten Systemstart.Syntax: <numVar> = SysGetCount() <numVar>: numerische Variable Formatierung von Datum und ZeitDa man über die DateAndTime-Struktur direkten Zugriff auf das Jahr, den Monat, die Stunde usw. als Zahl hat, ist es nicht kompliziert einen formatierten String zu erzeugen, der Datum oder Zeit enthält. Zum Beispiel erzeugt der Code |
s$ = "Jahr: " + Str$(time.year) |
|
einen String, der das Jahr als Text enthält.
Aber manchmal braucht man einen einfachen Weg Datums- oder Zeitangaben zu formatieren. Die folgenden Routinen erledigen das.
FormatDate$FormatDate$ gibt das Datum in der Form "24.03.2010" oder in der Form "2010/03/24" aus. Die lokalen Einstellungen des Computers werden dabei nicht berücksichtigt.
Beispiel: |
DIM time AS DateAndTime time = SysGetTime() Print "Aktuelles Datum: "; FormatDate$(time) |
FormatTime$FormatTime$ gibt die Uhrzeit im 24-Stunden-Format aus. Die lokalen Einstellungen des Computers werden dabei nicht berücksichtigt.
Beispiel: |
DIM time AS DateAndTime time = SysGetTime() Print "Aktuelle Uhrzeit: "; FormatTime$(time) |
Weekday$, DayOfWeekWeekday$ gibt den Wochentag in Textform aus, wobei die lokalen Einstellungen (Sprache) des Computers berücksichtigt werden. DayOfWeek liefert eine Zahl (0..6) die dem Wochentag entspricht. Der Sonntag hat den Wert Null.
Syntax: <numVar> = DayOfWeek( time)
Beispiel: |
DIM time AS DateAndTime time = SysGetTime() Print "Heute ist "; Weekday$( time ) Print "Das ist der"; DayOfWeek( time ) + 1 ; ". Tag der Woche." |
LocalFormatDateAndTime$LocalFormatDateAndTime$ greift auf die Systemeinstellung für die Darstellung von Datum und Zeit zu und formatiert Datums- und Zeitangaben entsprechend diesen Einstellungen. Dadurch erscheinen die Datums- und Zeitangaben in dem vom Nutzer eingestellten Format. Das kann allerdings auf verschiedenen Systemen völlig unterschiedlich sein.Syntax: <stringVar> = LocalFormatDateAndTime$( time, format ) time: Variable (oder Funktion) vom Typ DateAndTime. format: Eine DateAndTimeFormat (DTF-) Konstanten aus der aus der Tabelle unten. Die folgenden Tabelle zeigt das Ausgabeformat von LocalFormatDateAndTime$ für die Standardeinstellungen auf einem deutschen PC/GEOS System. Auf anderen Systemen, insbesondere auf fremdsprachigen Systemen, kann das Ausgabeformat völlig anders aussehen.
Julianisches DatumDas Julianische Datum ist eine Zahl, die der Anzahl der Tage seit dem 1.1.4713 vor Christus, 12 Uhr mittags entspricht. Man beginnt 12 Uhr mittags damit bei astronomischen Beobachtungen während der Nacht kein Datumswechsel auftritt. Die Nachkommastellen entsprechen der Uhrzeit (bezogen auf 12 Uhr mittags).Das Julianische Datum ist fortlaufend. Unregelmäßigkeiten wie unterschiedliche Monatslängen, Monats und Jahreswechsel oder auch Schaltjahre werden automatisch berücksichtigt. Damit lassen sich Fragen wie "Wie viele Tage liegen zwischen dem 28.04.2016 und dem 17.07.1962?" einfach durch die Differenz der beiden zugehörigen Julianischen Datumszahlen beantworten. Der Vergleich von zwei Zeitpunkten (einschließlich der Frage, welcher früher liegt) reduziert sich auf den Vergleich von zwei Real-Zahlen.
Für das Julianische Datum wird allgemein die Abkürzung JD verwendet.
JDFromDATDie Funktion JDFromDAT ermittelt den julianischen Datumswert (JD) aus einer DateAndTime Struktur (DAT).Syntax: <numVar> = JDFromDAT ( <dat> ) <numVar>: numerische Variable, empfohlener Datentyp: Real <dat>: Variable oder Ausdruck vom Datentyp DateAndTime DATFromJDDie Funktion DATFromJD rechnet einen julianischen Datumswert (JD) in eine DateAndTime Struktur um.Syntax: <var> = DATFromJD ( <jd> ) <jd>: numerischer Ausdruck. Julianisches Datum <var>: Variable vom Datentyp DateAndTime Das folgende Beispiel gibt aus, welches Datum wir in 100 Tagen, gerechnet ab heute, haben. |
DIM jetzt, dann AS DateAndTime DIM jd as Real jetzt = SysGetTime() jd = JDFromDAT(jetzt) dann = DATFromJD ( jd + 100) Print "In 100 Tagen ist der ";FormatDate$(dann) |
| Wir wollen wissen in wie vielen Tagen Weihnachten ist. |
DIM zeit as DateAndTime DIM ist, soll, count as Real zeit = SysGetTime() ist = JDFromDAT(zeit) ' aktuelles Julianisches Datum zeit.day = 24 zeit.month = 12 soll = JDFromDAT(zeit) ' Julianisches Datum vom Weihnachten count = soll - ist Print "In";count;"Tagen ist Weihnachten." |
JDDeltaFromMinutesDie Funktion JDDeltaFromMinutes berechnet, wie groß die Differenz zweier Julianischer Daten ist, die sie sich um die gegebene Anzahl von Minuten unterscheiden. Damit kann man Daten und Uhrzeiten ermitteln, die um eine gegebene Zeitdifferenz vor oder nach einem bekannten Zeitpunkt liegen.
<numVar>: numerische Variable, empfohlender Datentyp: Real
Beispiele: Wir wollen wissen wie spät es in 73,5 Minuten ist |
DIM zeit as DateAndTime DIM ist, soll, count as Real zeit = SysGetTime() ist = JDFromDAT(zeit) ' aktuelles Julianisches Datum soll = ist + JDDeltaFromMinutes(73.5) zeit = DATFromJD(soll) ' DateAndTime-Struktur bilden Print "In 73,5 min ist es ";FormatTime$(zeit);" Uhr" |
| Die folgende Function liefert TRUE, wenn sich zwei Daten um mehr als 1 Stunde unterscheiden. Als Vergleichswert wählen wir 60.001 Minuten (ca. 1/10 Sekunde mehr als 1 h) weil es durch die interne Zahlendarstellung zu minimalen Abweichungen kommen kann. |
FUNCTION CompareTime(dat1, dat2 AS DateAndTime) as Real
DIM jd1, jd2, diff as Real
jd1 = JDFromDAT(dat1)
jd2 = JDFromDAT(dat2)
if ( jd1 > jd2 ) THEN
diff = jd1 - jd2
ELSE
diff = jd2 - jd1 ' diff immer positiv
END IF
IF diff > JDDeltaFromMinutes(60.01) THEN RETURN TRUE
Return FALSE
End Function
|
| Unsere Schicht endet um 16 Uhr 15 Minuten. Wir wollen wissen wie viele Minuten wir noch arbeiten müssen. |
DIM zeit as DateAndTime
DIM ist, soll, count as Real
zeit = SysGetTime()
ist = JDFromDAT(zeit) ' aktuelles Julianisches Datum
zeit.hour = 20
zeit.minute = 15
zeit.second = 0
soll = JDFromDAT(zeit) ' Julianisches Datum vom Feierabend
IF ist > soll THEN
count = (ist-soll)/JDDeltaFromMinutes(1)
Print "Du hast schon seit "; count; " Minuten Feierabend!"
ELSE
count = (soll-ist)/JDDeltaFromMinutes(1)
Print "Du musst noch "; count; " Minuten arbeiten."
END IF
|
Interne DetailsDiese Informationen können hilfreich sein, werden aber zur Arbeit mit dem Julianischen Datum nicht unbedingt benötigt.
|
std/24 + min/1440 + sek/86400 |
Beispiele:
17.03.2016, 22 Uhr abendsJD = 2457465.41666667 18.03.2016, Null Uhr (morgens)JD = 2457465.5 18.03.2016, 8 Uhr morgensJD = 2457465.83333333
^2.11.3 SpeicherzugriffGelegentlich benötigt man einfach eine bestimmte Menge Speicher, die man nach den eigenen Vorstellungen organisieren kann. R-BASIC ermöglicht zwar keinen direkten Zugriff auf den Hauptspeicher des Computers (das wäre zu unsicher), stellt dem Programmierer aber 64 kByte "geschützten" (virtuellen) Speicher zur Verfügung, der aus Sicht des Programms als 64 kByte fortlaufender Speicher über die Adressen 0 bis 65635 (hexadezimal &h0 bis &hFFFF) angesprochen werden kann. Der Zugriff auf diesen Speicher erfolgt schreibend über diverse Poke- und lesend über die passenden Peek-Befehle (siehe Tabelle).
<string> Ein Stringausdruck. <struktur> Eine Strukturvariable oder eine Funktion, die eine Struktur liefert. Es sind sowohl R-BASIC Strukturen als auch selbst definierte Strukturen zulässig. <nVar> numerische Variable. <sVar$> String-Variable. <stVar> Strukturvariable.
^2.11.4 DATA-ZeilenDie DATA-Anweisung dient dazu, feste Werte im Programm abzulegen, auf die zum gegebenen Zeitpunkt - bei Bedarf auch mehrfach - zugegriffen werden kann. Mit Hilfe der READ-Anweisung werden die Werte aus den DATA-Zeilen gelesen. RESTORE wird verwendet, um eine bestimmte DATA-Zeile anzuwählen. Dazu muss mit der Anweisung LABEL eine Codezeile markiert werden, auf die Restore verweisen kann.DATA-Zeilen sind der klassische Weg um Daten (Zahlen und Strings) in einem BASIC-Programm unterzubringen. Die Verwendung von DATA-Zeilen ist ein veralteter Programmierstil und sie verbrauchen sehr viel Speicher im Programmcode. Für größere Datenmengen können Sie zum Beispiel externe Dateien verwenden, für Bilder können Sie auch die Picture-List (Menüpunkt: Extras) benutzen. Manchmal, insbesondere wenn Sie nur kleine Datenmengen haben, sind DATA-Zeilen trotzdem sehr nützlich.
Sie können die Anweisungen DATA, READ, und RESTORE auch innerhalb einer Library verwenden. R-BASIC verwaltet die Werte für das Hauptprogramm und jede eingebundene Library getrennt, so dass eine gegenseitige Beeinflussung ausgeschlossen ist. Sie können also auch nicht vom Hauptprogramm aus mit READ auf die DATA-Werte einer Library zugreifen.
DATASyntax: DATA Wert [, Wert [, Wert] ... Wert: jeweils eine Konstante vom Typ REAL oder STRING, Variablen sind nicht zulässig. Beispiele: |
DATA 12, 144, 13, 169 DATA "Paul", "Müller", "Malocher" |
READSyntax: READ <var> [, <var>] [, <var>] ... <var> bezeichnet die zu belegenden Variablen. Hinweise:
Der folgende Code liest die Werte aus den DATA-Zeilen aus dem Beispiel zum Befehl DATA (oben). |
READ A, B, C, D READ Vorname$, Name$, Job$ |
RESTORESyntax: RESTORE RESTORE <label> <label> ist ein im Programm definiertes Label. Hinweise:
|
DATA 1,2,3,4,5,6,7,8 LABEL Liste1 DATA "a","b","c","d","e","f" .... RESTORE ' zur ersten DATA-Zeile RESTORE Liste1 ' zur DATA-Zeile ab Liste1 |
Allgemeine Hinweise:
|
LABEL Liste1 DATA 10, 12, 19, 20 DATA 10.8, 7.06, 51.2, 8.13 ' Beachten: Punkt als Dezimaltrennzeichen RESTORE Liste1 ' DATA-Zeiger setzen READ a, b, c, d ' liest die Werte 10, 12, 19, 20 READ e, f, g, h ' liest die Werte 10.8, 7.06, 51.2, 8.13 .... RESTORE Liste1 READ e, f, g, h ' liest wieder die Werte 10, 12, 19, 20 |
|
Kompatibilität
R-BASIC unterstützt auch die in vielen BASIC-Interpretern verwendete Kombination "RESTORE Zeilennummer". Das kann die Übertragung fremder BASIC-Programme vereinfachen. Die "Zeilennummer" muss dabei explizit angegeben sein (z.B. "1000 DATA ..."). Sie sollten diese Variante in eigenen Programmen nicht verwenden.
LABELDie Anweisung LABEL (Marke) vereinbart ein Ansprungziel für GOTO, RESTORE oder GOTO.Syntax: LABEL <sprungZiel> <sprungZiel>: Name, unter dem die Stelle erreicht werden kann. Beispiel: |
GOTO keinFehler ' verzweigt das Programm nach unten .... ' hier passiert etwas anderes LABEL keinFehler ... ' hier geht es dann weiter |
Hinweise:
^2.11.5 System ServicesHier finden Sie eine Liste der wichtigsten Systemservices, die von R-BASIC aus benutzt werden können, sowie Informationen, wo sie beschrieben werden. Die meisten dieser Services werden von GEOS-Objekten bereitgestellt.TastaturDie meisten Objekte unterstützen die Tastatur automatisch, ohne weiteres Zutun des Programmierers. Zum direkten Zugriff auf die Tastatur stehen Ihnen folgende Möglichkeiten zur Verfügung:
MausDie meisten Objekte unterstützen die Maus automatisch, ohne weiteres Zutun des Programmierers. Wenn Sie selbst direkt auf Mausereignisse reagieren wollen müssen Sie einen Maushandler schreiben. Maushandler werden automatisch aufgerufen, wenn der Nutzer die Maus bewegt oder eine der Maustasten betätigt. Sie werden im Handbuch "Spezielle Themen", Kapitel 17 (Arbeit mit der Maus) beschrieben.ClipboardÜber die Zwischenablage (Clipboard) können R-BASIC Programme Daten (z.B. Texte oder Grafiken) mit anderen Programmen austauschen. Die Arbeit mit der Zwischenablage wird im Handbuch "Spezielle Themen", Kapitel 5 (Arbeit mit der Zwischenablage) beschrieben.HilfedateienR-BASIC stellt Ihnen das GEOS-weite Hilfesystem zur Verfügung. Im Kapitel 4 des Handbuchs "Spezielle Themen" (Einbinden von Hilfedateien) ist beschrieben, wie man das Hilfesystem einsetzt.TimerEin Timer stellt eine Routine bereit, die in regelmäßigen Abständen automatisch aufgerufen wird. Timer sind im Kapitel 16 des Handbuchs "Spezielle Themen" (Timer) ist beschrieben.DateiarbeitR-BASIC unterstützt die Arbeit mit DOS- und GEOS-Dateien. Sie können sowohl Binär- als auch Text-Dateien lesen und schreiben. Die Arbeit mit Dateien ist in folgenden Kapiteln des Handbuchs "Spezielle Themen" beschrieben.
DokumenteIm Kapitel 15 des Handbuchs "Spezielle Themen" (Implementieren eines Dokument-Interfaces) finden Sie eine ausführliche Anleitung, wie man unter R-BASIC die Funktionen des "Datei" Menüs implementiert. Einen großen Teil der Funktionen übernimmt dabei ein Objekt der Klasse DocumentGuardian. Diese Objekte arbeiten mit der Library "DocumentTools" zusammen und sind im Objekt-Handbuch, Kapitel 4.13, beschrieben.Automatisches GeometriemanagementEine der wesentlichen Eigenschaften des GEOS Systems ist seine Fähigkeit, die Objekte automatisch so anzuordnen, dass sie alle gut sichtbar sind ohne sich zu überlappen. Diese Fähigkeit ist auf elementarer Systemebene implementiert und im Objekt-Handbuch, Kapitel 3.3 (Geometriemanagement) beschrieben.^ |