AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Auf Pfeiltasten reagieren

Ein Thema von braessi · begonnen am 17. Jan 2014 · letzter Beitrag vom 17. Jan 2014
Antwort Antwort
braessi

Registriert seit: 17. Jan 2014
5 Beiträge
 
Delphi XE3 Starter
 
#1

Auf Pfeiltasten reagieren

  Alt 17. Jan 2014, 10:40
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
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.537 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Auf Pfeiltasten reagieren

  Alt 17. Jan 2014, 11:04
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;
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 Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#3

AW: Auf Pfeiltasten reagieren

  Alt 17. Jan 2014, 11:07
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.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.110 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Auf Pfeiltasten reagieren

  Alt 17. Jan 2014, 11:21
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.[...]
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Auf Pfeiltasten reagieren

  Alt 17. Jan 2014, 11:26
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (17. Jan 2014 um 11:26 Uhr) Grund: bissl Spät: vergessen abzusenden
  Mit Zitat antworten Zitat
braessi

Registriert seit: 17. Jan 2014
5 Beiträge
 
Delphi XE3 Starter
 
#6

AW: Auf Pfeiltasten reagieren

  Alt 17. Jan 2014, 11:43
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?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Auf Pfeiltasten reagieren

  Alt 17. Jan 2014, 11:53
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (17. Jan 2014 um 11:58 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

AW: Auf Pfeiltasten reagieren

  Alt 17. Jan 2014, 12:20
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 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
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (17. Jan 2014 um 12:26 Uhr)
  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 06:39 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