Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

ESC Abbruch

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu QBasic.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Tim



Anmeldungsdatum: 21.10.2005
Beiträge: 13
Wohnort: Bad Homburg

BeitragVerfasst am: 09.02.2006, 17:55    Titel: ESC Abbruch Antworten mit Zitat

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? verwundert
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Mao



Anmeldungsdatum: 25.09.2005
Beiträge: 4409
Wohnort: /dev/hda1

BeitragVerfasst am: 09.02.2006, 17:57    Titel: Antworten mit Zitat

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. lächeln

Viel Spaß damit,
Mao
_________________
Eine handvoll Glück reicht nie für zwei.
--
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
jb



Anmeldungsdatum: 14.01.2005
Beiträge: 2010

BeitragVerfasst am: 09.02.2006, 18:23    Titel: Antworten mit Zitat

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 lächeln

jb
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Tim



Anmeldungsdatum: 21.10.2005
Beiträge: 13
Wohnort: Bad Homburg

BeitragVerfasst am: 09.02.2006, 19:43    Titel: An: Mao Antworten mit Zitat

An: Mao

Welche SCREEN soll ich ändern um einen höherauflösenden Bildschirm zu bekommen?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Devilkevin
aka Kerstin


Anmeldungsdatum: 11.11.2004
Beiträge: 2532
Wohnort: nähe Mannheim

BeitragVerfasst am: 09.02.2006, 19:53    Titel: Re: An: Mao Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Michael Frey



Anmeldungsdatum: 18.12.2004
Beiträge: 2577
Wohnort: Schweiz

BeitragVerfasst am: 10.02.2006, 09:55    Titel: Antworten mit Zitat

Screen 7 hat nur 320*200 Pixel, Screen 12 hat bereits 640*480.
(mehr kann QBasic nicht direkt liefern)
_________________
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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2529
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 10.02.2006, 10:41    Titel: Antworten mit Zitat

Artikel sonst zum hier besprochenen Thema:

http://www.dreael.ch/Deutsch/BASIC-Knowhow-Ecke/BildschirmMasken.html

Speziell Abschnitt "Ersatz für INPUT" beachten.
_________________
Teste die PC-Sicherheit mit www.sec-check.net
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Tim



Anmeldungsdatum: 21.10.2005
Beiträge: 13
Wohnort: Bad Homburg

BeitragVerfasst am: 10.02.2006, 15:32    Titel: Antworten mit Zitat

Mao schrieb in seinem code:

SCREEN 7, , 0, 1

Welche Zahl(en) soll ich ersetzten?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Michael Frey



Anmeldungsdatum: 18.12.2004
Beiträge: 2577
Wohnort: Schweiz

BeitragVerfasst am: 10.02.2006, 17:27    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
jb



Anmeldungsdatum: 14.01.2005
Beiträge: 2010

BeitragVerfasst am: 10.02.2006, 17:51    Titel: Antworten mit Zitat

Ähm mal ganz am Rande: Mein obiger Code bietet dir genau das, was du gesucht hast, Tim lächeln
Dieser Code funktioniert wie INPUT und wird in allen Grafikauflösungen *ohne* Doublebuffering dargestellt zwinkern

jb
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Thomas Antoni



Anmeldungsdatum: 12.10.2004
Beiträge: 220
Wohnort: Erlangen

BeitragVerfasst am: 11.02.2006, 21:28    Titel: Somit lautet der entsprechende MonsterFAQ-Eintrag... Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu QBasic. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz