You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi自定义组件获取应用活动控件名称及焦点切换方案问询

自定义组件中TDBEdit焦点切换问题

我开发了一个自定义组件,其Panel中包含两个TDBEdit控件。需求为:当焦点离开其中一个TDBEdit时,需将焦点切换至另一个,除非特定外部组件获得焦点。在VCL应用中我原本通过以下代码实现:

unit dem;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StrUtils, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Edit1: TEdit;
    Edit2: TEdit;
    Memo1: TMemo;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    procedure Edit2Exit(Sender: TObject);
    procedure Edit1Exit(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Edit1Exit(Sender: TObject);
begin
  if AnsiContainsStr(Memo1.Text, Screen.ActiveControl.Name) = True then Exit
  else Edit2.SetFocus;
end;

procedure TForm1.Edit2Exit(Sender: TObject);
begin
  Edit1.SetFocus;
end;
end.

这段代码可实现两个Edit间的焦点切换,仅当点击Button2时例外。但在自定义组件中,我用TStrings(TStringList)替代了Memo1,且Edit为TDBEdit,此时Screen.ActiveControl.Name无法生效,我需要获取应用活动控件名称以复用上述逻辑,恳请提供解决方案。

环境:Windows 11、Delphi 7


补充说明

听取Andreas Rejbrand和Remy Lebeau关于OnExit的建议后,我重新考量,决定放弃该组件思路,改用以下代码解决切换问题:

unit dem;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StrUtils, StdCtrls, TypInfo, ExtCtrls;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Edit1: TEdit;
    Edit2: TEdit;
    Memo1: TMemo;
    EnterData: TButton;
    Button2: TButton;
    Button3: TButton;
    procedure EnterDataClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure ToggleTab(ACont:TWinControl;yorn:Boolean);
var
  x:Integer;
procedure HasTextProp(AControl: TControl; yorn:boolean);
begin
  if IsPublishedProp(AControl, 'TabStop') = True then (AControl as TWinControl).TabStop := yorn;
end;
begin
     for x:=0 to ACont.ControlCount-1 do
    begin
      HasTextProp(ACont.Controls[x],yorn);
    end;
end;

procedure TForm1.EnterDataClick(Sender: TObject);
begin
  ToggleTab(Form1,False);
  Edit1.TabStop:=True;
  Edit2.TabStop:= True;
  Edit1.SetFocus;
end;

end.

后续将使用OnActiveControlChange管理流程。感谢各位的建议,我已了解不应如此使用OnExit。


内容的提问来源于stack exchange,提问作者Learning

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 07:00:57