![]() |
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:
Oder vollständig für alle tiefgestellten Zahlen (mit Ctrl+<Zahl>) und alle hochgestellten Zahlen (mit Ctrl+Shift+<Zahl>):
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;
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; |
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; |
AW: Tastatureingabe umwandeln
Zitat:
|
AW: Tastatureingabe umwandeln
Mir ist eben noch aufgefallen, das Shift-Ctrl-0 nicht funktioniert. Das wird wohl schon von Windows abgefangen: Siehe
![]() |
AW: Tastatureingabe umwandeln
Ist das nicht eher ein Fall für "OnShortCut"?
Code:
"Handled := true;" sorgt dafür, dass die Meldung nicht an OnKeyDown und folgende weitergeleitet wird.
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; |
AW: Tastatureingabe umwandeln
Zitat:
|
AW: Tastatureingabe umwandeln
Ja, ist besser:
Delphi-Quellcode:
Der Vorteil dabei ist, dass man das KeyPreview des Formulars nicht setzen muss...
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; |
AW: Tastatureingabe umwandeln
Zitat:
Lösung: Für SuperScript nicht Shift-Ctrl verwenden, sondern Alt. |
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