Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
pfiffikus_86

Anmeldungsdatum: 10.11.2004 Beiträge: 11
|
Verfasst am: 22.01.2005, 20:54 Titel: Frage zur INKEY$ |
|
|
Grüß Gott,
ich hab mal eine Frage zu der INKEY$. Und zwar programmiere ich gerade an einer While/Wend Schleife, in der ich die Inkey$, Standart gemäß zum einlesen von Tasten benutze.
Nun meine Frage, ich will die Tasten "A" und "B" einlesen, wenn man aber eine andere, beliebige Taste drückt, soll etwas anderes (zum Beispiel ein BEEP) ausgeführt werden. Wie programmiere ich das???
Würde mich über Beispiel Codes freuen, Danke _________________ Ich programmiere lieber, als aufs Klo zu gehen! |
|
Nach oben |
|
 |
jb

Anmeldungsdatum: 14.01.2005 Beiträge: 2010
|
Verfasst am: 22.01.2005, 21:03 Titel: INKEY$ |
|
|
Hallo!
Versuch mal das:
Code: |
DO WHILE A$ <> CHR$(27) : REM solange, bis Escape gedrückt wird
A$ = INKEY$
REM Tastatur abfragen
IF A$ = "A" OR A$ = "B" THEN
REM wenn A oder B gedrückt wird
ELSE IF A$ <> CHR$(27)
REM Andernfalls
BEEP
END IF
LOOP
END
|
Alles klar?
jb |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 22.01.2005, 21:22 Titel: |
|
|
Typischer Fall für ein CASE ELSE! Codebeispiel:
Code: |
Drinbleib% = -1
DO WHILE Drinbleib%
DO
t$ = INKEY$
LOOP WHILE t$ = ""
SELECT CASE t$
CASE "a", "A"
' Behandlung A gedrückt
CASE "b", "B"
' Behandlungsroutine für <B>
CASE CHR$(0) + "H"
' Behandlungsroutine für Pfeiltaste hoch
CASE CHR$(27)
Drinbleib% = 0 ' Verlassen
CASE "0" TO "9"
' Behandlungsroutine Zifferntaste
CASE ELSE
' alles übrige
BEEP
END SELECT
LOOP |
_________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
K.I.T.T.
Anmeldungsdatum: 24.01.2005 Beiträge: 79
|
Verfasst am: 24.01.2005, 16:04 Titel: Re: INKEY$ |
|
|
jb hat Folgendes geschrieben: | Hallo!
Versuch mal das:
Code: |
DO WHILE A$ <> CHR$(27) : REM solange, bis Escape gedrückt wird
A$ = INKEY$
REM Tastatur abfragen
IF A$ = "A" OR A$ = "B" THEN
REM wenn A oder B gedrückt wird
ELSE IF A$ <> CHR$(27)
REM Andernfalls
BEEP
END IF
LOOP
END
|
Alles klar?
jb |
Moin,
ich bin relativ neu beim Programmieren mit QBASIC und hab da auch noch ein paar Fragen, was die Tastenabfrage betrifft. Also, in der ersten Zeile:
DO WHILE A$ <> CHR$ (27)
Wieso kommt da jetzt <> hin? Und was bewirkt das da genau?
Und dann: ELSE IF A$ <> CHR$(27)
Bedeutet das, wenn ich dann ESC drücke, dass dann der Ton kommt? Ich weiß ja, dass 27 ESC ist. Aber in der ersten Zeile haben wir A$ noch keinen Wert gegeben. Könnte man in der ersten Zeile anstatt die Variable A$ auch einfach INKEY$ nehmen?
Danke im Voraus.
Gruß |
|
Nach oben |
|
 |
Mecki Igel

Anmeldungsdatum: 10.09.2004 Beiträge: 985 Wohnort: Niederbayern
|
Verfasst am: 24.01.2005, 16:22 Titel: |
|
|
Hi KITT..
Du hast nach den <> in obigem Source gefragt:
Code: | DO WHILE A$ <> CHR$(27)
...
ELSEIF A$ <> CHR$(27) |
Also: Das heißt einfach nur, wenn A$ sowohl größer, als auch kleiner (mit einem Wort: ungleich) dem String 27 (also ESC) ist, dass er dann einen Piep-Ton macht, bzw, dass er solange die Schleife durchläuft, bis A$ ungleich der ESC-Taste ist.
Anstatt Code: | DO WHILE A$ <> CHR$(27) | könnte man genausogut scheiben Code: | DO UNTIL A$ = CHR$(27) |
WHILE = Während, UNTIL = Bis - aber das weißt du ja wahrscheinlich selber
Grüßle und noch viel Spaß mit QB,
Mecki
PS: Grundsätzlich musst du INKEY$ immer in eine Variable schmeißen - Inkey$ liest direkt den Tastaturpuffer aus. Bei der ersten Abfrage nach dem Inhalt von INKEY$ wäre dieser dann geleert, weil der Inhalt ja quasi in die Abfrage geflossen wäre. Somit ist er bei allen folgenden Abfragen leer, was eine Reaktion an dieser Stelle völlig vom zufall abhängig macht... Du musst also den Inhalt immer zuerst in eine Variable wie (hier A$) sichern, mit welcher du dann deine IF-Abfragen etc. durchführst. _________________ » Yodl.de: So sucht man gestern.
» Geld verdienen im Netz + ICQ.
» Firefox!
» 100€ zu gewinnen
» FreeBASIC.de |
|
Nach oben |
|
 |
Gremlin

Anmeldungsdatum: 12.12.2004 Beiträge: 142 Wohnort: Heinsberg
|
Verfasst am: 24.01.2005, 16:41 Titel: |
|
|
Zitat: | Also: Das heißt einfach nur, wenn A$ sowohl größer, als auch kleiner (mit einem Wort: ungleich) dem String 27 (also ESC) ist, dass er dann einen Piep-Ton macht, bzw, dass er solange die Schleife durchläuft, bis A$ ungleich der ESC-Taste ist. |
Besser sagt man entweder ... oder, denn 1 ist ja ungleich 2, aber nicht größer  _________________ Tja, hier konnte ihre Werbung stehen.
Pech gehabt.  |
|
Nach oben |
|
 |
K.I.T.T.
Anmeldungsdatum: 24.01.2005 Beiträge: 79
|
Verfasst am: 24.01.2005, 16:43 Titel: |
|
|
Moin,
aber könnte man nicht auch anstatt
a$ = inkey$
if a$ = "A" OR "a" then .................................
nicht auch einfach eine String Variable nehmen, also einfach ohne inkey$? Und muss man bei inkey$ eigentlich kein INPUT haben, sondern wird das nur ausgeführt, wenn man das nur drückt?
Gruß |
|
Nach oben |
|
 |
Gremlin

Anmeldungsdatum: 12.12.2004 Beiträge: 142 Wohnort: Heinsberg
|
Verfasst am: 24.01.2005, 18:17 Titel: |
|
|
INKEY$ ist nicht irgendeine Variable, INKEY$ ist eine Funktion, die imemr das aktuell gedrückte Zeichen aus dem Tastaturbuffer (oder "P"? ) zurückliefert. _________________ Tja, hier konnte ihre Werbung stehen.
Pech gehabt.  |
|
Nach oben |
|
 |
Dusky_Joe

Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
|
Verfasst am: 24.01.2005, 18:19 Titel: |
|
|
Ich hoffe, ich habe dich richtig verstanden...
Du willst jetzt anstatt INKEY$ INPUT verwenden... oder?
Dazu solltest du wissen:
INKEY$ und INPUT sind zwei paar Stiefel. Ehrlich gesagt basiert der eine auf den Anderen, so dass sie sich selber Blockeren. Ein (sehr einfacher) selbstgeschriebener INPUT-Ersatz könnte so aussehen:
Code: |
DO
i$ = INKEY$
SELECT CASE i$
CASE CHR$(8) 'ASCII-CODE für Backspace
in$ = LEFT$(in$, LEN(in$) - 1)
CASE CHR$(13) 'CODE für ENTER
EXIT DO
CASE CHR$(0) 'Wenn keine Taste gedrückt wird.
'Verhindert, dass dann das nächste Event ausgelöst wird....
CASE ELSE
in$ = in$ + i$
END SELECT
LOCATE zeile, spalte
PRINT i$
LOOP
|
Sicher, du kannst deine Tastaturabfrage auch mit INPUT machen, aber das erzeugt eben immer eine Textausgabe auf dem Bildschirm, und währenddessen können keine anderen Befehle ausgeführt werden.
Wie du übrigens aus dem Code sehen kannst:
Wenn gerade nichts gedrückt wird, liefert INKEY$ einfach CHR$(0) zurück. (In manchen Turorials wird das einfach als "" dargestellt.)
Ich hoffe, ich konnte dir helfen! _________________ fully biological degradable
Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet. |
|
Nach oben |
|
 |
MisterD

Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 24.01.2005, 19:00 Titel: |
|
|
WICHTIG::::
Schreibe nie if inkey$ = "a" OR "A". das funktioniert nicht.
if inkey$ = "a" OR inkey$ = "A" würde funktionieren
if lcase$(inkey$) = "a" wäre am einfachsten, LCase tut Großbuchstaben in Kleinbuchstaben umwandeln. _________________ "It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra |
|
Nach oben |
|
 |
Dusky_Joe

Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
|
Verfasst am: 24.01.2005, 19:19 Titel: |
|
|
Ach, funzt bitweises komplementieren auch bei Strings?
Ich weiß zwar, dass 10 AND 6 = 2, aber ned, dass des auch bei strings geht!
Wird dann von jedem Element der ASC geANDet, oder wie läuft des? _________________ fully biological degradable
Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet. |
|
Nach oben |
|
 |
MisterD

Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 24.01.2005, 21:12 Titel: |
|
|
Ich weiß ned was bei String AND String passiert, aber nicht das was gewünscht ist. _________________ "It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra |
|
Nach oben |
|
 |
K.I.T.T.
Anmeldungsdatum: 24.01.2005 Beiträge: 79
|
Verfasst am: 25.01.2005, 14:59 Titel: |
|
|
Moin,
sorry für mein Generve, aber so wie ich das sehe, muss ich immer INKEY$ und CHR$ zusammen verwenden oder?
Gruß |
|
Nach oben |
|
 |
Mecki Igel

Anmeldungsdatum: 10.09.2004 Beiträge: 985 Wohnort: Niederbayern
|
Verfasst am: 25.01.2005, 15:05 Titel: |
|
|
Nein, nicht unbedingt heißt einfach nur, dass du das Nummer'ste Ascii-Zeichen aus der Code-Tabelle haben möchtest.
Statt Code: | IF K$ = "A" THEN ... | Könntest du also auch schreiben Code: | IF K$ = CHR$(65) THEN ... | Da "A" das 65te Zeichen ist.
Nur manche Tasten kann man nicht direkt wie oben reinschreiben, zum Beispiel die ESC-Taste, oder die Funktions-Tasten.
Darum braucht man für diese den CHR$-Befehl sehr häufig.
Zitat: | Enter = 13
ESC = 27
" = 34 (schließlich kann man nicht schreiben IF K$ = """ THEN .. ) |
Und für ganz besondere Tasten (z.B. Strg links und rechts, Alt usw) musst du das ganze sogar selber machen, da reicht CHR$ dann auch nicht mehr
Grüßle,
Mecki _________________ » Yodl.de: So sucht man gestern.
» Geld verdienen im Netz + ICQ.
» Firefox!
» 100€ zu gewinnen
» FreeBASIC.de |
|
Nach oben |
|
 |
K.I.T.T.
Anmeldungsdatum: 24.01.2005 Beiträge: 79
|
Verfasst am: 25.01.2005, 16:16 Titel: |
|
|
a$ = inkey$
if a$ = "a" then beep
Eigentlich könnte ich dafür auch folgendes schreiben:
a$ = inkey$
if a$ = Chr$ (Code für a) then beep
Wenn ich da richtig liege, hab ich es kapiert.
Gruß K.I.T.T.
PS: Wie sind eigentlich die Codes für die Pfeiltasten? |
|
Nach oben |
|
 |
stef
Anmeldungsdatum: 13.01.2005 Beiträge: 102
|
Verfasst am: 25.01.2005, 17:19 Titel: |
|
|
Bei Sondertasten wie die Pfeiltasten werden gleich zwei Zeichen von INKEY$ zurück gegeben.
Das erste Zeichen hat immer den Code 0; das zweite hängt von der jeweiligen Taste ab.
Also erzeugt man einfach die beiden Zeichen und fügt sie zusammen:
IF a$ = CHR$(0) + CHR$(80) THEN PRINT "Pfeil nach unten wurde gedrückt"
Hier noch ein kleines nützliches Programm, das den ASCII-Code der jeweils gedrückten Taste ermittelt:
Code: | 'Gibt von jeder eingegeben Taste den ASCII-Code zurück.
'Beenden: ESC
CLS
DO
l$ = INKEY$
IF LEN(l$) = 1 THEN 'Einfacher Code
PRINT l$ + " = "; ASC(l$)
ELSEIF LEN(l$) = 2 THEN 'Zweifacher Code
PRINT " chr$(0) + chr$("; ASC(RIGHT$(l$, 1))
END IF
LOOP UNTIL l$ = CHR$(27) |
|
|
Nach oben |
|
 |
K.I.T.T.
Anmeldungsdatum: 24.01.2005 Beiträge: 79
|
Verfasst am: 25.01.2005, 17:53 Titel: |
|
|
Moin,
aber 80 ist der Code für P???
Gruß |
|
Nach oben |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
|
Nach oben |
|
 |
K.I.T.T.
Anmeldungsdatum: 24.01.2005 Beiträge: 79
|
Verfasst am: 25.01.2005, 18:18 Titel: |
|
|
Moin,
ich glaub ihn ja, nur das wollte ich nochmal wissen. |
|
Nach oben |
|
 |
jb

Anmeldungsdatum: 14.01.2005 Beiträge: 2010
|
Verfasst am: 25.01.2005, 18:56 Titel: Cursortastenabfrage mit INKEY$ |
|
|
Hallo!
Anstatt
CHR$(0) + CHR$(80)
( d.h immer CHR$(0) + CHR$(ASCII Code von H, M, P oder K) )
etc. kannst du auch
CHR$(0) + "H" nach oben
CHR$(0) + "M" nach rechts
CHR$(0) + "P" nach unten
CHR$(0) + "K" nach links
nehmen.
Kann man sich vielleicht ein bisschen besser merken...
Für Spiele ist das aber nicht so gut geeignet, da INKEY$ zu langsam ist,
INP(96) wäre dafür besser.
jb |
|
Nach oben |
|
 |
|