Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   mehrere Key-Down Erreignisse gleichzeitig ausführen (https://www.delphipraxis.net/165034-mehrere-key-down-erreignisse-gleichzeitig-ausfuehren.html)

mb.99 12. Dez 2011 07:45

mehrere Key-Down Erreignisse gleichzeitig ausführen
 
Hi, ich bin gerade dabei PingPong zu programmieren, die Schläger möchte ich mit TImage erstellen die sich mit dem Form-KeyDown Ereigniss verschieben lassen(W,S(linker Schläger), hoch,runter (rechter Schläger), jedoch lassen sich nicht beide Schläger gleichzeitig verschieben, kennt ihr da ne Lösung. Weiß jemand nebenbei vielleicht noch wie ich über einen Button die Backspacetaste simulieren kann??

Gruß

himitsu 12. Dez 2011 08:16

AW: mehrere Key-Down Erreignisse gleichzeitig ausführen
 
Ereignisse werden "nur" Nacheinander abgearbeitet.
Also nein, parallel ist nicht möglich.

Lösungen:
Du merkst dir in den OnKey-Events nur was gedrückt wurde und die eigentliche Verarbeitung läuft dann z.B. in einem TImer ab.

Selber die Tasten auswerten: z.B. MSDN-Library durchsuchenGetAsyncKeyState
Aber aufpassen, daß die diese Tasten nur beachtest, wenn dein Programm aktiv ist (den Eingabefokus besitzt), falls man dein Programm auch minimieren und nebenher mal was anderes machen "darf". :stupid:

hathor 12. Dez 2011 08:20

AW: mehrere Key-Down Erreignisse gleichzeitig ausführen
 
Stichwort: ROLLOVER
Guckst Du hier:
http://de.wikipedia.org/wiki/Tastatur

Es soll Gamer-Keyboards geben, die das können...

Backspace: ASCII code 08 - Sendkeys...
In einem Edit-Feld:
Delphi-Quellcode:
Edit1.SelStart := Length(Edit1.Text);
Edit1.Perform(WM_CHAR, VK_BACK, 1);

DeddyH 12. Dez 2011 08:54

AW: mehrere Key-Down Erreignisse gleichzeitig ausführen
 
Recht simple Vorgehensweise (2 Panels und ein Timer mit kurzem Intervall):
Delphi-Quellcode:
type
  TDirection = (drUp, drDown);

  TForm1 = class(TForm)
    Panel1: TPanel;
    Panel2: TPanel;
    Timer1: TTimer;
    procedure Timer1Timer(Sender: TObject);
  private
    { Private-Deklarationen }
    procedure CheckButtons;
    procedure MovePanel(Panel: TPanel; Direction: TDirection);
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TForm11 }

procedure TForm1.CheckButtons;
begin
  if GetActiveWindow = self.Handle then
    begin
      if GetKeyState(Ord('W')) < 0 then
        MovePanel(Panel1, drUp)
      else if GetKeyState(Ord('S')) < 0 then
        MovePanel(Panel1, drDown);
      if GetKeyState(VK_UP) < 0 then
        MovePanel(Panel2, drUp)
      else if GetKeyState(VK_DOWN) < 0 then
        MovePanel(Panel2, drDown);
    end;
end;

procedure TForm1.MovePanel(Panel: TPanel; Direction: TDirection);
const
  PixelsPerMove = 5;
begin
  case Direction of
    drDown:
      if (Panel.Top + Panel.Height) < (ClientHeight - PixelsPerMove) then
        Panel.Top := Panel.Top + PixelsPerMove
      else
        Panel.Top := ClientHeight - Panel.Height;
    drUp:
      if Panel.Top > PixelsPerMove then
        Panel.Top := Panel.Top - PixelsPerMove
      else
        Panel.Top := 0;
  end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  CheckButtons;
end;
Das geht bestimmt auch eleganter, aber so sollte es einfacher zu verstehen sein.

himitsu 12. Dez 2011 09:34

AW: mehrere Key-Down Erreignisse gleichzeitig ausführen
 
Man kann auch OnKeyDown/OnKeyUp verwenden.

Delphi-Quellcode:
type
  TForm6 = class(TForm)
    Timer1: TTimer;
    procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private-Deklarationen }
    FTasteRunter, FTasteHoch, FTasteLinks, FTasteRechts, FTasteA: Boolean;
  public
    { Public-Deklarationen }
  end;

procedure TForm6.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  case Key of
    VK_UP: FTasteHoch := True;
    VK_DOWN: FTasteRunter := True;
    VK_LEFT: FTasteLinks := True;
    VK_RIGHT: FTasteRechts := True;
    Ord('A'): FTasteA := True;
  end;
end;

procedure TForm6.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  case Key of
    VK_UP: FTasteHoch := False;
    VK_DOWN: FTasteRunter := False;
    VK_LEFT: FTasteLinks := False;
    VK_RIGHT: FTasteRechts := False;
    Ord('A'): FTasteA := False;
  end;
end;

procedure TForm6.Timer1Timer(Sender: TObject);
begin
  if FTasteHoch then
    ...
  if FTasteA then
    ...
end;

Delphi-Quellcode:
type
  TForm6 = class(TForm)
    Timer1: TTimer;
    procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private-Deklarationen }
    FTasten: array[Word] of Boolean;
  public
    { Public-Deklarationen }
  end;

const
  VK_A = Ord(A);

procedure TForm6.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  FTasten[Key] := True;
end;

procedure TForm6.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  FTasten[Key] := False;
end;

procedure TForm6.Timer1Timer(Sender: TObject);
begin
  if FTasten[VK_UP] then
    ...
  if FTasten[VK_A] then
    ...
end;
PS: Wenn man eine Taste zwischen zwei GetKeyState-Aufrufen drückt und wieder loslässt oder loslässt und wieder drückt, dann wird dieser Tastendruck übersehn.

mb.99 12. Dez 2011 14:51

AW: mehrere Key-Down Erreignisse gleichzeitig ausführen
 
Danke für eure Antworten, ich habs jetzt folgendermaßen gelöst:

Delphi-Quellcode:

type
  TForm1 = class(TForm)
    Pn1: TPanel;
    Pn2: TPanel;
    Timer1: TTimer;
    procedure Timer1Timer(Sender: TObject);  
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure FormKeyUp(Sender: TObject; var Key: Word;
      Shift: TShiftState);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  KeyW, KeyS, KeyU, KeyD: Boolean;


implementation

{$R *.dfm}

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if KeyW = True then
  begin
    Pn1.Top := Pn1.Top - 5;
  end;
  if KeyS = True then
  begin
    Pn1.Top := Pn1.Top + 5;
  end;
    if KeyU = True then
  begin
    Pn2.Top := Pn2.Top - 5;
  end;
  if KeyD = True then
  begin
    Pn2.Top := Pn2.Top + 5;
  end;
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if Key = $57 then
  begin
    KeyW := True;
  end;
  if Key = $53 then
  begin
    KeyS := True;
  end;
  if Key = $26 then
  begin
    KeyU := True;
  end;
  if Key = $28 then
  begin
    KeyD := True;
  end;
end;

procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if Key = $57 then
  begin
    KeyW := False;
  end;
  if Key = $53 then
  begin
    KeyS := False;
  end;
  if Key = $26 then
  begin
    KeyU := False;
  end;
  if Key = $28 then
  begin
    KeyD := False;
  end;

end;

end.

himitsu 12. Dez 2011 15:08

AW: mehrere Key-Down Erreignisse gleichzeitig ausführen
 
Delphi-Quellcode:
if ... = True then
macht man nicht.

Wo man die Variablen hinlegt, kannst'e dir in Post #5 abgucken.
Bezüglich der globalen Variablen wurde schon genügend im forum diskutiert.

Und wie man eventuell die vielen IFs verringert, sieht man auch in der #5.

mb.99 12. Dez 2011 20:09

AW: mehrere Key-Down Erreignisse gleichzeitig ausführen
 
ich versteh deinen Quelltext nicht so ganz, in deiner if Abfrage kann die Bedingung doch True und False sein??, weßwegen fragt man keine Booleans mit ifs ab??

procedure TForm6.Timer1Timer(Sender: TObject);
begin
if FTasteHoch (=True) then
...
if FTasteA then
...
end;

himitsu 12. Dez 2011 20:22

AW: mehrere Key-Down Erreignisse gleichzeitig ausführen
 
Ein "Boolean" hat theoretisch 2 Zustände.
> wahr und falsch

Der Delphi-Boolean hat aber 256 Zustände. (BOOL/LongBool hat sogar über 4 Milliarden)
> Einen für Falsch ( =0 )
> Viele für Wahr ( <>0 )

Und der Vergleich auf TRUE prüft aber nur genau einen dieser Zustände ab.

Bummi 12. Dez 2011 20:36

AW: mehrere Key-Down Erreignisse gleichzeitig ausführen
 
büschn Esoterisch aber, ein Beispiel
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var
  a:Boolean;
  b:Byte;
begin
   b := $2;
   a := true;
   move(b,a,1);
   if a then Showmessage('1. Wahr') else Showmessage('1. False');
   if a = true then Showmessage('2. Wahr') else Showmessage('2. False');end;

end.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:02 Uhr.

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