Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Tastendruck Ausgeben (https://www.delphipraxis.net/129253-tastendruck-ausgeben.html)

MaToBe 15. Feb 2009 16:28


Tastendruck Ausgeben
 
Guten Tag,

ich bins mal wieder, tut mir leid das ich immer so viele Fragen hab aber ich weiß auch nie genau nach was ich suchen soll da die Suche mir nie die ganze Wahrheit offenbart :D

Also ich bräuchte eine Function, die ich in die OnKeyPress Prozedur reinschreiben kann.
Diese Function sollte mir dann genau die Taste ausgeben, die als letztes gedrückt wurde und in ein Edit-Feld schreiben.

Hatte mir das so gedacht:

- Der Benutzer drückt auf das Edit-Feld
- Der Benutzer drückt als Beispiel "E"
- "E" steht im Edit-Feld und ist die neue Taste um meine Spielschlange zu bewegen.

Ich habe schon "aSyncKeyPress" oder so gefunden, weiß aber leider nicht genau wie das funktioniert und ob das das richtige ist. Über Anregungen und Lösungen freu ich mich.

Viele Grüße, MaToBe

SirThornberry 15. Feb 2009 16:45

Re: Tastendruck Ausgeben
 
Im OnKeyPress bekommst du nicht die Taste welche gedrückt wurde sondern das Zeichen welches daraus resultiert. Im OnKeyDown hingegen bekommst du die Taste welche gedrückt ist. Unabhängig davon verschweigst du uns worin genau dein Problem liegt.

[Edit]Die Taste welche gedrückt wurde bzw. das resultierende Zeichen wird der in der entsprechenden Ereignisprocedure (onKeyPress/OnKeyDown) übergeben

HaJo 15. Feb 2009 16:51

Re: Tastendruck Ausgeben
 
Hallo,

Du möchtest als das zurückgelieferte Zeichen - bei "E" also ein "E"

Im Formular die Eigenschaft "KeyPreview" auf TRUE stellen und dann das KeyPress Ereignis auswerten:
Delphi-Quellcode:
procedure MeineForm.FormKeyPress(Sender: TObject; var Key: Char);
begin

   MeinEditFeld.Text := Key;          // <-  Deine Ausgabe der gedrückten Taste an beliebiger Stelle

end;
Man kann aber auch die Tastendrücke auswerten :-)

MaToBe 15. Feb 2009 17:18

Re: Tastendruck Ausgeben
 
Delphi-Quellcode:
procedure TfPlayerSteuerung.edtLinksKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
    edtLinks.Text := inttostr(Key);
    vKey := inttostr(Key);
end;
bei dieser Procedure kommt für E jetzt die Zahl 69 heraus.

Heißt das, dass wenn ich dann beispielsweise abfrage

Delphi-Quellcode:
procedure TfPlayerSteuerung.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
    case key of
         VK_ + vKey : ShowMessage('Hallo');
     end;
end;
dass dann die ShowMessage kommt? Irgendwas klappt da nämlich noch nicht ganz.

HaJo 15. Feb 2009 17:29

Re: Tastendruck Ausgeben
 
Wie SirThornberry schon angemerkt hat:
Zitat:

m OnKeyPress bekommst du nicht die Taste welche gedrückt wurde sondern das Zeichen welches daraus resultiert. Im OnKeyDown hingegen bekommst du die Taste welche gedrückt ist. Unabhängig davon verschweigst du uns worin genau dein Problem liegt.
Schau doch mal nach den Funktionen "ORD" oder "CHR"

MaToBe 15. Feb 2009 17:58

Re: Tastendruck Ausgeben
 
Zitat:

Zitat von MaToBe
Delphi-Quellcode:
procedure TfPlayerSteuerung.edtLinksKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
    edtLinks.Text := inttostr(Key);
    vKey := inttostr(Key);
end;

Delphi-Quellcode:
procedure TfPlayerSteuerung.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
    case key of
         VK_ + vKey : ShowMessage('Hallo');
     end;
end;
dass dann die ShowMessage kommt? Irgendwas klappt da nämlich noch nicht ganz.

Mit der ersten Prozedure will ich die Taste speichern.

Mit der 2. Prozedure will ich erreichen, dass wenn die Taste gedrükt wird, eine ShowMessage kommt.

Nur leider geht das
Delphi-Quellcode:
case key of
         VK_ + vKey : ShowMessage('Hallo');
     end;
nicht =(

HaJo 15. Feb 2009 18:41

Re: Tastendruck Ausgeben
 
Dann bring doch alles im Ereignis KeyPress unter.
Bei Dir geht es wohl wegen der Case-Abfrage nicht. Laß die mal weg, dann sollte ShowMessage gehen.
Ich sehe aber keinen Sinn darin, mehrere Ereignisse zu benutzen.

Bei einem gedrückten 'h' liefert dort Key ='h' und ord(Key) den ASCII-Code 72, also den Ordinalwert der ASCII-Tabelle.

Hawkeye219 15. Feb 2009 19:24

Re: Tastendruck Ausgeben
 
Hallo MaToBe,

hier ist ein anderer Ansatz:

1. Lege eine THotKey-Komponente (Register "Win32") auf dein Formular, stelle bei deren Eigenschaft InvalidKeys alle Schalter auf den Wert False und gib der Komponente den Namen "HotKey".

2. Verbinde die folgende Routine mit dem Ereignis OnShortCut deines Formulars:

Delphi-Quellcode:
procedure TForm1.FormShortCut(var Msg: TWMKey; var Handled: Boolean);
var
  Key : TShortCut;
begin
  Key := {Menus.}ShortCut(Msg.CharCode, KeyDataToShiftState(Msg.KeyData));

  if (Key = HotKey.HotKey) then
    begin
      ShowMessage ('Gotcha!');
      Handled := True;
    end;
end;
Wenn du die Applikation nun startest, kannst du nach einem Mausklick in das HotKey-Feld eine (fast) beliebige Taste oder Tastenkombination drücken, die dann als neuer Hotkey gespeichert wird. Jedes weitere Drücken der gelernten Tastenkombination sollte den MessageDialog erscheinen lassen. Durch das Drücken der ESC-Taste im HotKey-Feld kannst du die gespeicherte Tastenkombination löschen.

Gruß Hawkeye

MaToBe 15. Feb 2009 19:35

Re: Tastendruck Ausgeben
 
Zitat:

Zitat von Hawkeye219
Hallo MaToBe,

1. Lege eine THotKey-Komponente (Register "Win32") auf dein Formular, stelle bei deren Eigenschaft InvalidKeys alle Schalter auf den Wert False und gib der Komponente den Namen "HotKey".

genau das hatte ich vor, wusste nur nich das es bereits eine vorgefertigte Komponente gibt.

Habe es bereits so:
Delphi-Quellcode:
procedure TfPlayerSteuerung.btnFertigClick(Sender: TObject);
begin
    if (edtLinks.Text <> '') and (edtRechts.Text <> '') then
      begin
      fMain.HotKeyRegister;
      fMain.Enabled := true;
      fPlayerSteuerung.Close;
      end
    else
      ShowMessage('Bitte legen sie die Steuerung fest.');
end;

procedure TfPlayerSteuerung.edtLinksKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
    fMain.tempLeft := Key;
    edtLinks.Text := inttostr(Key);
end;

procedure TfMain.HotKeyRegister;
begin
  case ActualPlayerSteuerung of
    1:begin
        RegisterHotKey(Handle, 1, 0, tempLeft);
        RegisterHotKey(Handle, 2, 0, tempRight);
    end;
end;
aber deine lösung ist besser danke =)

MaToBe 15. Feb 2009 20:10

Re: Tastendruck Ausgeben
 
Muss mich leider doch noch mal melden.

Delphi-Quellcode:
procedure TfMain.FormShortCut(var Msg: TWMKey; var Handled: Boolean);
var
  Key : TShortCut;
begin
  Key := {Menus.}ShortCut(Msg.CharCode, KeyDataToShiftState(Msg.KeyData));

  if (Key = fPlayerSteuerung.HkP1Left.HotKey) then
    begin
      ShowMessage ('Gotcha!');
      Handled := true;
    end;
end;
1. Sagt er mir bei
Delphi-Quellcode:
Key := {Menus.}ShortCut(Msg.CharCode, KeyDataToShiftState(Msg.KeyData));
"undefinierter Bezeichner ShortCut" - und ich weiß auch nicht was diese Zeile machen soll ?!?

2. Tut er nichts. - Kein "Gotcha!"

Die Komponente HotKey liegt auf dem Form "fPlayerSteuerung", die ShortCut Prozedure ist auf der Form fMain.

fPlayerSteuerung ist einfach ein kleins Fensterchen, da ich die Eingabe der Hotkeys nicht auf die Hauptform legen wollte.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:29 Uhr.
Seite 1 von 2  1 2      

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