Delphi onkeypress bei form klappt nicht :/

striker159

Lt. Junior Grade
Registriert
Dez. 2008
Beiträge
327
hallo
ich habe mir ein kleine spiel programmiert. man steuert seine figur hoch und runter, und muss so entgegenkommenden sachen ausweichen. das problem hierbei ist, dass die steuerung nicht will, wie ich will.

sowohl bei
Code:
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
  if key='w' then bbb
  if key='s' then aaa
end;
als auch bei
Code:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if key=119 then bbb
  if key=113 then aaa
end;
passiert garnichts.


als übergangslösung setze ich momentan den focus beim spielen auf ein memo^^ damit funktioniert onkeypress ohne probleme. aber so möchte ich das nicht lassen.

wer weiß rat?


hier mal mein gesamter code der hauptunit:
Code:
unit Main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, GameClass, StdCtrls, Grids, ExtCtrls, jpeg;

type
  TT = class(TThread)
  protected
    procedure Execute; override;
  end;

  TForm1 = class(TForm)
    Button2: TButton;
    Button5: TButton;
    Label1: TLabel;
    Button6: TButton;
    Image1: TImage;
    Memo1: TMemo;
    Edit1: TEdit;
    Label2: TLabel;
    Label3: TLabel;
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure FormKeyPress(Sender: TObject; var Key: Char);
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure Memo1KeyPress(Sender: TObject; var Key: Char);
  private
    procedure irefresh(short:boolean);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  Spiel:TGame;
  Images : array[0..4] of array[0..15] of TImage  ;
  Pause:Boolean;
  thread:TT;
  speed:integer;
  counter:integer;

implementation

{$R *.dfm}

procedure wait(ms:integer);
var x:integer;
begin
try
  x:=getTickCount;
  while getTickCount-x<ms do
    application.ProcessMessages;
except
Showmessage('Fehler wait');
end;
end;

procedure TT.Execute;
var x,s:integer;
begin
try
  Randomize;
  pause := false;
  Form1.Label1.Caption:='Spiel läuft';
  Form1.memo1.SetFocus;
  //Form1.SetFocus;
  While (Spiel.getVerloren = false)and(pause=false) do
  begin
    s:=200*(6-speed);
    x:=random(5);
    Spiel.neuHindernis(x);
  //  x:=random(5);
  //  Spiel.neuHindernis(x);
    Spiel.links;
    Form1.irefresh(false);
    counter:=counter+1;
    Form1.Label3.Caption:=IntToStr(counter);
    if counter>100 then begin
      speed:=2;
      Form1.Edit1.text:=IntToStr(2);
    end;
    if counter>200 then begin
      speed:=3;
      Form1.Edit1.text:=IntToStr(3);
    end;
    if counter>300 then begin
      speed:=4;
      Form1.Edit1.text:=IntToStr(4);
    end;
    if counter>500 then begin
      speed:=5;
      Form1.Edit1.text:=IntToStr(5);
    end;
    wait(s);
  end;
  if Spiel.getVerloren then  Form1.Label1.Caption:='Verloren. Spiel ist zu Ende.'
  else if Pause then Form1.Label1.Caption:='Spiel pausiert';
  wait(100);
except
    on e: exception do begin
      ShowMessage('Fehler TT.Execute');
    end;
end;
end;

procedure TForm1.irefresh(short:boolean);
var i,k:integer;
begin
try
  if short then begin
    for i:=0 to 4 do
      case Spiel.g(i,0) of
      0:  Images[i,0].Picture.LoadFromFile(ExtractFilePath(ParamStr(0))+'/res/leer.bmp');
      1:  Images[i,0].Picture.LoadFromFile(ExtractFilePath(ParamStr(0))+'/res/flieger.bmp');
      2:  Images[i,0].Picture.LoadFromFile(ExtractFilePath(ParamStr(0))+'/res/kaputt.bmp');
      5:  Images[i,0].Picture.LoadFromFile(ExtractFilePath(ParamStr(0))+'/res/hindernis.bmp');
      end;
  end
  else
  for i:=0 to 4 do
    for k:=0 to 15 do
      case Spiel.g(i,k) of
      0:  Images[i,k].Picture.LoadFromFile(ExtractFilePath(ParamStr(0))+'/res/leer.bmp');
      1:  Images[i,k].Picture.LoadFromFile(ExtractFilePath(ParamStr(0))+'/res/flieger.bmp');
      2:  Images[i,k].Picture.LoadFromFile(ExtractFilePath(ParamStr(0))+'/res/kaputt.bmp');
      5:  Images[i,k].Picture.LoadFromFile(ExtractFilePath(ParamStr(0))+'/res/hindernis.bmp');
      end;
  memo1.SetFocus;
  //Form1.SetFocus;
except
ShowmEssage('Fehler irefresh');
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
try
  Spiel.newgame;
  Pause:=false;
  Label1.Caption:='';
  irefresh(false);
  speed:=StrToInt(edit1.Text);
  counter:=0
except
ShowmEssage('Fehler button2');
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var i,k:integer;
begin
try
  Spiel:=TGame.Create;
//  Image1.Canvas.FillRect(rect(-1,-1,Image1.Width,Image1.Height));
  for i:=0 to 4 do
    for k:=0 to 15 do begin
      Images[i,k]:=TImage.Create(nil);
      with Images[i,k] do begin
        Left:=Image1.Left+(Image1.Width div 16)*k;
        Top:=Image1.Top+(Image1.Height div 5)*i;
        Width:=64;
        Height:=67;
        Parent:=self;
        Transparent:=true;
      end;
    end;
except
ShowMessage('Fehler FormCreate');
end;
end;

procedure TForm1.Button5Click(Sender: TObject);
//var x:integer;
begin
try
  thread:=TT.Create(true);
  thread.FreeOnTerminate:=true;
  memo1.SetFocus;
  //Form1.SetFocus;
  thread.Resume;
except
  ShowMessage('Fehler start');
end;
end;

procedure TForm1.Button6Click(Sender: TObject);
begin
try
  pause:=true;
  except
ShowmEssage('Fehler button6');
end;
end;

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
var i,k:integer;
begin
try
  for i:=0 to 4 do
    for k:=0 to 15 do
      Images[i,k].Free;
  Spiel.Free;
except
ShowmEssage('Fehler closequery');
end;
end;

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
  if key='w' then Spiel.MovePlayer(true);
  if key='s' then Spiel.MovePlayer(false);
  irefresh(false) ;
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if key=119 then Spiel.MovePlayer(true);
  if key=113 then Spiel.MovePlayer(false);
  irefresh(false) ;
end;

procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: Char);
begin
try
  if (Spiel.getVerloren = false)and(pause=false) then begin
    if (key='w')and (Spiel.getPos<>0) then
      begin
        Spiel.MovePlayer(true);
        irefresh(true) ;
      end;
    if (key='s')and (Spiel.getPos<>4) then
      begin
        Spiel.MovePlayer(false);
        irefresh(true) ;
      end;
  end;
except
ShowmEssage('Fehler memokeypress');
end;
end;

end.
 
Wird das Event TForm1.OnKeyPress/Down überhaupt ausgelöst? Musst du das Ereignis vielleicht von den Komponenten auf die Form 'weiterleiten'?

Übrigens, in den einschlägigen Foren (Delphi-Praxis, Delphi-Forum, ...) hast du deine Antwort bestimmt innerhalb von Minuten.
 
Zurück
Oben