使用 RTTI 设置组件焦点

Set component focus with RTTI

是否可以通过Rtti达到任意控制焦点属性?如果控件为空,我想要的是将其值设置为 True。 任何帮助将不胜感激。

procedure SetFirstEmptyCtrlFocused;

  function HasTextProp(aControl: TControl): Boolean;
  var
    Ctx: TRttiContext;
    Prop: TRttiProperty;
  begin
    Prop := lCtx.GetType(aControl.ClassType).GetProperty('Text');
    Result := (Prop <> nil) and (Prop.Visibility in [mvPublic, mvPublished]) 
      and (Prop.GetValue(aControl).ToString = '');
  end;

var
  ObjList: TObjectList<TControl>;
  objIdx: Integer;
  Ctrl: TControl;

begin
  ObjList := TObjectList<TControl>.Create;
  ObjList.Add(cxTextEdit1);
  ObjList.Add(cxDateEdit1);
  ObjList.Add(cxTextEdit2);

  for objIdx := 0 to lObjList.Count -1 do
  begin
    Ctrl := lObjList.Items[objIdx];

    if HasTextProp(lCtrl) then
    begin
      SetCtrlFocused //...??
      Break;
    end;
  end;   
end;  

不是每个TControl都能获得焦点,只有TWinControl可以。因此,而不是 TControl 使用 TWinControl 并使用它的方法 SetFocus:

procedure SetFirstEmptyWinCtrlFocused;

  function HasTextProp(aControl: TWinControl): Boolean;
  var
    Ctx: TRttiContext;
    Prop: TRttiProperty;
  begin
    Prop := Ctx.GetType(aControl.ClassType).GetProperty('Text');
    Result := (Prop <> nil) and (Prop.Visibility in [mvPublic, mvPublished]) 
      and (Prop.GetValue(aControl).ToString = '');
  end;

var
  ObjList: TObjectList<TWinControl>;
  objIdx: Integer;
  Ctrl: TWinControl;

begin
  ObjList := TObjectList<TWinControl>.Create;
  ObjList.Add(cxTextEdit1);
  ObjList.Add(cxDateEdit1);
  ObjList.Add(cxTextEdit2);

  for objIdx := 0 to lObjList.Count -1 do
  begin
    Ctrl := lObjList.Items[objIdx];

    if HasTextProp(Ctrl) then
    begin
      Ctrl.SetFocus;
      Break;
    end;
  end;   
end;