use*_*105 4 delphi keypress delphi-2009
在我的TEdit字段中,我在表单中有文本<number1>..<number2>.
我的想法是:
当用户使用TAB另一个控件输入控件时,number1将被选中.
当我的TEdit控件有焦点并且用户TAB再次按下时,我想要number2选择并number1取消选择.
如果当前插入位置位于number2所在的位置,则按下TAB应该正常并将焦点移动到表单上的下一个控件.
我有2个问题.
当"编辑"字段已激活时,我无法按下Tab键.我只能在输入/聚焦此控件时捕获它.
我不知道是否有类似于#0的键,所以我可以把钥匙变成NoOP.
有什么想法,怎么做?
klu*_*udg 13
您最好编写自己的TEdit后代来处理WM_GETDLGCODE消息.一般的想法是:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TMyEdit = class(TEdit)
procedure WMGetDlgCode(var Message: TWMGetDlgCode); message WM_GETDLGCODE;
end;
type
TForm1 = class(TForm)
Edit2: TEdit;
procedure FormCreate(Sender: TObject);
procedure FormKeyPress(Sender: TObject; var Key: Char);
private
{ Private declarations }
FMyEdit: TMyEdit;
FDone: Boolean;
procedure MyEditEnter(Sender: TObject);
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TMyEdit }
procedure TMyEdit.WMGetDlgCode(var Message: TWMGetDlgCode);
begin
inherited;
Message.Result:= Message.Result or DLGC_WANTTAB;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
FMyEdit:= TMyEdit.Create(Self);
FMyEdit.Left:= 40;
FMyEdit.Top:= 40;
FMyEdit.Parent:= Self;
FMyEdit.Text:= '45..90';
FMyEdit.OnEnter:= MyEditEnter;
KeyPreview:= True;
end;
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
if (Key = #9) and (ActiveControl = FMyEdit) then begin
if FDone then begin
Perform(CM_DialogKey, VK_TAB, 0);
end
else begin
FMyEdit.SelStart:= 4;
FMyEdit.SelLength:= 2;
end;
FDone:= not FDone;
Key:= #0;
end;
end;
procedure TForm1.MyEditEnter(Sender: TObject);
begin
FDone:= False;
FMyEdit.SelStart:= 0;
FMyEdit.SelLength:= 2;
end;
end.
Run Code Online (Sandbox Code Playgroud)
更新:没有制作TEdit后代类的相同想法:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
procedure Edit2Enter(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormKeyPress(Sender: TObject; var Key: Char);
private
{ Private declarations }
FDone: Boolean;
FOldWndProc: TWndMethod;
procedure Edit2WindowProc(var Message: TMessage);
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Edit2Enter(Sender: TObject);
begin
FDone:= False;
Edit2.SelStart:= 0;
Edit2.SelLength:= 2;
end;
procedure TForm1.Edit2WindowProc(var Message: TMessage);
begin
if Message.Msg = WM_GETDLGCODE then
Message.Result:= Message.Result or DLGC_WANTTAB
else
if Assigned(FOldWndProc) then FOldWndProc(Message);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
KeyPreview:= True;
Edit2.Text:= '45..90';
FOldWndProc:= Edit2.WindowProc;
Edit2.WindowProc:= Edit2WindowProc;
end;
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
if (Key = #9) and (ActiveControl = Edit2) then begin
if FDone then begin
Perform(CM_DialogKey, VK_TAB, 0);
end
else begin
Edit2.SelStart:= 4;
Edit2.SelLength:= 2;
end;
FDone:= not FDone;
Key:= #0;
end;
end;
end.
Run Code Online (Sandbox Code Playgroud)