检查组件是否有文本 属性

Checking if Component has a Text Property

如何检查组件是否有文本 属性。正如我所读,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;

例如已发布属性:

uses
  System.TypInfo;

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

Victoria 向您展示了如何使用旧式 RTTI 实现您的目标,它仅适用于已发布的属性,而不能用于其他任何内容。在 Delphi 2010 及之后的版本中,有一种新式的 RTTI 几乎适用于所有内容(private/protected/public/published、属性、数据成员等),也可以实现您的目标,例如:

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;