Entwickler-Ecke

Sonstiges (Delphi) - Auf Tastendruck warten


Mr_T - So 12.01.03 13:51
Titel: Auf Tastendruck warten
Hi Leute!
Ich habe ne Frage:
Ist es möglich wie im alten Pascal auf einen Tastendruck zu warten (damals hieß das teil glaube ich "keypressed") .... die ganze Sache soll so aussehen, das gewartet wird, bis eine Tastaturtaste gedrückt wurde (oder per ALT+Nummernblock ein ASCI - Code gesendet kommt) und mir dann irgendwie der Tastencode (oder das Zeichen.... umwandeln ist ja nicht so schwer) zurückgeliefert wird.
Danke schonmal.....


tommie-lie - So 12.01.03 14:08

'n morgen...

Ich weiß nicht, ob da in deine Anwendung passen würde, aber es gibt in der Form ein KeyDown-Event. Das wird ausgelöst, wenn was gedrückt wird. Darein könntest du schreiben, was passieren soll, wenn eine taste gedrückt wird. Welche Taste, wird auch gleich mitgeliefert.


Mr_T - So 12.01.03 14:31

Ne sorry das funzt bei mir nicht... ich habe bislang versuchte es so zu machen:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
......
waitforkey := true;

 repeat
 sleep(50);
 application.ProcessMessages;
 until waitforkey = false;
....
procedure TForm2.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
 if waitforkey = true then
 begin
 rk := char(key);
 waitforkey := false;
 end
end;


Aber dabei hängt asich das ganze Prog immer auf (KeyPreview auf true) .... waitforkey ist ne globale boolean und rk ist ein char........


tommie-lie - So 12.01.03 14:38

ob char(key) geht weiß ich nicht, müsste ich auch erst meinen Compiler anwerfen.
Im Prinzip sollte es aber so oder so ähnlich klappen...
Welche Fehlermeldung kommt denn? Wo tritt der Fehler auf (mit F8 und F7 ein bisschen Debugging betreiben!)?
Aussagen wir "geht nich" helfen wenig weiter...


Mr_T - So 12.01.03 14:49

Hmm .... es kommt leider gar keine Fehlermeldung.... das Programm hängt sich blos auf und reagiert auf gar nichts mehr.... nur Strg+Alt+Entf helfen mir dort weiter.....
Insgesammt soll das Programm ein Brainfuck-Interpreter werden (<-- wers nicht kennt: es ist eine minimalistische Programmiersprache)... dazu wird ein zweites Form zum anzeigen des Outputs geöffnet und zugleich soll der Code interpretiert werden (die Interpretationsroutine wird in "onShow" aufgerufen) ... dabei gibt es ein Befehl, der auf einen Tastendruck warten soll... was momentan aber zum Aufhänger des Programms wird.....


tommie-lie - So 12.01.03 18:15

dann probier doch mal das Debuggen mit F8/7. Vielleicht liegt es ja an etwas anderem, was nur im Konflikt mit der "Tastendruckergänzung" steht. Evtl eine weitere Abfrage nach Tasten oder Ähnliches.


Wolff68 - So 12.01.03 20:52

Mal grundsätzlich:
Da Delphi ja Ereignisorientiert arbeitet 'wartet' es sowieso auf die nächste Aktion. (zB KeyDown)
Du musst also Dein Programm und Dein Windows nicht mit Sleep(50) beschäftigen.
Wenn Du jetzt zB keine Mauseingaben erlauben willst bevor nicht eine Taste gedrückt wurde, kannst Du ja im OnClick ein If WaitForKey then exit; einbauen.

Im Prinzip reicht das hier völlig aus:

Quelltext
1:
2:
3:
4:
5:
6:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  WaitForKey := false;
  Button1.Caption := Chr(Key);
end;

Dazu muss noch ggf. die KeyPreview des Forms auf true gestellt sein, damit auch alle KeyDown dort ankommen.