![]() |
Tastenabfrage
Hallo,
ich hab bei einem Prog eine Abfrage, ob die Leertaste gedrückt wurde. Wird sie gedrückt, wird eine procedure ausgeführt. Wenn man aber 2 mal drückt, wird die Procedure 2 mal ausgeführt, aber erst wenn die eine fertig ist, folgt die andere. Wie kann ich das verhindern? Solange die eine läuft, soll die Leertaste nicht beachtet werden. Gruß Spurius |
Re: Tastenabfrage
Hi Spurius,
ich würde eine 'globale' Variable definieren die festhält ob deine Procedure noch läuft und falls nicht diese wieder aufrufen. |
Re: Tastenabfrage
Kleiner Anhang, hab ich vergessen :?
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure FormCreate(Sender: TObject); private { Private-Deklarationen } Laufe : Boolean; procedure MachWas; public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.MachWas; var I : Integer; begin Laufe := True; I := 0; while I < 32555 do begin Application.ProcessMessages; Inc(I); end; end; procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if (Key = 32) and not Laufe then MachWas; end; procedure TForm1.FormCreate(Sender: TObject); begin Laufe := False; end; end. |
Re: Tastenabfrage
Oh, Oh :wall:
Da war doch glatt ein Fehler drin
Delphi-Quellcode:
procedure TForm1.MachWas; var I : Integer; begin Laufe := True; I := 0; while I < 32555 do begin Application.ProcessMessages; Inc(I); end; Laufe := False; //<- Vergessen end; |
Re: Tastenabfrage
Klappt leider nicht:
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, DXSprite, DXDraws, StdCtrls, DXInput, DXClass; type TForm1 = class(TForm) DXDraw1: TDXDraw; DXImageList1: TDXImageList; DXSpriteEngine1: TDXSpriteEngine; DXInput1: TDXInput; DXTimer1: TDXTimer; procedure FormCreate(Sender: TObject); procedure FormPaint(Sender: TObject); procedure DXTimer1Timer(Sender: TObject; LagCount: Integer); procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); private { Private-Deklarationen } public { Public-Deklarationen } end; type tcar = class(timagesprite) private public procedure DoMove(MoveCount: Integer); override; procedure shootmg; end; type tmg = class(timagesprite) public end; var Form1: TForm1; car: tcar; mg: tmg; fire: integer; implementation {$R *.dfm} procedure tcar.shootmg; var i:integer; begin fire := 1; mg := tmg.Create(form1.dxspriteengine1.Engine); mg.Image := form1.dximagelist1.Items.Find('mg'); mg.Width := mg.Image.Width; mg.Height := mg.Image.Height; mg.X := car.X; mg.Y := car.Y; for i := 1 to 100 do begin mg.X := mg.X + 3; form1.dxinput1.Update; form1.dxspriteengine1.Move(0); form1.dxspriteengine1.Dead; form1.dxdraw1.Surface.Fill(0); form1.dxspriteengine1.Draw; form1.dxdraw1.Flip; end; mg.Destroy; form1.dxspriteengine1.Move(0); form1.dxspriteengine1.Dead; form1.dxdraw1.Surface.Fill(0); form1.dxspriteengine1.Draw; form1.dxdraw1.Flip; fire := 0; end; procedure TForm1.FormCreate(Sender: TObject); begin car := tcar.Create(dxspriteengine1.Engine); car.Image := dximagelist1.Items.Find('1'); car.X := 0; car.Y := 0; car.Width := car.Image.Width; car.Height := car.Image.Height; form1.DoubleBuffered := true; dxdraw1.DoubleBuffered := true; fire := 0; end; procedure tcar.DoMove(movecount: integer); begin if isLeft in Form1.DxInput1.States then car.X := car.X -3; if isRight in Form1.DxInput1.States then car.X := car.X +3; if isdown in Form1.DxInput1.States then car.y := car.y +3; if isup in Form1.DxInput1.States then car.y := car.y -3; end; procedure TForm1.FormPaint(Sender: TObject); begin form1.dxspriteengine1.Draw; form1.dxdraw1.Flip; end; procedure TForm1.DXTimer1Timer(Sender: TObject; LagCount: Integer); begin dxinput1.Update; dxspriteengine1.Move(0); dxspriteengine1.Dead; dxdraw1.Surface.Fill(0); dxspriteengine1.Draw; dxdraw1.Flip; end; procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if (key = vk_space) and (fire=0) then car.shootmg; end; end. |
Re: Tastenabfrage
Hallo! hat jemand vielleicht eine übersicht, welcher key für welche taste steht?
z.b. #13 --> Enter #27 --> Escape ... Hat jemand solch eine übersicht? oder hat jemand den key für die F-Tasten parrat? (F1,F2 usw.) Gruß, dopeline |
Re: Tastenabfrage
Die virtuellen Tastaturcodes findest du in der Hilfe.
|
Re: Tastenabfrage
also das funktioniert aber nicht:
Delphi-Quellcode:
woran liegt das?
if key = VK_F1 then showmessage('F1 wurde gedrückt');
ich habe es auch mit 'F1' F1 versucht, aber immer kommen fehlermeldungen... Gruß, dopeline |
Re: Tastenabfrage
Zitat:
Delphi-Quellcode:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState); begin if key = VK_F1 then showmessage('F1 wurde gedrückt'); end; |
Re: Tastenabfrage
aha! ich habe es im onKeyPress! wo ist denn da der unterschied, ob eine taste gedrückt wird, oder ob sie runter-gedrückt wird?
Gruß, dopeline |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:59 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz