AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein mehrere Key-Down Erreignisse gleichzeitig ausführen
Thema durchsuchen
Ansicht
Themen-Optionen

mehrere Key-Down Erreignisse gleichzeitig ausführen

Ein Thema von mb.99 · begonnen am 12. Dez 2011 · letzter Beitrag vom 12. Dez 2011
Antwort Antwort
mb.99

Registriert seit: 10. Dez 2011
23 Beiträge
 
#1

mehrere Key-Down Erreignisse gleichzeitig ausführen

  Alt 12. Dez 2011, 08:45
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ß
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.314 Beiträge
 
Delphi 12 Athens
 
#2

AW: mehrere Key-Down Erreignisse gleichzeitig ausführen

  Alt 12. Dez 2011, 09:16
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".
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#3

AW: mehrere Key-Down Erreignisse gleichzeitig ausführen

  Alt 12. Dez 2011, 09:20
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);

Geändert von hathor (12. Dez 2011 um 09:32 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.655 Beiträge
 
Delphi 12 Athens
 
#4

AW: mehrere Key-Down Erreignisse gleichzeitig ausführen

  Alt 12. Dez 2011, 09:54
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.314 Beiträge
 
Delphi 12 Athens
 
#5

AW: mehrere Key-Down Erreignisse gleichzeitig ausführen

  Alt 12. Dez 2011, 10:34
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.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (12. Dez 2011 um 10:36 Uhr)
  Mit Zitat antworten Zitat
mb.99

Registriert seit: 10. Dez 2011
23 Beiträge
 
#6

AW: mehrere Key-Down Erreignisse gleichzeitig ausführen

  Alt 12. Dez 2011, 15:51
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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:17 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 by Thomas Breitkreuz