Frage deutsch
~~~~~~~~~~~~~
Wie kann ich mein Programm jederzeit mit Esc abbrechbar machen?
 

Question English
~~~~~~~~~~~~~~
How cann I abort my programm with the Esc key in any situation?
 

Antwort 1
~~~~~~~~~~~~~~
[ von Thomas Antoni, 11.1999 - 16.1.2006 ]
 
Lege alles was Du tun willst in eine ständig durchlaufene DO...LOOP-Schleife. An einer Stelle in dieser Schleife fragst Du ab, ob eine Taste betätigt ist. War es die Esc-Taste CHR$(27), so brichst Du Dein Programm mit END ab. Das kann in etwa so aussehen:
 
DO
i = i + 1
PRINT i
LOOP WHILE INKEY$ <> CHR$(27)
END
 
Wenn das eigentliche Programm ebenfalls Tasten abfragt, dann orientiere Dich an dem folgenden Beispielprogramm:
 
Do
taste$ = INKEY$
SELECT CASE taste$
CASE "1" 'Bearbeitung wenn Taste "1" betätigt
...
CASE "2" 'Bearbeitung wenn Taste "2" betätigt
...
CASE ELSE
... 'Bearbeitung wenn eine andere Taste betätigt
CASE ""
... 'Bearbeitung wenn keine Taste betätigt
END SELECT
LOOP WHILE taste$ <> CHR$(27) 'Schleife abbrechen bei Esc-Taste
END 'Programm beenden, wenn Esc-Taste betätigt
 
Wenn Du Dein Programm so "kryptisch" schreiben willst, dass es kaum ein Anderer versteht, dann kannst Du die Esc-Taste auch mit ON KEY... ereignisgesteuert, d.h. vollkommen unabhängig vom Hauptprogramm abfragen und bearbeiten :-)) Wie das geht, zeigt mein folgendes Programm ESCEREIG.BAS.

 
'***************************************************************************
' ESCEREIG.BAS = Ereignisgesteuerter Programmabbruch mit der Esc-Taste
' ============
' Dieses Q(uick)Basic-Programm zeigt, wie man die Esc-Taste unabhaengig
' vom Hauptprogramm ereignisorientiert mit ON KEY abfragen kann. Die
' Ereignisroutine "Beenden" erzwingt ein Beenden des laufenden Programms
' (c) Thomas Antoni, 16.12.05 - www.qbasic.de
'***************************************************************************
'
'-------------- Esc-Taste als Taste 15 einrichten --------------------------
KEY 15, CHR$(0) + CHR$(1) 'Esc (Scan-Code 1) ohne Shift (0) als anwender-
'definierte Taste 15 setzen
ON KEY(15) GOSUB Beenden 'Sub "Beenden" bei Esc-Taste anspringen
KEY(15) ON 'Ereignisorientierte Bearbeitg.v.Key 15 aktivieren
'
'-------------- Hauptprogramm, aufsteigende Zahlen anzeigen ----------------
DO
i = i + 1
PRINT i
LOOP
'
'--------------- Ereignisroutine -------------------------------------------
Beenden: END
 
Das obige Programm steht im Verzeichnis Progs\ zur Verfügung sowie online unter www.antonis.de/faq/progs/escereig.bas .
 
*** INPUT-Tasteneingabe mit Esc abbrechen
Beide genannten Methoden funktionieren nicht während Tastatureingaben mit INPUT. Diese kann man normalerweise nur mit [Strg + C] abbrechen. Soll auch während Tastatureingaben ein Abbruch mit der Esc-Taste möglich sein, so musst Du eine eigene Eingaberoutine erstellen, die Zeichen für Zeichen einzeln einliest und dabei INKEY$ statt INPUT verwendet.
 
Das folgende Programm zeigt, wie man so eine mit Esc abbrechbare Eingaberoutine realisieren kann:
 
'****************************************************************
' INPUESC.BAS = INPUT mit Esc abbrechbar machen (Eingaberoutine)
' ===========
'
' Dieses Q(uick)Basic-Programm demonstriert, wie man eine
' Tastatureingabe mit Exc abbrechbar machen kann. Die enthaltene
' Funktion "Eingabe$()" ersetzt den INPUT-Befehl. Die Esc-Taste
' hat dieselbe Funktion erhalten wie die Eingabetaste: Sie
' beendet die Eingabe und uebergibt den eingebenen Textstring an
' das aufrufende Programm.
'
' Hierzu wird jede Tastenbetaetigung einzeln mit INKEY$ abgefragt.
' Im Gegensatz dazu kann eine Eingabe mit dem INPUT-Befehl nicht
' mit Esc abgebrochen werden. Esc bewirkt hier lediglich ein
' Ruecksetzen der Eingabewertes. Bei INPUT erfolgt der Abbruch
' mit [Strg+C] statt mit Esc. Das erschwert eine durchgaengige
' Bedienphilosophie, bei der ein Abbruch mit Esc in JEDER
' Situation moeglich ist.
'
' (c) jb und Thomas Antoni, 11.2.2006
'********************************************************
DECLARE FUNCTION Eingabe$ ()
CLS
PRINT "Das ist irgendein Text!"
PRINT
t$ = Eingabe$ 'Eingaberoutine aufrufen
PRINT
PRINT
PRINT "Du hast Folgendes eingegeben: "; t$
END
'
FUNCTION Eingabe$
e$ = "" 'Eingabestring zuruecksetzen
zeile% = CSRLIN 'Cursorposition retten
spalte% = POS(0)
LOCATE zeile%, spalte%, 1 'Cursor anzeigen
'
DO 'Zeichen fur Zeichen in Schleife abfragen
DO: taste$ = INKEY$: LOOP UNTIL taste$ <> "" 'warten auf Taste
oldlength = LEN(e$) 'alte Laenge der Eingabe sichern
'
SELECT CASE taste$ 'Welche Taste wurde gedrueckt?
CASE CHR$(8) 'Backspace
IF LEN(e$) > 0 THEN e$ = LEFT$(e$, LEN(e$) - 1)
CASE CHR$(13) 'Eingabetaste
EXIT DO
CASE CHR$(27) 'Esc-Taste beendet die Eingabe
EXIT DO 'Hier "END" eintragen, wenn das ganze Programm
'mit Esc abgebrochen werden soll
CASE CHR$(31) TO CHR$(127) 'beliebiges alfanumerisches Zeichen
e$ = e$ + taste$
END SELECT
'
IF LEN(e$) <> oldlength THEN 'hat sich die Eingabe veraendert?
IF LEN(e$) > oldlength THEN 'Eingabestring ist laenger geworden
LOCATE zeile%, spalte%
PRINT e$;
ELSE 'Eingabestring ist kuerzer geworden
LOCATE zeile%, spalte%
PRINT STRING$(oldlength, " "); 'alte Anzeige loeschen
LOCATE zeile%, spalte%
PRINT e$; 'Neuen Eingabestring anzeigen
END IF
END IF
LOOP
Eingabe$ = e$
END FUNCTION
 
Das obige Programm steht im Verzeichnis Progs\ zur Verfügung sowie online unter www.antonis.de/faq/progs/inpuesc.bas .
 
Weitere Beispiele für derartige Eingaberoutinen findest Du in der nachfolgenden "Antwort 2" und im FAQ-Eintrag
"Wie kann ich Tastatureingaben fester Länge programmieren?" .
 
 

Antwort 2
~~~~~~~~~~~~~
[ von Lebostein (Lebostein*gmx.de ) im QB-Forum, 19.5.2003 ] ""
 
Mein folgendes Programm KEYESC.BAS zeigt, wie man Tastureingaben jederzeit mit ESC abbrechbar machen kann. Dies ist nicht mit dem Befehl INPUT möglich (Engaben per INPUT sind vom Anwender nur mit [Strg+C] abbrechbar), sondern man muss dafür die Tastenbetätigungen mit Hilfe des INKEY-Befehls einzeln erfassen.
 
'************************************************************************
' KEYESC.BAS - Tastatureingabe, die mit Esc abbrechbar ist
' =============================================================
' Diese Routine ersetzt den INPUT-Befehl und ermoeglicht es im Gegensatz
' zu diesem, die Eingabe mittendrin mit der Esc-Taste abzubrechen.
' Beim INPUT-Befehl hingegen bricht die Esc-Taste nicht die ganze Eingabe
' ab, sondern loescht nur die bis dahin erfolgte Eingabe und wartete auf
' eine erneute Eingabe. Ein laufender INPUT laesst sich nur mit [Strg+C]
' abbrechen.
'
' Der Anwender wird aufgefordert, einen Text einzugeben. Esc bricht die
' Tasteneingabe ab und uebergibt einen Leerstring. Der eingegebene Text
' laesst sich mit der Backspace-Taste ("Zurueck") editieren.
'
' Von Lebostein (Lebostein*gmx.de), 19.5.2003
'************************************************************************
CLS
Eingabe$ = ""
PRINT "Eingabe: ";
DO
LOCATE , , 1 'blinkenden Cursor anzeigen
DO: Taste$ = INKEY$: LOOP WHILE Taste$ = ""
'
SELECT CASE Taste$
CASE CHR$(32) TO CHR$(255) 'darstellbares ASCII-Zeichen
Eingabe$ = Eingabe$ + Taste$
CASE CHR$(8) 'Backspace-Taste
IF LEN(Eingabe$) > 0 THEN Eingabe$ = LEFT$(Eingabe$, LEN(Eingabe$) - 1)
'Backspace-Taste loescht den letzten Buchstaben
CASE CHR$(13) 'Enter beendet die Eingabe
EXIT DO
CASE CHR$(27) 'Esc loescht die Eingabe und bricht sie ab
Eingabe$ = ""
EXIT DO
END SELECT
'
LOCATE 1, 11: PRINT SPACE$(69);
'Anzeigebereich loeschen (mit Blanks berschreiben)
LOCATE 1, 11: PRINT Eingabe$;
LOOP
LOCATE 10, 1
PRINT "Du hast Folgendes eingegeben: "; Eingabe$
SLEEP
 
Das obige Programm steht im Verzeichnis Progs\ zur Verfügung sowie online unter www.antonis.de/faq/progs/keyesc.bas .

[ The QBasic-MonsterFAQ --- Start Page: www.antonis.de/faq ]