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;
Man sollte nie so viel zu tun haben, dass man zum Nachdenken keine Zeit mehr hat. (G.C. Lichtenberg)