![]() |
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ß |
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. ![]() 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: |
AW: mehrere Key-Down Erreignisse gleichzeitig ausführen
Stichwort: ROLLOVER
Guckst Du hier: ![]() 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); |
AW: mehrere Key-Down Erreignisse gleichzeitig ausführen
Recht simple Vorgehensweise (2 Panels und ein Timer mit kurzem Intervall):
Delphi-Quellcode:
Das geht bestimmt auch eleganter, aber so sollte es einfacher zu verstehen sein.
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; |
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:
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.
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; |
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. |
AW: mehrere Key-Down Erreignisse gleichzeitig ausführen
Delphi-Quellcode:
macht man nicht.
if ... = True then
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. |
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; |
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. |
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 02:43 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