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