德尔福将密钥重新映射到多字符



我希望当我按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"键重新映射到单个字符。 如何将TEdit框的"M"重新映射到多个字符?

使用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'), $80000001);
  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;

你确实不能"重新映射"

但您可以杀死该特定字符(将其设置为 #0)并使用标准 Windows 消息传递 API(SendMessage,而不是 PostMessage)注入所需的零

  • https://msdn.microsoft.com/en-us/library/windows/desktop/ms646276.aspx
  • http://docwiki.embarcadero.com/CodeExamples/Seattle/en/TControlPerform_(德尔福)
  • http://docwiki.embarcadero.com/Libraries/Seattle/en/Vcl.Controls.TControl.Perform

大致如下:

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;

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

最新更新