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
相关产品推荐
相关产品推荐

