Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Im OnKeyDown Taste abfangen (https://www.delphipraxis.net/51529-im-onkeydown-taste-abfangen.html)

Matze 14. Aug 2005 12:35


Im OnKeyDown Taste abfangen
 
Hallo!

Im OnKeyPress kann man eine taste ja allgemein so abfangen:

Delphi-Quellcode:
Key := #0;
da dort Key vom Typ Char ist. Im OnKeyDown ist es jedoch ein Word. Folgendes geht leider nicht:

Delphi-Quellcode:
Key := 0;
Da passiert einfach nichts, der Text wird normal eingefügt. Wie löse ich das Problem?

alzaimar 14. Aug 2005 12:37

Re: Im OnKeyDown Taste abfangen
 
Wenn Du in einer TForm die Verarbeitung von Tasten per OnKeyDown/Up abfangen willst, müsstest Du doch KeyPreview := True setzen, ansonsten wird der Event der TForm erst NACH der Abarbeitung durch das Client-Control aufgerufen.

Matze 14. Aug 2005 12:41

Re: Im OnKeyDown Taste abfangen
 
Ich habe vergessen zu erwähnen, dass es um ein SynEdit geht, blöd von mir. Das müsste sich eigentlich verhalten wie ein Memo oder ähnliches.

Matze 15. Aug 2005 15:41

Re: Im OnKeyDown Taste abfangen
 
Geht das gar nicht? :stupid:

Tyrael Y. 15. Aug 2005 15:52

Re: Im OnKeyDown Taste abfangen
 
Ord(#0) ?

..vielleicht so? nicht getestet

Matze 15. Aug 2005 16:01

Re: Im OnKeyDown Taste abfangen
 
Hallo Tyrael!

Danke, aber auch das geht nicht. Das seltsame ist, dass Key := 0; bei der Enter-Taste funktioniert:

Delphi-Quellcode:
if ssShift in Shift then
begin
   Case Key of
    //Geht ==> '
'
    VK_RETURN: begin
                 Form1.InsertAtCaret('
', ActSynEdit.CaretX, ActSynEdit.CaretY);
                 Key := 0;
               end;
    //geht nicht ==> ' ' (Leerzeichen am Ende)
    VK_SPACE : begin
                 Form1.InsertAtCaret('', ActSynEdit.CaretX, ActSynEdit.CaretY);
                 Key := Ord(#0);
               end;
   end;
end;

Tyrael Y. 15. Aug 2005 16:08

Re: Im OnKeyDown Taste abfangen
 
Hab mal grad die Virtual Key Codes angeguckt

1-254 ist deklariert, aber die Null nicht, einer würde ja noch fehlen und sollte ja dann die Null sein, aber in meiner Windows-Unit kann ich keinen VK-Code für Null finden...

..merkwürdig ist mir nie aufgefallen :gruebel:

ManuMF 15. Aug 2005 16:15

Re: Im OnKeyDown Taste abfangen
 
Bei mir steht in der Hilfe von Delphi 6 einiges unter "Virtual Key Codes":

Zitat:

Virtual Key codes provide a symbolic representation of user key presses.

Unit Windows

Description

Virtual key codes allow you to represent keyboard values for non-alphanumeric keys.Windows defines special constants for each key the user can press. These constants can then be used to refer to the keystroke in Windows API calls or in an OnKeyUp or OnKeyDown event handler.

Most of the virtual key codes are defined in the Windows unit. Additional key codes may be defined in special-purpose Windows wrappers such as the imm unit. For alphabetic keys, you should use ord with an uppercase character, for example, ord( 'M' ). To create a virtual key code for an alphanumeric value, use the Ord method. For example the virtual key code for ‘7’ is Ord(‘7’).

The following table lists the virtual key codes defined in the Windows unit:

Virtual Key Code Corresponding key

VK_LBUTTON Left mouse button
VK_RBUTTON Right mouse button
VK_CANCEL Control+Break
VK_MBUTTON Middle mouse button
VK_BACK Backspace key
VK_TAB Tab key
VK_CLEAR Clear key
VK_RETURN Enter key
VK_SHIFT Shift key
VK_CONTROL Ctrl key
VK_MENU Alt key
VK_PAUSE Pause key
VK_CAPITAL Caps Lock key
VK_KANA Used with IME
VK_HANGUL Used with IME
VK_JUNJA Used with IME
VK_FINAL Used with IME
VK_HANJA Used with IME
VK_KANJI Used with IME
VK_CONVERT Used with IME

VK_NONCONVERT Used with IME
VK_ACCEPT Used with IME
VK_MODECHANGE Used with IME
VK_ESCAPE Esc key
VK_SPACE Space bar
VK_PRIOR Page Up key
VK_NEXT Page Down key
VK_END End key
VK_HOME Home key
VK_LEFT Left Arrow key
VK_UP Up Arrow key
VK_RIGHT Right Arrow key
VK_DOWN Down Arrow key
VK_SELECT Select key
VK_PRINT Print key (keyboard-specific)
VK_EXECUTE Execute key
VK_SNAPSHOT Print Screen key
VK_INSERT Insert key
VK_DELETE Delete key
VK_HELP Help key

VK_LWIN Left Windows key (Microsoft keyboard)
VK_RWIN Right Windows key (Microsoft keyboard)
VK_APPS Applications key (Microsoft keyboard)
VK_NUMPAD0 0 key (numeric keypad)
VK_NUMPAD1 1 key (numeric keypad)
VK_NUMPAD2 2 key (numeric keypad)
VK_NUMPAD3 3 key (numeric keypad)
VK_NUMPAD4 4 key (numeric keypad)
VK_NUMPAD5 5 key (numeric keypad)
VK_NUMPAD6 6 key (numeric keypad)
VK_NUMPAD7 7 key (numeric keypad)
VK_NUMPAD8 8 key (numeric keypad)
VK_NUMPAD9 9 key (numeric keypad)

VK_MULTIPLY Multiply key (numeric keypad)
VK_ADD Add key (numeric keypad)
VK_SEPARATOR Separator key (numeric keypad)
VK_SUBTRACT Subtract key (numeric keypad)
VK_DECIMAL Decimal key (numeric keypad)
VK_DIVIDE Divide key (numeric keypad)
VK_F1 F1 key
VK_F2 F2 key
VK_F3 F3 key
VK_F4 F4 key
VK_F5 F5 key
VK_F6 F6 key
VK_F7 F7 key
VK_F8 F8 key
VK_F9 F9 key
VK_F10 F10 key
VK_F11 F11 key
VK_F12 F12 key
VK_F13 F13 key
VK_F14 F14 key
VK_F15 F15 key

VK_F16 F16 key
VK_F17 F17 key
VK_F18 F18 key
VK_F19 F19 key
VK_F20 F20 key
VK_F21 F21 key
VK_F22 F22 key
VK_F23 F23 key
VK_F24 F24 key
VK_NUMLOCK Num Lock key
VK_SCROLL Scroll Lock key
VK_LSHIFT Left Shift key (only used with GetAsyncKeyState and GetKeyState)
VK_RSHIFT Right Shift key (only used with GetAsyncKeyState and GetKeyState)
VK_LCONTROL Left Ctrl key (only used with GetAsyncKeyState and GetKeyState)
VK_RCONTROL Right Ctrl key (only used with GetAsyncKeyState and GetKeyState)

VK_LMENU Left Alt key (only used with GetAsyncKeyState and GetKeyState)
VK_RMENU Right Alt key (only used with GetAsyncKeyState and GetKeyState)
VK_PROCESSKEY Process key
VK_ATTN Attn key
VK_CRSEL CrSel key
VK_EXSEL ExSel key
VK_EREOF Erase EOF key
VK_PLAY Play key
VK_ZOOM Zoom key
VK_NONAME Reserved for future use
VK_PA1 PA1 key
VK_OEM_CLEAR Clear key
Vielleicht hilft es, wenn Key in VK_NONAME oder einen ähnlichen (am besten in dieser Situation funktionslosen) Key geändert wird.

Gruß
ManuMF

P.S.: Den roten Kasten hab ich gesehen, aber vielleicht findet sich doch was in der Liste.

Tyrael Y. 15. Aug 2005 16:18

Re: Im OnKeyDown Taste abfangen
 
Das sind ja die normalen Key-Codes von 1-254, aber es müssten 255 sein, sprich einer fehlt und mit hoher wahrscheinlich eben die Null.....

Matze 15. Aug 2005 16:27

Re: Im OnKeyDown Taste abfangen
 
Sowas würde gehen:

Delphi-Quellcode:
VK_SPACE : begin
  Form1.InsertAtCaret(' ', ActSynEdit.CaretX, ActSynEdit.CaretY);
  Key := VK_BACK;
end;
Aber auch nicht so die super Lösung. ;)

Die Muhkuh 15. Aug 2005 16:40

Re: Im OnKeyDown Taste abfangen
 
Hi Matze,

ich hab hier eine Lösung, ist IMHO auch nicht die Beste, finde ich aber schöner wie deine ;)

Du brauchst auf deiner Form ein TApplicationEvents.

Danach ein Variable:

Delphi-Quellcode:
IsShift: Boolean;
Im OnCreate stellst du die Variable auf false.

Danach machst du im OnKeyDown deiner Form (vorausgesetzt KeyPreview ist auf true):

Delphi-Quellcode:
IsShift := ssShift in Shift;
Danach brauchst du noch das OnMessage des TApplicationEvents:

Delphi-Quellcode:
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);
begin
  if Msg.message = WM_KEYDOWN then
  begin
    if (Msg.wParam = VK_SPACE) and (IsShift) then
    begin
      SynEdit1.Lines.Add('Blubb');
      Handled := true;
    end;
  end;
end;
Wie gesagt, ist zwar nicht beste Lösung, aber besser wie deine ;)

Matze 15. Aug 2005 16:41

Re: Im OnKeyDown Taste abfangen
 
Zitat:

Zitat von Spider
Wie gesagt, ist zwar nicht beste Lösung, aber besser wie deine ;)

:shock: Kannst du das begründen? Extra dafür AppEvents, finde ich deutlich schlechter, als meine Möglichkeit. ;)

Die Muhkuh 15. Aug 2005 16:43

Re: Im OnKeyDown Taste abfangen
 
Zitat:

Zitat von Matze
Zitat:

Zitat von Spider
Wie gesagt, ist zwar nicht beste Lösung, aber besser wie deine ;)

:shock: Kannst du das begründen? Extra dafür AppEvents, finde ich deutlich schlechter, als meine Möglichkeit. ;)

Upps, sorry. Ich wollte eigentlich schreiben "schöner wie deine" ;) .

Matze 15. Aug 2005 16:44

Re: Im OnKeyDown Taste abfangen
 
Zitat:

Zitat von Spider
Upps, sorry. Ich wollte eigentlich schreiben "schöner wie deine" ;) .

Und wieso soll sie schöner sein? Ich finde das total umständlich. Meinen Code verstehe ich nach einem Jahr noch (wenn ich diese Problematik noch im Hinterkopf habe), aber bei deiner brauch ich erstmal wieder 'ne gewisse Einarbeitungszeit. :mrgreen:

Die Muhkuh 15. Aug 2005 17:00

Re: Im OnKeyDown Taste abfangen
 
Hi Matze,

ich hab nochmal ein bisschen rumprobiert und zu folgender Lösung gekommen:

Klopp das TApplicationEvents erstmal in die Tonne. Die Variable IsShift behälst du aber bei.

Dann folgender Code im OnKeyPress deiner Form:

Delphi-Quellcode:
if IsShift then
    Key := Chr(0);

turboPASCAL 15. Aug 2005 17:41

Re: Im OnKeyDown Taste abfangen
 
Zitat:

Zitat von Matze
Hallo!

Im OnKeyPress kann man eine taste ja allgemein so abfangen:

Delphi-Quellcode:
Key := #0;
da dort Key vom Typ Char ist. Im OnKeyDown ist es jedoch ein Word. Folgendes geht leider nicht:

Delphi-Quellcode:
Key := 0;
Da passiert einfach nichts, der Text wird normal eingefügt. Wie löse ich das Problem?



:gruebel: Was spricht gegen OnKeyPress, bei einem Edit-Felt/Memo funzt das so: (habe kein SynEdit)
Delphi-Quellcode:
// OnKeyPress Edit1
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  case key of
    #13: begin
           Edit1.Text := Edit1.Text + '
';
           Key := #0;
         end;
    #32: begin
           Edit1.Text := Edit1.Text +'';
           Key := #0;
         end;
    'a': begin
           Edit1.Text := Edit1.Text +'ä';
           Key := #0;
         end;
  end;
end;
:gruebel: ...Man muss halt nur noch den verflixten Cursor richtig positionieren.

Matze 15. Aug 2005 18:16

Re: Im OnKeyDown Taste abfangen
 
Zitat:

Zitat von turboPASCAL
:gruebel: Was spricht gegen OnKeyPress, bei einem Edit-Felt/Memo funzt das so: (habe kein SynEdit)

Dort habe ich kein "Shift" zur Verfügung, was ich aber benötige (siehe oben).

turboPASCAL 15. Aug 2005 18:33

Re: Im OnKeyDown Taste abfangen
 
Zitat:

Zitat von Matze
Zitat:

Zitat von turboPASCAL
:gruebel: Was spricht gegen OnKeyPress, bei einem Edit-Felt/Memo funzt das so: (habe kein SynEdit)

Dort habe ich kein "Shift" zur Verfügung, was ich aber benötige (siehe oben).

Ups, hab ich wohl überlesen, sorry. Dann mach es einfach so:
Delphi-Quellcode:
procedure TForm1.Memo1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var mgsTemp: TMsg;
begin
 case key of
    VK_Return:
         begin
           memo1.Text := memo1.Text + '
';
           PeekMessage(mgsTemp, 0, WM_CHAR, WM_CHAR, PM_REMOVE);
         end;
    VK_Space:
         begin
           memo1.Text := memo1.Text +'';
           PeekMessage(mgsTemp, 0, WM_CHAR, WM_CHAR, PM_REMOVE);
         end;
     65: begin
           memo1.Text := memo1.Text +'ae';
           PeekMessage(mgsTemp, 0, WM_CHAR, WM_CHAR, PM_REMOVE);
         end;
  end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:45 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz