Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Auf Pfeiltasten reagieren (https://www.delphipraxis.net/178610-auf-pfeiltasten-reagieren.html)

braessi 17. Jan 2014 10:40

Auf Pfeiltasten reagieren
 
Hallo Zusammen
Ich bin ein ziemlicher Anfänger was Delphi betrifft, habe bis jetzt einige Tutorials durchgearbeitet und lerne mit einem Buch.
Bis jetzt habe ich hauptsächlich mit OnClick Ereignisse programmiert, sprich immer einen Button der etwas auslöst, jetzt würde ich gerne durch einfaches Drücken einer Taste, also z.B. einer Pfeiltaste ein Ereignis auslösen, nahelegend wäre hier die Verschiebung z.B. eines TImages.
versucht habe ich das ganze so:

Delphi-Quellcode:
procedure TForm5.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if key = vk_left then
     image1.Left := image1.Left - 1;
  if key = vk_right then
     image1.Left := image1.Left +1;
  if key = vk_up then
     image1.Top := image1.Top - 1;
  if key = vk_Down then
     image1.Top := Image1.Top + 1;


end;
Aber auf Knopfdruck geschieht nichts. Liegt hier im Code schon ein Fehler vor, oder muss der Fehler wo anders sein?
Und noch eine Frage: Was gibt es sonst für Möglichkeiten auf Tastatur eingaben zu reagieren?

vielen Dank und freundliche Grüsse

DeddyH 17. Jan 2014 11:04

AW: Auf Pfeiltasten reagieren
 
Setz doch mal zum Testen KeyPreview des Formulars auf true und verwende statt der Pfeiltasten z.B. W, S, A und D.
Delphi-Quellcode:
procedure TForm5.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  case Chr(Key) of
    'W':
      Image1.Top := Image1.Top - 1;
    'S':
      Image1.Top := Image1.Top + 1;
    'A':
      Image1.Left := Image1.Left - 1;
    'D':
      Image1.Left := Image1.Left + 1;
  end;
end;

Zacherl 17. Jan 2014 11:07

AW: Auf Pfeiltasten reagieren
 
Das Event ist schon richtig. Das Problem ist aber, dass das Image pro Tastendruck nur einmalig um 1px verschoben wird und nicht kontinuierlich solange du die Taste gedrückt hälst. Du müsstest dir also eine (oder mehrere) Variablen anlegen, die sich merken, welche Pfeiltasten momentan gedrückt sind. Dazu kannst du die OnKeyDown und OnKeyUp Events verwenden. Zusätzlich brauchst du dann einen Timer, in dem das eigentliche Verschieben des Images stattfindet.

Der schöne Günther 17. Jan 2014 11:21

AW: Auf Pfeiltasten reagieren
 
Ich dachte, KeyPreview nutzt bei Pfeiltasten eh nichts?

Zitat:

[...]

Ist KeyPreview auf false gesetzt, gehen Tastaturereignisse an das aktive Steuerelement.

Die Einstellung bezieht sich nicht auf Navigationstasten (TAB, Pfeiltasten usw.), da diese keine Tastaturereignisse auslösen.[...]

himitsu 17. Jan 2014 11:26

AW: Auf Pfeiltasten reagieren
 
Zitat:

Zitat von braessi (Beitrag 1244088)
Aber auf Knopfdruck geschieht nichts. Liegt hier im Code schon ein Fehler vor, oder muss der Fehler wo anders sein?

Haltepunkt in die Methode und schauen OB und was passiert.

Wenn noch andere Komponenten auf der Form sind, welche den Fokus bekommen können und vorallem Welche ebenfalls diese Tasten auswerten, dann kommt der Aufruf natürlich nie in deiner Methode an.
Es sei denn man setzt z.B. KeyPreview der Form auf True, damit das Ereignis zuerst dort ankommt.

PS: Es kann auch gut sein, daß man Key am Ende auf 0 bzw. #0 setzt. Natürlich nur, wenn man eine Taste verarbeitet hat.
Voallem dann, wenn die andere Komponente danach selber nochmal darauf reagiert, was man damit unterbinden würde, also die doppelte Auswertung.

braessi 17. Jan 2014 11:43

AW: Auf Pfeiltasten reagieren
 
Zitat:

Zitat von Zacherl (Beitrag 1244094)
Das Event ist schon richtig. Das Problem ist aber, dass das Image pro Tastendruck nur einmalig um 1px verschoben wird und nicht kontinuierlich solange du die Taste gedrückt hälst. Du müsstest dir also eine (oder mehrere) Variablen anlegen, die sich merken, welche Pfeiltasten momentan gedrückt sind. Dazu kannst du die OnKeyDown und OnKeyUp Events verwenden. Zusätzlich brauchst du dann einen Timer, in dem das eigentliche Verschieben des Images stattfindet.


Daran habe ich auch gedacht, aber ich habe als Versuch mal in eine Richtung 1000 eingegeben und da hat sich auch nichts getan?

himitsu 17. Jan 2014 11:53

AW: Auf Pfeiltasten reagieren
 
Ich weiß nicht mehr genau welches Event, aber OnKeyDown oder OnKeyPress wird, nach paar Millisekunden gedrückt halten, "wiederholt" ausgeführt.
> Tastenwiederholrate usw.

Man kann auch im KeyDown eine Variable setzen, und/oder einen Timer starten in dem dann so lange die aktion ausgeführt wird, bis es vom KeyUp gestoppt wird.

Oder man fragt z.B. in einem asynchron den Tastenstatus ab. (GetKeyState bzw. GetAsyncKeyState oder so)

Und dann gibt es noch so Dinge wie ActiveInput und Dergleichen.

Sir Rufo 17. Jan 2014 12:20

AW: Auf Pfeiltasten reagieren
 
Delphi-Referenz durchsuchenTControl.OnKeyDown wird dann ausgelöst, wenn die Taste herunter gedrückt wird MSDN-Library durchsuchenWM_KEYDOWN
Delphi-Referenz durchsuchenTControl.OnKeyPress wird dann ausgelöst, wenn eine Taste herunter gedrückt wird und es sich um ein Zeichen handelt MSDN-Library durchsuchenWM_CHAR
Delphi-Referenz durchsuchenTControl.OnKeyUp wird dann ausgelöst, wenn die Taste wieder losgelassen wird MSDN-Library durchsuchenWM_KEYUP

Die Tastatur-Wiederholung wird durch die Nachricht MSDN-Library durchsuchenWM_CHAR übermittelt (kommt halt vom Betriebssystem).

Mit Delphi-Referenz durchsuchenTForm.KeyPreview auf
Delphi-Quellcode:
True
werden alle Tastaturereignisse (Delphi-Referenz durchsuchenTControl.OnKeyDown, Delphi-Referenz durchsuchenTControl.OnKeyUp, Delphi-Referenz durchsuchenTControl.OnKeyPress) zuerst an die Form und dann an das aktive Control gesendet.

Ablauffolge beim Drücken von Tasten:
  • A drücken
    Code:
    WM_KEYDOWN
    WM_CHAR('a')
  • B drücken
    Code:
    WM_KEYDOWN
    WM_CHAR('b')
  • Etwas warten, bis die Tastaturwiederholung anschlägt
    Code:
    WM_CHAR('b')
  • A loslassen
    Code:
    WM_KEYUP
  • B loslassen
    Code:
    WM_KEYUP


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:22 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