Entwickler-Ecke

Sonstiges (Delphi) - Spezialzeichen


meisterkritiker - Mo 09.12.02 16:14
Titel: Spezialzeichen
Ich wollte ein kleines Spiel machen und dabei bin ich auf folgendes Problem gestoßen:
Der Benutzer muss Eingaben machen, um den Charakter zu steuern.
Die sollte man möglichst über die Tastatur machen. Da hab ich folgende Prozedur gefunden.



Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
procedure TForm1.Timer1Timer(Sender: TObject);
var
keyloop, KeyResult : Integer;
begin
keyloop := 0;
repeat
KeyResult := GetAsyncKeyState(keyloop);
if KeyResult = -32767 then
begin
if (KeyLoop >= 65) and (keyloop <= 90) then
Memo1.Text := Memo1.Text + Chr(keyloop);
if (keyloop >= 32) and (keyloop <= 63) then
Memo1.Text := Memo1.Text + Chr(keyloop);
if keyloop = 8 then
Memo1.Text := copy(Memo1.Text,1,Length(memo1.Text) - 1);
//numpad keycodes
if (keyloop >= 96) and (keyloop <= 110) then
Memo1.Text := Memo1.Text + Chr(keyloop);
end;
inc(keyloop);
until keyloop = 255;
end;

(Memo ist nur für Testzwecke, um zu sehen, welche Tasten er abfängt.)
Allerdings kann ich damit nur Zahlen und Buchstaben abfangen. Gibt es Möglichkeiten, um auch die Sonderzeichen, wie z.B. Enter, Cursor etc. auszugeben?


Ex0rzist - Mo 09.12.02 19:53

Hast du es schon mit den Virtual-Keys versucht?

Return = VK_RETURN
Cursor-Up = VK_UP

usw.


Delete - Mo 09.12.02 20:31

Ich würde das nicht in einem Timer-Event machen, sondern das KeyPress oder KeyDown-Ereignis nutzen.


Dirk - Mo 09.12.02 21:59

In vielen Fällen ist es so vielleicht besser:

Unter private:

Quelltext
1:
procedure MyIdleHandler(Sender: TObject; var Done: Boolean);                    

Form1.OnCreate:

Quelltext
1:
Application.OnIdle:= MyIdleHandler;                    

Und letzendlich die eigentliche Prozedur:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
procedure TForm1.MyIdleHandler(Sender: TObject; var Done: Boolean);
var
  KeyboardState: TKeyBoardState;

  function Key(aCode: byte): boolean;
  begin
    result := Keyboardstate[aCode] and $80 <> 0;
  end;

begin
  GetKeyboardState(KeyboardState);
  if Spieler.Erholung >= 10 then begin // damit er nicht 1000 Zeichen pro Sekunde empfängt
    Spieler.Erholung := 0;
    if Key(VK_RIGHT) then Memo1.Lines.Add('Rechts');
    if Key(VK_LEFT) then Memo1.Lines.Add('Links'); 
    end;
  end;

EDIT: Die Steuerzeichen spinnen, weil ich meinem Code auch [code] vorkommt....

(09.12. 23:23 Tino) Code-Tags funktionieren nun!