我希望当我按M
或m
字符时,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
事件,而不是父TForm
的OnKeyPress
事件。 将 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;