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

能否通过RTTI访问控件Focus属性并在控件为空时设置焦点?

使用RTTI为内容为空的控件设置焦点

当然可以用RTTI实现你的需求!不过先澄清一个小细节:Delphi里大多数可视化控件并没有可写的Focus属性——HasFocus是只读属性,用来判断控件是否处于焦点状态;而设置焦点需要调用SetFocus方法。不过借助RTTI,我们可以轻松完成「检查内容为空→设置焦点」的逻辑,下面是具体实现方案:

1. 准备工作

首先确保你的项目引用了RTTI单元,这是Delphi自带的标准单元,不需要额外依赖。

2. 核心实现代码

下面的通用方法可以接收任意TControl子类控件,通过RTTI检查它的内容是否为空,如果是则调用SetFocus方法:

uses
  RTTI, Controls, StdCtrls;

procedure SetFocusToEmptyControl(AControl: TControl);
var
  LRTTIContext: TRttiContext;
  LRTTIObjType: TRttiType;
  LTextProp: TRttiProperty;
  LSetFocusMethod: TRttiMethod;
  LCanFocusProp: TRttiProperty;
  LContent: string;
begin
  if not Assigned(AControl) then Exit;

  LRTTIContext := TRttiContext.Create;
  try
    LRTTIObjType := LRTTIContext.GetType(AControl.ClassType);

    // 读取控件的Text属性(大多数输入类控件都有这个属性)
    LTextProp := LRTTIObjType.GetProperty('Text');
    if Assigned(LTextProp) then
    begin
      LContent := Trim(LTextProp.GetValue(AControl).AsString);
      if LContent = '' then
      begin
        // 先检查控件是否可以获取焦点
        LCanFocusProp := LRTTIObjType.GetProperty('CanFocus');
        if Assigned(LCanFocusProp) and LCanFocusProp.GetValue(AControl).AsBoolean then
        begin
          // 调用SetFocus方法设置焦点
          LSetFocusMethod := LRTTIObjType.GetMethod('SetFocus');
          if Assigned(LSetFocusMethod) then
          begin
            LSetFocusMethod.Invoke(AControl, []);
          end;
        end;
      end;
    end;
  finally
    LRTTIContext.Free;
  end;
end;

3. 使用示例

比如你想遍历窗体上的所有控件,给第一个内容为空的输入控件设置焦点,可以这样写:

procedure TForm1.btnCheckEmptyControlsClick(Sender: TObject);
var
  I: Integer;
  Ctrl: TControl;
begin
  for I := 0 to ComponentCount - 1 do
  begin
    if Components[I] is TControl then
    begin
      Ctrl := TControl(Components[I]);
      SetFocusToEmptyControl(Ctrl);
      // 如果找到第一个获得焦点的控件,就停止遍历
      if Ctrl.HasFocus then Break;
    end;
  end;
end;

4. 扩展说明

  • 如果需要支持其他类型的控件(比如数据感知控件TDBEdit),可以扩展逻辑:判断控件类型后,通过RTTI读取Field.Value来检查是否为空。
  • 你可以根据需求修改内容检查的规则,比如不仅检查空字符串,还可以检查全空格的情况(代码里已经用了Trim处理)。
  • 对于没有Text属性的控件,可以添加额外的属性判断逻辑,比如TCheckBox的Checked状态(不过这类控件通常不需要内容为空的焦点设置)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:36:57