KeyDown und KeyPress

Rund um die LCL und andere Komponenten
Antworten
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

KeyDown und KeyPress

Beitrag von Martin V »

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).

Michl
Beiträge: 2513
Registriert: Di 19. Jun 2012, 12:54

Re: KeyDown und KeyPress

Beitrag von Michl »

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.:

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;     
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

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

Beitrag von Martin V »

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.

Michl
Beiträge: 2513
Registriert: Di 19. Jun 2012, 12:54

Re: KeyDown und KeyPress

Beitrag von Michl »

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.
Martin 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.
Wie die LCL dies löst, ist hier beschrieben: http://wiki.lazarus.freepascal.org/LCL_Key_Handling

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

Beitrag von Martin V »

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:

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 ...
 
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.

Antworten