Tastertureingabe abfragen

Hallo Leute,

könnt ihr mir sagen, wie ich die F Tasten auf true oder false abfragen kann?

Besten Dank im vorraus.

Gruß Mathias

Hallo Mathias,

die meisten Controls haben die Ereignisse KeyDown und KeyUp, den Zustand einer bestimmten Taste muss man sich merken (Sind aber nur aktiv, wenn das Control den Focus hat!).

Alternativ gibt es die Windows-Funktion GetAsyncKeyState zur direkten Abfrage.

Echtzeitig ist beides nicht.

Gruss Reinhard

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo,

die meisten Controls haben die Ereignisse KeyDown und KeyUp,
den Zustand einer bestimmten Taste muss man sich merken (Sind
aber nur aktiv, wenn das Control den Focus hat!).

letzteres kann man umgehen, indem das KeyDown- / KeyUp-Ereignis des Formulars verwendet und die Eigenschaft KeyPreview des Formulars auf true gesetzt wird. Dann funktioniert es zumindest immer, wenn das Formular aktiv ist.

Gruß, Niels

Hallo Leute,
erstmal recht schönen Dank für Eure Antworten. Leider sind für mich Aussagen wie „wenn das Control den Focus hat!“ gänzlich nichts Aussagend. Taste mich halt grade erst an die Materie ran. Ich sollte vielleicht noch dazu sagen, das ich Virtual Pascal 2.1 für das Programm benutze. Im Reference Manual habe ich nichts über KeyUp oder Keydown gefunden. Allerdings auch nichts über Readkey. Readkey funktioniert aber einwandfrei.
In dieser Art:
repeat
taste:= readkey;
case taste of
#59 : change; //Eintrag ändern
#60 =: GOTO LBL999; //Nächster Eintrag
END;
UNTIL taste = #27;
ClrScr;
GOTO LBL1;

nach dem Sprung zu LBL1 kommt jetzt erneut eine irgendeine Abfrage.
An dieser Stelle möchte ich mit ESC das Programm verlassen können.
Das Problem hierbei ist, daß ESC schon die Bedingung dafür ist, zu LBL1
zu gelangen. Da mein Rechner schneller ist als die ESC Taste loslassen kann, bricht er in jedem Fall ab. Das Programm müsste also warten, bis ESC losgelassen wurde. Das müsste ja mit KeyUp funktionieren. Aber wie sähe jetzt so ne Zeile Aus? Und giebt es KeyUp auch bei Virtual Pascal 2.1?

Danke und Gruß Mathias

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

repeat
taste:= readkey;
case taste of
#59 : change; //Eintrag ändern
#60 =: GOTO LBL999; //Nächster Eintrag
END;
UNTIL taste = #27;
ClrScr;
GOTO LBL1;

nach dem Sprung zu LBL1 kommt jetzt erneut eine irgendeine
Abfrage.
An dieser Stelle möchte ich mit ESC das Programm verlassen
können.
Das Problem hierbei ist, daß ESC schon die Bedingung dafür
ist, zu LBL1
zu gelangen. Da mein Rechner schneller ist als die ESC Taste
loslassen kann, bricht er in jedem Fall ab. Das Programm
müsste also warten, bis ESC losgelassen wurde. Das müsste ja
mit KeyUp funktionieren. Aber wie sähe jetzt so ne Zeile Aus?
Und giebt es KeyUp auch bei Virtual Pascal 2.1?

Danke und Gruß Mathias

Hallo Mathias,

du verstehst dein eigenes Programm ganz falsch: du liest ein, welche Taste gedrückt wurde, und hast den Wert in der variable „Taste“. Da bleibt er auch unverändert, egal was in der bösen Welt draussen geschieht. Dass die Bedingung Taste=#27 erfüllt ist, hat also garnichts damit zu tun, ob du die Taste losgelassen hast, sondern damit, dass du den Wert von Taste in der Zwischenzeit nicht neu eingelesen hast.

Gruss Reinhard

Hallo Reinhard,

den oben gelisteten Teil hab ich schon richtig verstanden. Mein Problem liegt im Anschließenden (bei LBL1)Teil. Ich habe das Listing nur eingefügt, um zu verdeutlichen wo mein Problem liegt. Meine Versuche mit taste zu Null setzen und erneut mit einer Schleife abfragen sind alle zu Zeitkritisch. Mein Problem liegt jetzt bei der Anwendung von KeyUp. Sprich wie sieht die Syntax aus?

Gruß Mathias

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

den oben gelisteten Teil hab ich schon richtig verstanden.
Mein Problem liegt im Anschließenden (bei LBL1)Teil. Ich habe
das Listing nur eingefügt, um zu verdeutlichen wo mein Problem
liegt. Meine Versuche mit taste zu Null setzen und erneut mit
einer Schleife abfragen sind alle zu Zeitkritisch. Mein
Problem liegt jetzt bei der Anwendung von KeyUp. Sprich wie
sieht die Syntax aus?

Gruß Mathias

Hallo Mathias,

das Zeitkritische ist nicht dein Problem: ich kenne Virtual Pascal zwar nicht, aber üblicherweise liefert ReadKey einen Wert für jeden einzelnen Tastendruck, d.h. wenn du 2 x auf Esc abfragst, musst du auch 2 x Esc drücken. Ob du die Taste dazwischen losgelassen hast, ist Sache des Betriebssystems und des Compilers. Falls du die Taste nicht loslässt und/oder nicht erneut Esc drückst, wartet die Funktion Readkey solange.

Entweder hast du also nicht erneut abgefragt oder Virtual Pascal arbeitet fehlerhaft, sonst kannst du nicht für einmal drücken 2 x Esc einlesen. So etwas wie Keyup wird überhaupt nicht benötigt.

Gruss Reinhard

Hallo,

könnt ihr mir sagen, wie ich die F Tasten auf true oder false
abfragen kann?

Du hättest mal gleich sagen sollen, womit Du programmierst.
da könnstest Du den netten Leuten, die antworten sollen,
die Zeit sparen, auf Delphi einzugehen.

Hier ein kleines Beispiel für eine Tastaturabfrage in
einem Menü aufruf (TurboPascal).
Gruß Uwi

begin
 MenuFenster;
 repeat
 B:=ord(readkey);
 if B=0 then B:=ord(readkey)+128;
 case B of
 200: f MenZl\>0 then MenuZeile(MenZl-1);{Cursor aufwärts}
 208: if MenZl