检查Component是否具有文本属性

时间:2018-02-02 14:33:03

标签: delphi delphi-xe

如何检查组件是否具有文本属性。当我读到Rtti将是一个很好的解决方案,但我之前没有使用它。任何帮助将不胜感激。

function HasTextProp(aControl: TControl): Boolean;
begin
  Result := False;
  if (aComponent is ?) then
     Exit(True);
end;

var
  ObjList: TObjectList<TControl>;
  ObjIdx: Integer;
begin
   ObjList := TObjectList<TControl>.Create,
   ObjList.Add(comp1); {is TcxButton}
   ObjList.Add(comp2); {is Tedit}
   ObjList.Add(comp3); {is TDateTimeEdit}

  for ObjIdx := 0 to lObjList.Count -1 do
  begin
    if HasTextProp(lObjList.Items[ObjIdx]) then
      do something...
  end;
end;

2 个答案:

答案 0 :(得分:10)

例如已发布属性:

uses
  System.TypInfo;

function HasTextProp(AControl: TControl): Boolean;
begin
  Result := IsPublishedProp(AControl, 'Text');
end;

答案 1 :(得分:3)

维多利亚向您展示了如何使用旧式RTTI实现目标,旧式RTTI仅适用于已发布的属性,而不适用于其他任何内容。在Delphi 2010及更高版本中,有一种新型RTTI可以与几乎所有东西(私有/受保护/公共/已发布,属性,数据成员等)一起使用,也可以实现您的目标,例如:

uses
  ..., System.TypInfo, System.Rtti;

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

TRttiPropertyGetValue()SetValue()方法,例如:

var
  Ctrl: TControl
  Ctx: TRttiContext;
  Prop: TRttiProperty;
begin
  ...
  Ctrl := lObjList.Items[ObjIdx];
  Prop := Ctx.GetType(Ctrl.ClassType).GetProperty('Text');
  if (Prop <> nil) and (Prop.Visibility in [mvPublic, mvPublished]) then
  begin
    if Prop.GetValue(Ctrl).IsEmpty then
      Prop.SetValue(Ctrl, 'Not Empty Anymore!');
  end;
  ...
end;