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.068 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".
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  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.624 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.068 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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

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
Benutzerbild von himitsu
himitsu

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

AW: mehrere Key-Down Erreignisse gleichzeitig ausführen

  Alt 12. Dez 2011, 16:08
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
mb.99

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

AW: mehrere Key-Down Erreignisse gleichzeitig ausführen

  Alt 12. Dez 2011, 21:09
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;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: mehrere Key-Down Erreignisse gleichzeitig ausführen

  Alt 12. Dez 2011, 21:22
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (12. Dez 2011 um 21:27 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#10

AW: mehrere Key-Down Erreignisse gleichzeitig ausführen

  Alt 12. Dez 2011, 21:36
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.
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  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 07:49 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