Delphi 将键重新映射为多字符
Delphi remap key to multi characters
我希望当我按下 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' 重新映射到 TEdit
框的多个字符?
你确实不能"remap"
但您可以终止该特定字符(将其设置为 #0)并使用标准 Windows 消息传递 API(SendMessage,而非 PostMessage)注入所需的零
- https://msdn.microsoft.com/en-us/library/windows/desktop/ms646276.aspx
- http://docwiki.embarcadero.com/CodeExamples/Seattle/en/TControlPerform_(Delphi)
- 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' ), 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
事件,而不是父 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'), 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;
我希望当我按下 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' 重新映射到 TEdit
框的多个字符?
你确实不能"remap"
但您可以终止该特定字符(将其设置为 #0)并使用标准 Windows 消息传递 API(SendMessage,而非 PostMessage)注入所需的零
- https://msdn.microsoft.com/en-us/library/windows/desktop/ms646276.aspx
- http://docwiki.embarcadero.com/CodeExamples/Seattle/en/TControlPerform_(Delphi)
- 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' ), 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
事件,而不是父 TForm
的 OnKeyPress
事件。将Key
参数设置为#0吞掉它,然后在TEdit
:
'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;