 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Tim

Anmeldungsdatum: 21.10.2005 Beiträge: 13 Wohnort: Bad Homburg
|
Verfasst am: 09.02.2006, 17:55 Titel: ESC Abbruch |
|
|
Hi,
ich würde gerne etwas in meinem Programm einbauen damit, wenn es läuft, ich bei einem INPUT ESC drücken kann um das Programm zu beenden.
Ich weiß aber nicht was für Befehle ich benutzten soll um inmitten eines INPUT dies möglich zu machen...
Kann mir jemand helfen?  |
|
Nach oben |
|
 |
Mao
Anmeldungsdatum: 25.09.2005 Beiträge: 4409 Wohnort: /dev/hda1
|
Verfasst am: 09.02.2006, 17:57 Titel: |
|
|
Du müsstest dir eine eigene Eingabefunktion bauen.
Such gerade nach dem Forenlink...
/edit: Kein Link, dafür den Code:
Hatte ich irgendwo mal gepostet, jb hat noch die Auswertung der Backspacetaste eingebaut. Im Moment erstmal auf eine normale Eingabeschleife zurechtgestutzt.
Code: |
SCREEN 7, , 0, 1
DO
taste$ = INKEY$
SELECT CASE taste$
CASE CHR$(8)
IF LEN(Eingabe$) THEN Eingabe$ = LEFT$(Eingabe$, LEN(Eingabe$) - 1)
CASE CHR$(13)
EXIT DO
CASE CHR$(27)
Eingabe$ = ""
CASE CHR$(31) TO CHR$(127)
Eingabe$ = Eingabe$ + taste$
END SELECT
LOCATE 5, 5: PRINT Eingabe$
PCOPY 0,1
CLS
LOOP
|
Das Double Buffering wird nur verwendet, da die Anzeige sonst flimmern würde. Dies könnte umgangen werden, wenn nur jedes neu hinzugekommene Zeihen auf dem Bildschirm ausgegeben wird bzw. das letzte Zeichen vom Bildschirm gelöscht wird.
Viel Spaß damit,
Mao _________________ Eine handvoll Glück reicht nie für zwei.
--
 |
|
Nach oben |
|
 |
jb

Anmeldungsdatum: 14.01.2005 Beiträge: 2010
|
Verfasst am: 09.02.2006, 18:23 Titel: |
|
|
Das Doublebuffering kann man auch vermeiden, wenn man überprüft, ob sich die Länge des Wortes
nach der Eingabeschleife verändert hat:
Code: |
SUB Eingabe (text$)
' Die Eingabe resetten
e$ = ""
' Cursorposition holen
zeile = csrlin
spalte = pos(0)
' Eingabeschleife
DO
' Tastatur abfragen
taste$ = inkey$
' alte Länge der Eingabe sichern
oldlength = LEN(e$)
' Welche Taste wurde gedrückt?
SELECT CASE taste$
' Backspace
CASE CHR$(8)
IF LEN(e$) THEN e$ = LEFT$(e$, LEN(e$) - 1)
' Enter
CASE CHR$(13)
EXIT SUB
' Escape
CASE CHR$(27)
EXIT SUB
' irgendein alphanumerisches Zeichen
CASE CHR$(31) TO CHR$(127)
e$ = e$ + taste$
END SELECT
' Hat sich die Eingabe verändert?
IF LEN(e$) <> oldlength THEN
IF LEN(e$) < oldlength THEN
LOCATE zeile, spalte: PRINT Eingabe$
ELSE
LOCATE zeile, spalte: PRINT STRING$(oldlength, " ")
LOCATE zeile, spalte: PRINT Eingabe$
END IF
LOOP
END SUB
|
Der obige Code ist eine SUB. Um ihn einzubauen, kopiere ihn einfach in dein Programm hinein.
Um diese SUB aufzurufen, genügt das folgende kleine Programm:
Code: |
DECLARE SUB Eingabe (text$)
SCREEN 0
CLS
PRINT "Das ist ein Test!"
Eingabe dummy$
END
|
Die Codes habe ich jetzt nicht getestet, sie sollten aber funktionieren...
Übrigens: Teile der Antwort hättest du auch in der MonsterFAQ gefunden
jb |
|
Nach oben |
|
 |
Tim

Anmeldungsdatum: 21.10.2005 Beiträge: 13 Wohnort: Bad Homburg
|
Verfasst am: 09.02.2006, 19:43 Titel: An: Mao |
|
|
An: Mao
Welche SCREEN soll ich ändern um einen höherauflösenden Bildschirm zu bekommen? |
|
Nach oben |
|
 |
Devilkevin aka Kerstin

Anmeldungsdatum: 11.11.2004 Beiträge: 2532 Wohnort: nähe Mannheim
|
Verfasst am: 09.02.2006, 19:53 Titel: Re: An: Mao |
|
|
Tim hat Folgendes geschrieben: |
Welche SCREEN soll ich ändern um einen höherauflösenden Bildschirm zu bekommen? |
Was verstehst du unter "Hochauflösend"?? Um "gängige" Windowsgrößen hinzubekommen brauchst du:
a) eine Lib (ich glaub die AK Lib kann das)
oder
b) freeBASIC (<-- fB kann "von haus aus" hohe Auflösungen) _________________ www.piratenpartei.de |
|
Nach oben |
|
 |
Michael Frey

Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
|
Nach oben |
|
 |
Tim

Anmeldungsdatum: 21.10.2005 Beiträge: 13 Wohnort: Bad Homburg
|
Verfasst am: 10.02.2006, 15:32 Titel: |
|
|
Mao schrieb in seinem code:
SCREEN 7, , 0, 1
Welche Zahl(en) soll ich ersetzten? |
|
Nach oben |
|
 |
Michael Frey

Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 10.02.2006, 17:27 Titel: |
|
|
Jetzt wo ich es genau ansehe, wird's komplexer, durch das Double Buffering geht screen 12 nicht ...
Ich entferne jetzt einfach das Doulbe Buffering und ändere den Code so ab das er sauber auf Screen 12 läuft:
Code: | SCREEN 12
DO
taste$ = INKEY$
SELECT CASE taste$
CASE CHR$(8)
IF LEN(Eingabe$) THEN
Eingabe$ = LEFT$(Eingabe$, LEN(Eingabe$) - 1)
Locate 5,5
Print Eingabe$+" "
End if
CASE CHR$(13)
EXIT DO
CASE CHR$(27)
Eingabe$ = ""
CASE CHR$(31) TO CHR$(127)
Eingabe$ = Eingabe$ + taste$
END SELECT
LOCATE 5, 5: PRINT Eingabe$
LOOP |
_________________ http://de.wikibooks.org/wiki/FreeBasic Jede Hilfe für dieses Buch ist Willkommen!
http://de.wikibooks.org/wiki/FreeBasic:_FAQ FAQ zu Freebasic (im Aufbau, hilfe Willkommen)
Neu mit Syntax Highlight |
|
Nach oben |
|
 |
jb

Anmeldungsdatum: 14.01.2005 Beiträge: 2010
|
Verfasst am: 10.02.2006, 17:51 Titel: |
|
|
Ähm mal ganz am Rande: Mein obiger Code bietet dir genau das, was du gesucht hast, Tim
Dieser Code funktioniert wie INPUT und wird in allen Grafikauflösungen *ohne* Doublebuffering dargestellt
jb |
|
Nach oben |
|
 |
Thomas Antoni

Anmeldungsdatum: 12.10.2004 Beiträge: 220 Wohnort: Erlangen
|
Verfasst am: 11.02.2006, 21:28 Titel: Somit lautet der entsprechende MonsterFAQ-Eintrag... |
|
|
Somit lautet der entsprechende MonsterFAQ-Eintrag, der fast alle Aspekte des Programmabbruchs mit Esc behandelt, wie folgt:
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.12.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:
Code: |
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:
Code: |
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 ESCEREIGN.BAS.
Code: |
'***************************************************************************
' ESCEREIGN.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
|
*** 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:
Code: |
'****************************************************************
' 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 i‚in 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
|
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.
Code: |
'************************************************************************
' 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
|
_________________ +++ Die beliebte QBasic CD-ROM von QBasic.de - 670 MB QBasic-Stuff mit komfortabler HTML-Oberfläche. Für nur 5 EUR bestellbar auf www.antonis.de/qbcdueb.htm +++ |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|