Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Auf Pfeiltasten reagieren (https://www.delphipraxis.net/12940-auf-pfeiltasten-reagieren.html)

Peter_Panther 7. Dez 2003 10:42


Auf Pfeiltasten reagieren
 
Hallo Leute,

Bin gerade dabei ein Spiel zu proken welches auf die pfeiltasten (zum bewegen der grafik)
reagieren soll.

Nur leider funktioniert
Delphi-Quellcode:
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
if Key = Ord('a') then ShowMessage('bla');
end;
nicht.

falls der obenstehende code total falsch is, dann bitte nicht beachten ;-)

[edit=sakura] [delphi]-Tags gesetzt. Mfg, sakura[/edit]

Dagon 7. Dez 2003 10:52

Re: Auf Pfeiltasten reagieren
 
Hier:

Delphi-Quellcode:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if key = vk_left then ShowMessage('Hallo');
end;
Musst das ganze einfach noch auf deine Bedürfnisse anpassen.

:hi:

himitsu 7. Dez 2003 10:53

Re: Auf Pfeiltasten reagieren
 
Ein Hallöle von http://www.FrankNStein.de/Smiley-Wolke.gif und herzlich willkommen im DP-Team.

Ja, mit FormKeyPress geht das nicht, aber in FormKeyUp oder FormKeyDown geht das.

Siehe "OnKeyUp (Ereignis von TWinControl)" und "Virtuelle Tastencodes" in der OH.

http://www.delphipraxis.net/images/common/divider.jpg
http://www.FrankNStein.de/Smiley-Kuss.gif * * http://www.FrankNStein.de/Smiley-Spinne.gif * * * http://www.FrankNStein.de/Smiley-Winken.gif

Mirilin 7. Dez 2003 10:53

Re: Auf Pfeiltasten reagieren
 
:hi:

nimm doch OnKeyDown :
Delphi-Quellcode:
procedure TMainForm.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if key = VK_UP then
   ...
end;
, dann kannst du die Virtuellen Tastencodes brauchen...


mfg Tobias

himitsu 7. Dez 2003 10:58

Re: Auf Pfeiltasten reagieren
 
Ach ja, das andere geht natürlich auch nicht.

Zitat:

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
if Key = Ord('a') then ShowMessage('bla');
end;
Key ist vom Typ Char, daher ist es so richtig:
Delphi-Quellcode:
Procedure TForm1.FormKeyPress(Sender: TObject; Var Key: Char);
  Begin
    If Key = 'a' Then ShowMessage('Das Kleine a wurde gedrückt');
  End;
http://www.delphipraxis.net/images/common/divider.jpg
http://www.FrankNStein.de/Smiley-Kuss.gif * * http://www.FrankNStein.de/Smiley-Spinne.gif * * * http://www.FrankNStein.de/Smiley-Winken.gif

Peter_Panther 7. Dez 2003 11:09

Re: Auf Pfeiltasten reagieren
 
danke fuer die vielen antworten (man ging das schnell :-)

aber irgendwie will der bei mir nicht ?!

Code:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
  private
    { Private-Deklarationen }
  public
  Procedure FormKeyPress(Sender: TObject; Var Key: Char);
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

Procedure TForm1.FormKeyPress(Sender: TObject; Var Key: Char);
  Begin
    If Key = 'a' Then ShowMessage('Das Kleine a wurde gedrückt');
  End;

end.
was mach ich falsch ?
:wall:

Christian Seehase 7. Dez 2003 11:16

Re: Auf Pfeiltasten reagieren
 
Moin Peter,

erst einmal herzlich willkommen hier in der Delphi-PRAXiS.

Ich nehme mal an, dass Du nicht nur ein leeres Formular sondern auch noch einige sonstige Komponenten auf demselben hast. Dies hat zur Folge, dass der Tastendruck an die jeweilige Komponente, die den Tastaturfokus hat weitergeleitet wird, und im OnKeyPress des Formulares kommt es dann nicht mehr an.
Um das OnKeyPress des Formulares trotzdem verwenden zu können, musst Du noch die Eigenschaft KeyPreview auf true setzen.

himitsu 7. Dez 2003 11:17

Re: Auf Pfeiltasten reagieren
 
Falsche Stelle:
Code:
[b]type[/b]
  TForm1 = [b]class[/b](TForm)
    [color=red][b]Procedure[/b] FormKeyPress(Sender: TObject; [b]Var[/b] Key: Char);[/color]
  [b]private[/b]
    { Private-Deklarationen }
  [b]public[/b]
  [s][b]Procedure[/b] FormKeyPress(Sender: TObject; Var Key: Char);[/s]
    { Public-Deklarationen }
  [b]end[/b];
Tipp: Zum Erstellen des Ereignisses/der Prozedur einfach im OI in das leere Feld neben OnKeyPress klicken.
Und auf Chris hören.

http://www.delphipraxis.net/images/common/divider.jpg
http://www.FrankNStein.de/Smiley-Kuss.gif * * http://www.FrankNStein.de/Smiley-Spinne.gif * * * http://www.FrankNStein.de/Smiley-Winken.gif

Peter_Panther 7. Dez 2003 11:23

Re: Auf Pfeiltasten reagieren
 
ich danke euch!
manchmal hat man halt doch ein brett vorm kopf (oder 2 oder 3) ;-)

also herzlichen dank!
bis zum naechsten mal,
Peter

braucheHilfe 19. Jan 2017 19:47

AW: Auf Pfeiltasten reagieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Entschuldigung, wenn ich jetzt noch mal diesen Eintrag von vor über 10 Jahren erweitern muss,
aber ich stehe hier grade vor einem mir unerklärlichen Problem:
Ich hab alles wie erklärt abgeschrieben und bei mir startet das Programm auch,
aber es passiert einfach nichts, wenn ich die belegte Taste drücke.
(Ich habs schon mit verschieden Tasten versucht)

nahpets 19. Jan 2017 19:53

AW: Auf Pfeiltasten reagieren
 
Hast Du KeyPreview vom Formular im Objektinspektor auf True gesetzt?

a.def 19. Jan 2017 19:58

AW: Auf Pfeiltasten reagieren
 
Ich glaube eher er hat alles blind abgeschrieben und hat nun tote, nicht funktionierende Fake-Events in seinem Code.

braucheHilfe 19. Jan 2017 20:19

AW: Auf Pfeiltasten reagieren
 
Zitat:

Zitat von nahpets (Beitrag 1359295)
Hast Du KeyPreview vom Formular im Objektinspektor auf True gesetzt?

Also wenn das nicht automatisch auf True steht, dann nein.
Wo kann ich das ändern?

juergen 19. Jan 2017 20:21

AW: Auf Pfeiltasten reagieren
 
Ich denke auch dass die OnKeyDown-Zuweisung fehlt.
Einfach "Form1" markieren, dann im Objektinspektor unter dem Reiter "Ereignisse" einen beherzten Doppelklick in die leere Zeile bei "OnKeyDown". Dann sollte das Event zugewiesen sein.
"KeyPreview" muss auch auf True stehen.

nahpets 19. Jan 2017 20:29

AW: Auf Pfeiltasten reagieren
 
Wenn Du es nicht im Objektinsteptor ändern willst, dann musst Du das irgendwo im Quelltext machen. Geeignet wäre da wohl das FormCreate.

Sinnvollerweise solltest Du aber im Objektinspektor den Vorgabewert False auf True ändern.

braucheHilfe 19. Jan 2017 20:45

AW: Auf Pfeiltasten reagieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe die KeyPreview jetzt auf True gesetzt und jetzt sieht der Code so aus:
Es tut sich aber trotzdem nichts wenn ich die Taste drücke :(

a.def 19. Jan 2017 21:01

AW: Auf Pfeiltasten reagieren
 
Nimm das KeyUp-Event und nicht das KeyDown:

Delphi-Quellcode:
procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
 if Key = Ord(VK_UP) then
  begin
   Key := 0;
   ShowMessage('Hi');
  end;
end;

nahpets 19. Jan 2017 21:06

AW: Auf Pfeiltasten reagieren
 
Ändere mal bitte die Routine FormKeyDown und füge am Anfang ein
Delphi-Quellcode:
ShowMessage(IntToStr(key));
ein. Was wird beim Betätigen welcher Taste ausgegeben?
Wird die Meldung überhaupt angezeigt?
Kannst Du mal mit dem Debugger prüfen, ob die Routine überhaupt aufgerufen wird?

a.def 19. Jan 2017 21:33

AW: Auf Pfeiltasten reagieren
 
Ich glaube KeyDown wird nie aufgerufen wenn irgendein anderes Control außer dem Formular den Focus hat.
Habe es eben schnell getestet und so gesehen, dass man besser KeyUp nimmt statt KeyDown.

himitsu 19. Jan 2017 21:38

AW: Auf Pfeiltasten reagieren
 
Und wenn jemand das mit KeyPreview immer wieder überliest, dann kann man auch nicht viel helfen.
Aber vorallem wurde ständig das mit dem zugewiesenen Event vergessen. :zwinker:

a.def 19. Jan 2017 21:41

AW: Auf Pfeiltasten reagieren
 
Zitat:

Zitat von himitsu (Beitrag 1359307)
Und wenn jemand das mit KeyPreview immer wieder überliest, dann kann man auch nicht viel helfen.

Wie meinst du das?

himitsu 19. Jan 2017 21:49

AW: Auf Pfeiltasten reagieren
 
Hatte mein Edit vergessen abzusenden, nachdem ich den ersten Satz schon zu früh absendete. :oops:

Nja, das hatte er schon oft genug überlesen.
Mal sehn, wie lange es mit dem nicht zugewiesenen Event dauert.

braucheHilfe 19. Jan 2017 21:49

AW: Auf Pfeiltasten reagieren
 
Zitat:

Zitat von a.def (Beitrag 1359304)
Nimm das KeyUp-Event und nicht das KeyDown:

Delphi-Quellcode:
procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
 if Key = Ord(VK_UP) then
  begin
   Key := 0;
   ShowMessage('Hi');
  end;
end;

Vielen dank, diese Variante funktioniert :thumb:

a.def 19. Jan 2017 21:53

AW: Auf Pfeiltasten reagieren
 
Vor wenigen Wochen gab es doch schon einmal so ein Thema hier mit genau demselben Problem.
Dabei ging es darum Shapes per Tastendruck zu verschieben. Leider finde ich das Thema nicht wieder.

KeyUp hat nämlich einen Nachteil... beim gedrückt-halten der Taste passiert bei dir nichts wenn du KeyUp verwendet. Denn es wird ja erst ausgelöst wenn der Key... losgelassen wird.

Aviator 19. Jan 2017 23:15

AW: Auf Pfeiltasten reagieren
 
Zitat:

Zitat von himitsu (Beitrag 1359309)
Nja, das hatte er schon oft genug überlesen.
Mal sehn, wie lange es mit dem nicht zugewiesenen Event dauert.

Wenn du dir seine Screenshots mal anschauen würdest dann würdest du sehen, dass er das Event zugewiesen hat. Links in der Ereignisliste ist beim OnKeyDown das Event eingetragen. Wo hat er dann also etwas nicht zugewiesen?

t.roller 20. Jan 2017 07:32

AW: Auf Pfeiltasten reagieren
 
Zitat:

Zitat von a.def (Beitrag 1359311)
Vor wenigen Wochen gab es doch schon einmal so ein Thema hier mit genau demselben Problem.
Dabei ging es darum Shapes per Tastendruck zu verschieben. Leider finde ich das Thema nicht wieder.

http://www.delphipraxis.net/191275-p...es-shapes.html

TiGü 20. Jan 2017 07:48

AW: Auf Pfeiltasten reagieren
 
...

Juri11 5. Nov 2017 14:25

AW: Auf Pfeiltasten reagieren
 
Hallo ...
ich möchte mich ebenfalls zum Thema "auf Tasteneingabe reagieren melden".
Ich habe ebenfalls das Problem, dass ich auf cursor- links und rechts in meinem Programm reagieren will.
Durch Versuche habe ich herausgefunden, dass bei keyPreview:=true; nur dann alle Tasteneingaben weiter gegeben werden, wenn in TForm in keinem Objekt der Focus gesetz ist.
Den Focus in TForm für "alle Objekte ausschalten" (ActiveControl:=none; gibt es nicht), weil Windows es nicht zulässt.
Zufälligerweise habe ich festgestellt, dass wenn ich in TForm den focus auf das letzte Objekt in der Reihenfolge setze und die cursor Tasten drücke die cursor Eingaben weiter gegeben werden. Der focus ist aus TForm anschließend von allen Objekten verschwunden. Das Objekt mit dem Focus ist ein TlabeledEdit Objekt.

Grüße Jürgen


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