Wenn man normale Buchstaben A..Z, a..z sowie die Ziffern 0..9 über die Tastatur eingibt, erhält man nur einen KeyPress event.
Bei Cursortasten, Ctrl-X usw. erhält man nur einen KeyDown event.
Bei allen anderen Zeichen außer den in der ersten Zeile genannten erhält man einen KeyDown mit einem mir undurchsichtigen Key code (z. B. Bindestrich ist #189) und dan einen KeyPress mit dem ASCII-Code, beispielsweise beim Bindestrich #45.
Ich möchte nun einen Keypress für Zeichen incl. Sonderzeichen und ein KeyDown für Befehle. Also muß ich bei KeyDown die echten Zeichen von den Befehlen trennen. Wie kann ich das bewerkstelligen? Mit einer einfachen Abfrage key > Wert geht das nicht, weil beispielsweise die Einfg Taste einen niedrigen Key code hat (auch #045).
KeyDown und KeyPress
Re: KeyDown und KeyPress
Generell bist du mit dem OnKeyDown schon im richtigen Event. Dort kannst du problemlos alle Key-Zusammensetzungen abfragen. Bei [STRG] + [x] wäre das z.B.:Steht alles auch im Wiki: http://wiki.lazarus.freepascal.org/key_down/de
Generell könnte man bei Steuerbefehlen auch eine TActionList verwenden und einer jeweiliger TAction ein ShortCut definieren. Dies hätte den Vorteil, dass die TActions auch einem MenuItem, einem Button oder sonstigen Control zugeordnet werden könnten, ohne weiteren Programmieraufwand.
Code: Alles auswählen
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState
);
begin
if (Shift = [ssCtrl]) and (Key = VK_X) then
ShowMessage('STRG + X wurde gedrückt')
end; Generell könnte man bei Steuerbefehlen auch eine TActionList verwenden und einer jeweiliger TAction ein ShortCut definieren. Dies hätte den Vorteil, dass die TActions auch einem MenuItem, einem Button oder sonstigen Control zugeordnet werden könnten, ohne weiteren Programmieraufwand.
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection; -
Martin V
- Beiträge: 142
- Registriert: Sa 30. Jan 2010, 19:35
- OS, Lazarus, FPC: Linux64, Wiindows32, MacOS, Lazarus 1.8.2
- CPU-Target: xxBit
Re: KeyDown und KeyPress
Danke für die Darstellung, aber ich brauche eine generelle Information, ob es sich bei dem Key um ein druckbares Zeichen oder um einen Steuerbefehl handelt. "Ctrl-X" soll nur stellvertretend für einen beliebigen Steuerbefehl stehen, auch Alt-, Cursortasten, ESC usw. Das Programm ist von einer anderen Pascal-Entwicklungsumgebung portiert, und unterscheidet über 100 Steuerbefehle. Es gibt ein paar Programmzeilen, die bei jedem Steuerbefehl ausgeführt werden sollen. Wenn einem KeyDown ein KeyPress folgt, dann will ich das schon im KeyDown wissen. In der alten Entwicklungsumgebung (Sibyl bzw. WDSibyl) wird klar zwischen druckbarem Zeichen (CharEvent) und Steuerbefehl (ScanEvent) unterschieden.
Re: KeyDown und KeyPress
K.A., was du da genau brauchst. Wenn du die Tastenkombinationen unbedingt von denen, die zum OnKeyPress oder OnUTF8KeyPress gesendet werden, trennen willst, könnstest du auch die Abfrage per Hand machen. Ist etwas Schreibarbeit, geht aber.
Wie die LCL dies löst, ist hier beschrieben: http://wiki.lazarus.freepascal.org/LCL_Key_HandlingMartin V hat geschrieben:Wenn einem KeyDown ein KeyPress folgt, dann will ich das schon im KeyDown wissen. In der alten Entwicklungsumgebung (Sibyl bzw. WDSibyl) wird klar zwischen druckbarem Zeichen (CharEvent) und Steuerbefehl (ScanEvent) unterschieden.
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection; -
Martin V
- Beiträge: 142
- Registriert: Sa 30. Jan 2010, 19:35
- OS, Lazarus, FPC: Linux64, Wiindows32, MacOS, Lazarus 1.8.2
- CPU-Target: xxBit
Re: KeyDown und KeyPress
Ich habe das Problem nun lösen können. Aus der von Michl beschriebenen Anleitung wird deutlich, dass die lcl ein Abbild des Verhaltens von Windows ist. Ich bin jetzt auf die simple Idee gekommen, wie denn das in meiner älteren Entwicklungsumgebung Sibyl gelöst ist, und dort werden explizit die Steuerbefehle (ohne zusätzlich gedrückte Tasten) angegeben:
Die Menge ist also relativ überschaubar. Ggfs. muß man noch zusätzlich im Programm verwendete Tasten, etwa die Windows-Tasten VK_LWIN, VK_RWIN anfügen. Ich werde schon merken, wenn irgendwelche Tasten nicht mehr gehen, dann muß ich halt noch etwas anfügen.
Code: Alles auswählen
If KeyCode In [VK_LEFT,VK_RIGHT,VK_UP,VK_DOWN,VK_DELETE,VK_INSERT,
VK_END,VK_HOME,VK_NEXT,VK_PRIOR,VK_BACK,VK_RETURN,
VK_ESCAPE,VK_CAPITAL,VK_SCROLL,VK_PRINT,VK_CONTROL,
VK_MENU,VK_TAB,VK_NUMLOCK,VK_PAUSE,VK_SHIFT,
VK_F1..VK_F24] Then ...