Ereignis OnKeyPress nicht bei jedem Tastendruck?

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Benutzeravatar
willi4willi
Lazarusforum e. V.
Beiträge: 155
Registriert: Sa 1. Nov 2008, 18:06
OS, Lazarus, FPC: Windows, Linux (debian) / Lazarus 3.2 / FPC 3.2.2
CPU-Target: i386, win64, arm

Ereignis OnKeyPress nicht bei jedem Tastendruck?

Beitrag von willi4willi »

 

Mit der Tastenkombination AltGr+q erhält man auf meiner deutschen Tastatur das @, mit AltGr+e das € usw.

Nun möchte ich gern mit AltGr+a z.B. das ¼, mit AltGr+s das ½ und mit AltGr+d das ¾ als Zeichen eingeben.

Folgender Code funktioniert aber nicht:

Code: Alles auswählen

unit Unit1;
{$mode objfpc}{$H+}

interface

uses
  Forms, StdCtrls, LCLType, Controls, Classes;

type

  { TForm1 }

  TForm1 = class(TForm)
    Edit1: TEdit;
    procedure Edit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure Edit1UTF8KeyPress(Sender: TObject; var UTF8Key: TUTF8Char);
  private
    Taste : word;
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Edit1UTF8KeyPress(Sender: TObject; var UTF8Key: TUTF8Char);
var
  i: Integer;
begin
 case Taste of
  //81 : UTF8Key:='¼';                 // Taste AltGr+q
  //81 : UTF8Key:=#194#188;            // Taste AltGr+q
  65 : UTF8Key:=#194#188;            // Taste AltGr+a = '¼'
  83 : UTF8Key:=#194#189;            // Taste AltGr+s = '½'
  68 : UTF8Key:=#194#190;            // Taste AltGr+d = '¾'
 end;
end;

procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if (ssAlt in Shift) AND (ssCtrl in Shift) then Taste:=Key else Taste:=0;
end;

end.
Wenn ich eine Taste drücke, dachte ich, dass immer OnKeypress bzw. OnUTF8Keypress ausgeführt wird. Das scheint nicht so zu sein.
Eine Tastenkombination, wie z.B. AltGr-q funktioniert, da dort ja schon das @ erzeugt wird.

Warum ist das so und wie bekomme ich das trotzdem hin? Hat jemand eine Idee?


 
 

Viele Grüße

Willi4Willi

------------

Mathias
Beiträge: 6204
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Ereignis OnKeyPress nicht bei jedem Tastendruck?

Beitrag von Mathias »

Evtl. ist dies ein Lösungsansatz:

Code: Alles auswählen

procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: word; Shift: TShiftState);
begin
  WriteLn(key);
  if (ssAlt in Shift) and (ssCtrl in Shift) then  begin
    case Key of
      65: begin
        Edit1.Text := Edit1.Text + #194#188;
      end;
      83: begin
        Edit1.Text := Edit1.Text + #194#189;
      end;
      68: begin
        Edit1.Text := Edit1.Text + #194#190;
      end;
    end;
    Key := 0;
  end;
end;   
Die funktioniert bei mit nur mit [Alt + Ctrl]. ssAltGr geht bei mir nicht.
Was noch gemacht werden muss, die Cursor-Pos im Edit-Feld ermitteln, so das die Zeichen am richtigen Ort rein kommen.

So nebenbei kann man unter Linux direkt auf die ¼½⅛⅜⅝⅞ zugreifen.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
willi4willi
Lazarusforum e. V.
Beiträge: 155
Registriert: Sa 1. Nov 2008, 18:06
OS, Lazarus, FPC: Windows, Linux (debian) / Lazarus 3.2 / FPC 3.2.2
CPU-Target: i386, win64, arm

Re: Ereignis OnKeyPress nicht bei jedem Tastendruck?

Beitrag von willi4willi »

 

Danke für den Tipp! Aber diesen Ansatz kann ich nicht weiterverfolgen.

Ich möchte es nutzen, um eine virtuelle Tastatur-Komponente zur erstellen, bei der es möglich sein soll, die Tasten frei zu belegen.
So sollen auch Zeichen für den Anwender über die Tastatur erreichbar sein, die sonst nicht oder nur mit bestimmten Treibern darstellbar sind.
Die Methode mit Alt+ Code auf der numerischen Tastatur ist zu umständlich.

Übrigens, mit [ssCtrl] hatte ich dieses Problem nicht- nur mit ssAlt bzw. ssAltGr.



 
 

Viele Grüße

Willi4Willi

------------

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1435
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Ereignis OnKeyPress nicht bei jedem Tastendruck?

Beitrag von fliegermichl »

Bei AltGr wird OnKeydown zweimal gefeuert. Einmal mit ssCtrl und einmal mit ssAlt in Shift.
Also kannst du Mathias' Code schon verwenden. Es muss eben nur geprüft werden, das sowohl ssCtrl als auch ssAlt in Shift enthalten ist.

Edit: Ich hatte übersehen, daß Mathias' Code bereits ssAlt und ssCtrl testet.

Mathias
Beiträge: 6204
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Ereignis OnKeyPress nicht bei jedem Tastendruck?

Beitrag von Mathias »

Ich möchte es nutzen, um eine virtuelle Tastatur-Komponente zur erstellen, bei der es möglich sein soll, die Tasten frei zu belegen.
Wen ich dich richte verstehe, willst du eine Bildschirm-Tastatur, welche man mit der Maus bedienen kann ?

Was auch eine Variante wäre, das MainMenu dafür nehmen.
Da machst du für jedes Zeichen welches du willst einen Menu-Eintrag. Dabei kannst du jedem Menüpunkt ein Shortcut definieren.
Das Menu ist auch zur Laufzeit editierbar.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten