![]() |
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 |
Re: Tastenabfrage
Delphi-Quellcode:
Einmal ist die Variable "key" vom Typ Word, das andere mal vom Typ Char.
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState); begin end; procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char); begin end; Achso, was genau der Unterschied der Auswirkung ist, weiß ich auch nicht. :gruebel: |
Re: Tastenabfrage
ah! alles klar...
dankeschön für die schnelle hilfe! Gruß, dopeline |
Re: Tastenabfrage
Wie kann ich denn überprüfen, obe Ctrl dabei gedrückt wurde,
wenn ich den folgenden Code nutze, bekomme ich inkompatible Typen
Delphi-Quellcode:
if (Shift = ssCtrl) then ...
|
Re: Tastenabfrage
Du musst abfragen
Delphi-Quellcode:
bye
if ssCtrl in shift then
|
Re: Tastenabfrage
Der Unterschied ist, das das eine die gesamte Tastendrückerei abrfragt, das andere nur, ob eine Taste gedrückt oder losgelassen wird.
Aber kann ich die Leertaste nicht auch mit DXInput Abfragen? In der Hilfe steht, es gäbe noch isButton1 ... isButton38, was ist mit denen, muss man die erst vergeben (wenn ja, wie), oder sind die vergeben? |
Re: Tastenabfrage
Habs selbst gefunden, die Buttons sind festgelegt, Button1 z.B. ist die Leertaste!
Ich hab gelesen, dass das irgendwo in einer Unit steht, aber in welcher, wenn ich auf Deklaration suchen klicke (mit Mauszeiger auf isButton1) dann kommt da nix. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:45 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