Delphi将键重映射为多个字符

时间:2016-05-25 21:21:29

标签: delphi delphi-7 keyboard-events vcl

我希望当我按下Mm字符时,000000会在特定的TEdit框中输入内容:

procedure Tfrm.FormKeyPress(Sender: TObject; var Key: Char) ;
var
  i : integer;
begin
  if Key in ['m'] + ['M'] then Key := '0';
end;

使用此代码,我可以重新映射“M' M'单个字符的关键。我怎样才能重新制作' M'一个TEdit框的多个字符?

3 个答案:

答案 0 :(得分:4)

使用FloatingActionButton本身的OnKeyPress事件,而不是父TEdit的{​​{1}}事件。将OnKeyPress参数设置为#0以将其吞下,然后将6个单独的TForm个字符插入Key

'0'

可替换地:

TEdit

答案 1 :(得分:2)

你不能"重新映射"确实

但你可以杀死那个特定的char(设置为#0)并使用标准的Windows Messaging API(SendMessage,而不是PostMessage)注入所需的零

沿着这些方向:

procedure Tfrm.FormKeyPress(Sender: TObject; var Key: Char);
var i : integer;
begin
    if ActiveControl = Edit1 then
      if Key in ['m'] + ['M'] then begin 
         Key := #0; // zero-out the real key so it would not be handled by the editbox
         for i := 1 to 6 do
             ActiveControl.Perform( WM_CHAR, Ord( '0' ), $80000001);
             // or you may reference the specific editbox directly
             //  like Edit1.Perform(....);
      end;
end;

这还需要设置表单来拦截其控件的键。

http://docwiki.embarcadero.com/Libraries/XE2/en/Vcl.Forms.TCustomForm.KeyPreview

如果你想一次劫持几个编辑框,这是有道理的。如果不是,你会更好地改编编辑框本身的事件,而不是形式的事件。

procedure Tfrm.Edit1KeyPress(Sender: TObject; var Key: Char);
var i : integer;
begin
   if Key in ['m'] + ['M'] then begin 
      Key := ^@; // zero-out the real key so it would not be handled by the editbox
      for i := 1 to 6 do
          Edit1.Perform( WM_CHAR, Ord( '0' ), $80000001);
          // or you may reference the specific editbox directly
          //  like Edit1.Perform(....);
   end;
end;

答案 2 :(得分:1)

如果您希望为所有TEdits装备此行为,请将所有其他TEdits KeyPress个事件设为Edit1KeyPress

procedure Tfrm.Edit1KeyPress(Sender: TObject; var Key: Char);
var
xEdit: TEdit;
begin
if Key in ['m','M'] then begin
       Key := #0;
       xEdit := Sender as TEdit;
       xEdit.Text := xEdit.Text +'000000';
    end;
end;

或简短版

procedure Tfrm.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if Key in ['m','M'] then begin
   Key := #0;
   TEdit(Sender).Text := TEdit(Sender).Text+'000000';
end;
end;