2.7 Eingaben durch den Nutzer

^

2.7.1 Eingabe von Text und Zahlen

In vielen Fällen muss der Nutzer während des laufenden Programms bestimmte Werte oder andere Daten eingeben. In einem objektorientierten BASIC-Programm werden dazu Textobjekte (Klassen Memo oder InputLine) oder Objekte der Klasse Number (Anzeige und Eingabe von Zahlen) verwendet. Diese Objekte werden ausführlich im Objekthandbuch beschrieben.

Manchmal ist es jedoch gewünscht Daten direkt auf dem Grafikbildschirm einzugeben oder es lohnt sich nicht, wegen einer kurzen Eingabe eine Dialogbox mit einem Textobjekt zu programmieren. Für diesen Zweck gibt es im Standard-BASIC den Befehl INPUT (Eingabe direkt auf dem Grafikbildschirm) und in R-BASIC zusätzlich den Befehl InputBox (Eingabe in einer Dialogbox). Wenn Sie einzelne Zeichen von der Tastatur einlesen wollen, stehen Ihnen die Funktionen InKey$, GetKey, GetKeyLP und GetKeyState zur Verfügung, die im nächsten Abschnitt beschrieben werden.

INPUT

Der Befehl INPUT ( = Eingabe) fordert vom Nutzer eine oder mehrere Werte an. Die Eingabe erfolgt dabei direkt auf dem Schirm. Zum Editieren stehen die Cursortasten (Pfeiltasten) links und rechts, Backspace, Pos1 und Ende zur Verfügung.
Syntax: INPUT [infoString;] var [, var] [, var]
infoString (optional)
Dieser Text wird ausgegeben. Es kann ein beliebiger String-Ausdruck (fester Text, Variable, Konstante, Stringfunktion) sein. Er MUSS mit einem Semikolon abgeschlossen sein. Daran erkennt R-BASIC, dass es sich um den Info-String, und nicht etwa eine einzugebende Variable handelt. Fehlt der infoString, verwendet R-BASIC ein Fragezeichen "?".

var bezeichnet die einzugebenden Variablen.
Zulässig sind alle numerischen Datentypen sowie alle String-Typen. Dazu zählen auch Feld- und Struktur-Elemente.

Beispiele:
INPUT A
INPUT "Bitte geben Sie Ihr Alter ein:"; A
C$ = "Was nun?"
INPUT C$; A$   ' Eingabe der Variable A$
               ' Auf dem Schirm erscheint "Was nun?"
INPUT C$, A$   ' Eingabe der Variablen C$ UND A$
               ' weil hinter c$ ein Koma steht.
               ' Auf dem Schirm erscheint ein Fragezeichen.
Hinweise:
  • INPUT ist ein Befehl um die Abwärtskompatibilität zu älteren BASIC Programmen zu gewährleisten. Sie sollen die Verwendung von Input in eigenen Programmen möglichst vermeiden.

  • Es ist zu empfehlen, immer nur eine Variable anzufordern.

  • Dezimaltrennzeichen ist immer der Punkt '.'

  • Werden mehrere Variablen angefordert, ist als Trennzeichen das Komma ',' erforderlich. Eine Eingabe von Texten, die ein Komma enthalten, ist dann nicht möglich.

  • Wird die Eingabezeile leer gelassen, so behalten die einzugebenden Variablen den Wert, den sie vorher hatten (Bestätigungsfunktion).

  • Sollte als aktuelle Hintergrundfarbe BG_TRANSPARENT eingestellt sein (d.h. der Hintergrund wird bei Textausgabe nicht gelöscht) so wird während der INPUT-Anweisung ein schwarzer Hintergrund verwendet.

  • Üblicher Weise ist der Screen ein BitmapContent-Objekt, wenn INPUT verwendet wird. Der Screen ist das Objekt, an das Grafik- und Textausgaben gehen (siehe Objekthandbuch, Kapitel 2.3). Input arbeitet aber auch mit anderen Objektklassen als Screen.

InputBox

Der Befehl InputBox (Eingabe in eine DialogBox) fordert vom Nutzer eine oder mehrere Werte an. Die Eingabe erfolgt dabei in einer Dialog-Box. Es stehen alle GEOS-typischen Editierfunktionen, einschließlich Drag & Drop (Verschieben mit der rechten Maustaste) zur Verfügung.


Syntax: InputBox infoString; var [, var] [, var]
infoString: Dieser Text wird ausgegeben.
Es kann ein beliebiger String-Ausdruck (fester Text, Variable, Konstante, Stringfunktion) sein. Der Text wird in der Dialogbox angezeigt.

var bezeichnet die einzugebenden Variablen.
Zulässig sind alle numerischen Datentypen sowie alle String-Typen. Dazu zählen auch Feld- und Struktur-Elemente.

Beispiel:
InputBox "Bitte geben Sie Ihr Alter ein:"; A

Hinweise: siehe INPUT

^

2.7.2 Direkte Abfrage der Tastatur

In vielen Fällen werden Sie zur Eingabe von Text oder Zahlen die entsprechenden R-BASIC Objekte (Klassen Memo, InputLine oder Number) verwenden. Wenn Sie jedoch auf einzelne Zeichen, die über die Tastatur eingegeben werde, reagieren wollen, sollten Sie einen Tastaturhandler (OnKeyPressed Handler) schreiben. Tastaturhandler sind im Handbuch "Spezielle Themen", Kapitel 14 (Arbeit mit der Tastatur) beschrieben.

Für einfache Fälle und zur Wahrung der Abwärtskompatibilität stehen Ihnen zusätzlich die Funktionen InKey$, GetKey, GetKeyLP und GetKeyState zur Verfügung, die im Folgenden beschrieben werden.

InKey$

Die Funktion InKey$ (Input Keyboard = Tastatureingabe) liest ein einzelnes ASCII-Zeichen von der Tastatur ein. Bestimmte Steuerzeichen werden ebenfalls erkannt. InKey$ liefert einen Leerstring, wenn keine Taste gedrückt ist oder die Taste bereits abgefragt wurde.
Syntax: <stringVar> = InKey$
Die in der Tabelle aufgeführten symbolischen Konstanten stehen zur Verfügung, wenn die KeyCodes-Library eingebunden wird (siehe 2. Beispiel).

Beispiele:

Warten bis Enter gedrückt wurde

WHILE InKey$ <> Chr$(13) : WEND

Einbinden des KeyCodes Library und warten bis Enter gedrückt wurde

INCLUDE "KeyCodes"
....
  WHILE InKey$ <> Chr$(ASC_ENTER) : WEND
Unter einem objektorientierten System wie GEOS sollten Sie diesen Weg vermeiden. Insbesondere die ständige Abfrage der Tastatur in einer Schleife bremst das System massiv aus und erhöht die CPU-Last.

GetKeyState

Um die aktuell gedrückten Modifier-Tasten (Shift, Ctrl, Alt) und den LockStatus (ShiftLock, NumLock, ScrollLock (=Rollen) ) abzufragen, bietet R-BASIC die Funktion GetKeyState. Kenntnisse von Bit- und logischen Operationen (siehe Kapitel 2.3.4 und 2.3.5) sind für die Anwendung dieser Funktion erforderlich.
Syntax: <numVar> = GetKeyState

<numVar>: numerische Variable
Das höherwertige Byte enthält den LockStatus. Das niederwertige Byte enthält den Shift-Status. Der Shift-Status wird auch durch die LED's an der Tastatur wiedergegeben.

Die Bits sind in der Tabelle unten erklärt.


Tabellen: Bedeutung der Bits, die von GetKeyState geliefert werden

Beispiele:

' Abfrage ob eine Shift-Taste gedrückt ist
IF GetKeyState AND ( KS_RSHIFT OR KS_LSHIFT ) THEN ....
' Abfrage ob die NUM-Lock Taste gedrückt ist
IF GetKeyState AND KS_NUM_LOCK THEN ....
' Ausblenden des Lock-Staus , nur Shift-Status beachten
shiftState = GetKeyState AND &hFF
Hinweis: Diese Informationen werden auch direkt an den OnKeyPressed Handler von Objekten übergeben (Parameter keyState). Im Handbuch "Spezielle Themen", Kapitel 14, finden Sie ausführliche Informationen dazu.

GetKey

Die Funktion GetKey ( = Hole Taste ) fragt die Tastatur ab, ob gerade eine Taste gedrückt ist und liefert den GEOS-Tasten-Code. Dies kann ein ASCII-Code sein. Bei Tasten, denen kein ASCII-Zeichen zugeordnet ist (Steuertasten) , ist es ein erweiterter Code ( > 255 ).

Im Gegensatz zu InKey$ liefert GetKey immer die aktuell gedrückte Taste, auch wenn diese bereits mehrfach angefragt wurde.


Syntax: <numVar> = GetKey
Beispiele:
' Warten bis irgendeine Taste gedrückt wurde
WHILE GetKey = 0 : WEND
' Verzweigen, je nach Teste
' Wir verwenden mit WHILE TRUE ... WEND eine "Endlosschleife"
' die beim Drücken der Taste '3' verlassen wird
CLS
WHILE TRUE
On GetKey SWITCH
  case ASC("0"): print "Null": End case
  case ASC("1"): print "Eins": End case
  case ASC("2"): print "Zwei": End case
  case ASC("3"): print "ENDE.": BREAK    ' Schleife verlassen
End Switch
WEND
Für die meisten der Steuertasten stehen symbolischen Konstanten zur Verfügung, wenn die KeyCodes-Library eingebunden wird.

Beispiel:

' Warten bis die Enter-Taste gedrückt
' und wieder losgelassen wurde
INCLUDE "KeyCodes"
CLS
Print "wait..."
While GetKey <> Key_Enter : Wend
While GetKey = Key_Enter : Wend
Print "Fertig."
...

GetKeyLP

GetKeyLP (Get Key, Last Pressed) tut weitgehend das gleiche, wie GetKey. Der einzige Unterschied ist, dass GetKeyLP, wenn es erstmalig nach dem Loslassen einer Taste gerufen wird, deren Tastencode noch liefert.

Das bedeutet konkret:

  • Während eine Taste gedrückt ist, sind GetKey und GetKeyLP identisch

  • Wird GetKey gerufen, nachdem die Taste losgelassen wurde, liefert es immer NULL.

  • Wird GetKeyLP erstmalig gerufen, nachdem die Taste losgelassen wurde, liefert es den Tastencode der zuletzt gedrückten Taste.

  • Wird GetKeyLP bei losgelassener Taste weitere Male gerufen, liefert es NULL. Der erstmalige Aufruf von GetKeyLP bei losgelassener Taste löscht also den Tastenpuffer.
Verwenden Sie GetKey, wenn Sie eine präzise Tastatursteuerung benötigen, z.B. in einem Spielprogramm.

Verwenden Sie GetKeyLP, wenn Sie sicherstellen wollen, dass auch kurze Tastendrücke registriert werden sollen, auch wenn Ihr Programm "beschäftigt" ist. Dass kann z.B. eine umfangreiche Berechnung oder der Delay-Befehl sein.


Syntax:<numVar> = GetKeyLP
Beispiel
DIM x
x = GetKeyLP       ' Tastenpuffer löschen, falls nötig
Print "Drücken Sie eine beliebige Taste zu Beenden!"
Delay 60           ' Eine Sekunde Verzögerungszeit
While GetKeyLP = 0
  Print "*"
    Delay          ' Warten bis eine Sekunde vorbei ist
Wend
Print "Fertig"

^

2.7.3 Messageboxen

Um auf einfache Weise Meldungen auszugeben, verfügt R-BASIC über die Funktionen MsgBox, WarningBox, ErrorBox und QuestionBox.

MsgBox

MsgBox gibt eine einfache Meldung in einer Dialogbox aus.
Syntax: MsgBox "InfoText"
Beispiele:
MsgBox "Der Prozess ist abgeschlossen"
MsgBox A$ + " ist herausgekommen!"

WarningBox

WarningBox gibt eine einfache Warnung in einer Dialogbox aus.
Syntax: WarningBox "InfoText"
Beispiele:
WarningBox "Es konnten nicht alle Daten gesichert werden."
WarningBox A$ + " ist gefährlich"

ErrorBox

ErrorBox gibt eine einfache Fehlermeldung in einer Dialogbox aus.
Syntax: ErrorBox "InfoText"
Beispiele:
ErrorBox "Es ist ein Fehler aufgetreten"
ErrorBox  A$ + " ist fehlerhaft"

QuestionBox

QuestionBox gibt eine Frage in einer Dialogbox aus, die der User mit JA oder NEIN beantworten kann.
Syntax: <numVar> = QuestionBox ( "InfoText" )
Die Klammern sind erforderlich.
Der Rückgabewert ist Null (R-BASIC-Konstante NO), wenn der User auf "Nein" klickt oder 1 (R-BASIC-Konstante YES), wenn der User auf "Ja" klickt


Beispiele:
DIM x
  x = QuestionBox("Sind Sie sicher?")
  IF x = NO THEN Print "Dann eben nicht"
IF QuestionBox("Wollen Sie das Programm beenden?") = YES \
  THEN EXIT

^

Weiter...