gpt4 book ai didi

delphi - 如何在 TEdit 控件中捕获 VK_TAB 键而不让它失去焦点?

转载 作者:行者123 更新时间:2023-12-03 15:18:07 24 4
gpt4 key购买 nike

在我的 TEdit 字段中,我的文本格式为 <number1>..<number2> .

我的想法是:

当用户使用 TAB 从另一个控件进入该控件时,number1被选中。

当我的 TEdit 控件获得焦点并且用户再次按 TAB 时,我想要 number2被选中并 number1取消选择。

如果当前插入符位置位于 number2 所在的位置,则按 TAB 应该正常运行并将焦点移动到窗体上的下一个控件。

我有 2 个问题。

  1. 当“编辑”字段已处于事件状态时,我无法捕捉到按 Tab 键的情况。我只能在输入/聚焦此控件时捕获它。

  2. 我不知道是否有类似于#0的 key ,所以我可以将 key 变成NoOP。

有什么想法,怎么做吗?

最佳答案

您最好编写自己的 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.

更新:相同的想法,无需创建 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.

关于delphi - 如何在 TEdit 控件中捕获 VK_TAB 键而不让它失去焦点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2363456/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com