Delphi 将键重新映射为多字符

Delphi remap key to multi characters

我希望当我按下 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' 重新映射到 TEdit 框的多个字符?

你确实不能"remap"

但您可以终止该特定字符(将其设置为 #0)并使用标准 Windows 消息传递 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' ), 000001);
             // 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' ), 000001);
          // or you may reference the specific editbox directly
          //  like Edit1.Perform(....);
   end;
end;

使用 TEdit 本身的 OnKeyPress 事件,而不是父 TFormOnKeyPress 事件。将Key参数设置为#0吞掉它,然后在TEdit:

中插入6个单独的'0'字符
procedure Tfrm.Edit1KeyPress(Sender: TObject; var Key: Char);
var
  i : integer;
begin
  if Key in ['m', 'M'] then
  begin
    Key := #0;
    for I := 1 to 6 do
      Edit1.Perform(WM_CHAR, Ord('0'), 000001);
  end;
end;

或者:

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

如果您希望为所有 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;