如何检查组件是否具有文本属性。当我读到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;
答案 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;
TRttiProperty
有GetValue()
和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;