Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

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

AW: mehrere Key-Down Erreignisse gleichzeitig ausführen

  Alt 12. Dez 2011, 09: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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

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