Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Tastenabfrage (https://www.delphipraxis.net/15566-tastenabfrage.html)

Spurius 31. Jan 2004 10:32


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

Alter Mann 31. Jan 2004 10:35

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.

Alter Mann 31. Jan 2004 10:40

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.

Alter Mann 31. Jan 2004 10:42

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;

Spurius 31. Jan 2004 10:59

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.

dopeline 12. Feb 2004 17:29

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

Luckie 12. Feb 2004 17:31

Re: Tastenabfrage
 
Die virtuellen Tastaturcodes findest du in der Hilfe.

dopeline 12. Feb 2004 17:49

Re: Tastenabfrage
 
also das funktioniert aber nicht:
Delphi-Quellcode:
if key = VK_F1   then showmessage('F1 wurde gedrückt');
woran liegt das?

ich habe es auch mit 'F1' F1 versucht, aber immer kommen fehlermeldungen...


Gruß, dopeline

Matze 12. Feb 2004 17:53

Re: Tastenabfrage
 
Zitat:

Zitat von dopeline
also das funktioniert aber nicht:
Delphi-Quellcode:
if key = VK_F1   then showmessage('F1 wurde gedrückt');

Komisch, bei mir schon:

Delphi-Quellcode:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if key = VK_F1   then showmessage('F1 wurde gedrückt');
end;

dopeline 12. Feb 2004 18:08

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 07:28 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz