使用RTTI设置组件焦点

时间:2018-02-04 10:41:53

标签: delphi delphi-10.1-berlin

是否可以通过Rtti获得任何控制Focus属性?我想要的是如果控件为空,则将其值设置为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;  

1 个答案:

答案 0 :(得分:3)

并非每个 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;