我希望当我按下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' M'单个字符的关键。我怎样才能重新制作' M'一个TEdit
框的多个字符?
答案 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;