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/)
-   -   Tastatureingabe umwandeln (https://www.delphipraxis.net/213180-tastatureingabe-umwandeln.html)

BigAl 10. Jun 2023 16:04

Tastatureingabe umwandeln
 
Folgende Aufgabenmstellung:

Ich möchte in einem Formular mit mehreren Eingabefeldern erreichen, dass z.B. beim drücken der Tastenkombination Ctrl+2 das Zeichen #$2082 (Tiefgestellte 2) an das aktive Edit gesendet wird.

Die Tastenkombination selbst könnte man ja in "OnKeyDown" des Formulars abfangen. Das Ändern der Taste selbst wäre da auch kein Problem (Key := $2082). Nur ist da ja immer noch das aktive "Ctrl"...?

Wie macht ihr sowas?

Noch mal Update. Hab's hinbekommen. Evtl. interessiert es ja jemand:
Code:
procedure TMyForm.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  inherited;
  if (Shift = [ssCtrl]) and (Key = Ord('2')) then
  begin
    if ActiveControl is TEdit then
    begin
      PostMessage(ActiveControl.Handle, WM_CHAR, $2082, 0);
      Key := 0;
    end;
  end;
end;
Oder vollständig für alle tiefgestellten Zahlen (mit Ctrl+<Zahl>) und alle hochgestellten Zahlen (mit Ctrl+Shift+<Zahl>):
Code:
procedure TMyForm.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  inherited;
  if ActiveControl is TEdit then
  begin
    if (Shift = [ssCtrl]) then // Subscript
    begin
      if Key in [Ord('0') .. Ord('9')] then
      begin
        PostMessage(ActiveControl.HANDLE, WM_CHAR, $2080 + (Key - Ord('0')), 0);
        Key := 0;
      end;
    end else if (Shift = [ssCtrl, ssShift]) then // Superscript
    begin
      if Key in [Ord('0') .. Ord('9')] then
      begin
        if Key = Ord('1') then
          PostMessage(ActiveControl.HANDLE, WM_CHAR, $00B9, 0)
        else if Key = Ord('2') then
          PostMessage(ActiveControl.HANDLE, WM_CHAR, $00B2, 0)
        else if Key = Ord('3') then
          PostMessage(ActiveControl.HANDLE, WM_CHAR, $00B3, 0)
        else
          PostMessage(ActiveControl.HANDLE, WM_CHAR, $2070 + (Key - Ord('0')), 0);
        Key := 0;
      end;
    end;
  end;
end;

Amateurprofi 12. Jun 2023 02:00

AW: Tastatureingabe umwandeln
 
Was hältst Du hiervon?
Delphi-Quellcode:
procedure TMyForm.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
const
   Superscript:Array[Ord('0')..Ord('9')] of Word=
      ($2070,$00B9,$00B2,$00B3,$2074,$2075,$2076,$2077,$2078,$2079);
begin
  inherited;
  if (ActiveControl is TEdit) and (Key in [Ord('0') .. Ord('9')]) then
  begin
    if (Shift = [ssCtrl]) then Key:=$2080 + (Key - Ord('0'))
      else if (Shift = [ssCtrl, ssShift]) then Key:=SuperScript[Key]
        else Exit;
    PostMessage(ActiveControl.HANDLE, WM_CHAR, Key, 0);
    Key:=0;
  end;
end;

BigAl 12. Jun 2023 06:12

AW: Tastatureingabe umwandeln
 
Zitat:

Zitat von Amateurprofi (Beitrag 1523280)
Was hältst Du hiervon?
Delphi-Quellcode:
procedure TMyForm.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
const
   Superscript:Array[Ord('0')..Ord('9')] of Word=
      ($2070,$00B9,$00B2,$00B3,$2074,$2075,$2076,$2077,$2078,$2079);
begin
  inherited;
  if (ActiveControl is TEdit) and (Key in [Ord('0') .. Ord('9')]) then
  begin
    if (Shift = [ssCtrl]) then Key:=$2080 + (Key - Ord('0'))
      else if (Shift = [ssCtrl, ssShift]) then Key:=SuperScript[Key]
        else Exit;
    PostMessage(ActiveControl.HANDLE, WM_CHAR, Key, 0);
    Key:=0;
  end;
end;

Ist schön kompakt :thumb:.

BigAl 12. Jun 2023 06:21

AW: Tastatureingabe umwandeln
 
Mir ist eben noch aufgefallen, das Shift-Ctrl-0 nicht funktioniert. Das wird wohl schon von Windows abgefangen: Siehe hier

Frickler 12. Jun 2023 10:44

AW: Tastatureingabe umwandeln
 
Ist das nicht eher ein Fall für "OnShortCut"?
Code:
procedure TForm1.FormShortCut(var Msg: TWMKey; var Handled: Boolean);
begin
  if ActiveControl is TEdit then
  begin
    if (Msg.CharCode = Ord('2')) and (ssCtrl in KeyDataToShiftState(Msg.KeyData)) then begin
      PostMessage(ActiveControl.Handle, WM_CHAR, $2082, 0);
      Handled := true;
    end;
  end;
end;
"Handled := true;" sorgt dafür, dass die Meldung nicht an OnKeyDown und folgende weitergeleitet wird.

BigAl 12. Jun 2023 10:45

AW: Tastatureingabe umwandeln
 
Zitat:

Zitat von Frickler (Beitrag 1523297)
Ist das nicht eher ein Fall für "OnShortCut"?
Code:
procedure TForm1.FormShortCut(var Msg: TWMKey; var Handled: Boolean);
begin
  if ActiveControl is TEdit then
  begin
    if (Msg.CharCode = Ord('2')) and (ssCtrl in KeyDataToShiftState(Msg.KeyData)) then begin
      PostMessage(ActiveControl.Handle, WM_CHAR, $2082, 0);
      Handled := true;
    end;
  end;
end;
"Handled := true;" sorgt dafür, dass die Meldung nicht an OnKeyDown und folgende weitergeleitet wird.

Hmm. Habe ich ehrlich gesagt noch nie verwendet. Schaue ich mir mal an. Danke!

BigAl 12. Jun 2023 11:00

AW: Tastatureingabe umwandeln
 
Ja, ist besser:
Delphi-Quellcode:
procedure TMyForm.FormShortCut(var Msg: TWMKey; var Handled: Boolean);
const
  SUPERSCRIPT: Array [Ord('0') .. Ord('9')] of Word =
    ($2070, $00B9, $00B2, $00B3, $2074, $2075, $2076, $2077, $2078, $2079);
var
  Key: Word;
begin
  if (ActiveControl is TEdit) then
  begin
    Key := Msg.CharCode;
    if (Key in [Ord('0') .. Ord('9')]) then
    begin
      if (KeyDataToShiftState(Msg.KeyData) = [ssCtrl]) then
        Key := $2080 + (Key - Ord('0'))
      else if (KeyDataToShiftState(Msg.KeyData) = [ssAlt]) then
        Key := SUPERSCRIPT[Key]
      else
        Exit;

      PostMessage(ActiveControl.Handle, WM_CHAR, Key, 0);
      Handled := True;
    end;
  end;
end;
Der Vorteil dabei ist, dass man das KeyPreview des Formulars nicht setzen muss...

Amateurprofi 12. Jun 2023 11:14

AW: Tastatureingabe umwandeln
 
Zitat:

Zitat von BigAl (Beitrag 1523283)
Mir ist eben noch aufgefallen, das Shift-Ctrl-0 nicht funktioniert. Das wird wohl schon von Windows abgefangen: Siehe hier

Ja, ist mir auch aufgefalllen. Hab ich nicht erwähnt, weil ich dachte, das läge an meinem Windows 7.
Lösung: Für SuperScript nicht Shift-Ctrl verwenden, sondern Alt.

BigAl 12. Jun 2023 11:30

AW: Tastatureingabe umwandeln
 
Gute Idee. Hab's oben geändert.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:25 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